|
Lines 286-308
sub _update_subfield {
Link Here
|
| 286 |
|
286 |
|
| 287 |
if (@fields) { |
287 |
if (@fields) { |
| 288 |
unless ($dont_erase) { |
288 |
unless ($dont_erase) { |
| 289 |
@values = ( $values[0] ) x scalar(@fields) |
289 |
|
| 290 |
if @values == 1; |
290 |
# If we have only one value, apply it to all fields |
| 291 |
foreach my $field (@fields) { |
291 |
if ( @values == 1 ) { |
| 292 |
$field->update( "$subfieldName" => $values[ $i++ ] ); |
292 |
foreach my $field (@fields) { |
|
|
293 |
$field->update( "$subfieldName" => $values[0] ); |
| 294 |
} |
| 295 |
} else { |
| 296 |
|
| 297 |
# For multiple values, we need to handle this differently to maintain order |
| 298 |
# First, update existing fields one-to-one with values |
| 299 |
my $values_per_field = scalar(@values) / scalar(@fields); |
| 300 |
my $remainder = scalar(@values) % scalar(@fields); |
| 301 |
|
| 302 |
if ( scalar(@values) <= scalar(@fields) ) { |
| 303 |
|
| 304 |
# We have fewer or equal values than fields - update sequentially |
| 305 |
for my $i ( 0 .. $#values ) { |
| 306 |
$fields[$i]->update( "$subfieldName" => $values[$i] ); |
| 307 |
} |
| 308 |
|
| 309 |
# Remove extra fields if we have more fields than values |
| 310 |
for my $i ( scalar(@values) .. $#fields ) { |
| 311 |
$fields[$i]->delete_subfield( code => $subfieldName ); |
| 312 |
|
| 313 |
# Remove field entirely if it has no subfields left |
| 314 |
$record->delete_field( $fields[$i] ) unless $fields[$i]->subfields(); |
| 315 |
} |
| 316 |
} else { |
| 317 |
|
| 318 |
# We have more values than fields |
| 319 |
# Update existing fields first |
| 320 |
for my $i ( 0 .. $#fields ) { |
| 321 |
$fields[$i]->update( "$subfieldName" => $values[$i] ); |
| 322 |
} |
| 323 |
|
| 324 |
# Create new fields for remaining values, inserting them in the right position |
| 325 |
for my $i ( scalar(@fields) .. $#values ) { |
| 326 |
my $new_field = MARC::Field->new( $fieldName, '', '', "$subfieldName" => $values[$i] ); |
| 327 |
|
| 328 |
# Insert after the last existing field of this type |
| 329 |
my $last_field = $fields[-1]; |
| 330 |
$record->insert_fields_after( $last_field, $new_field ); |
| 331 |
} |
| 332 |
} |
| 293 |
} |
333 |
} |
| 294 |
} |
334 |
} else { |
| 295 |
if ( $i <= scalar(@values) - 1 ) { |
335 |
|
|
|
336 |
# dont_erase is true (copy mode), add values to existing fields without erasing |
| 296 |
foreach my $field (@fields) { |
337 |
foreach my $field (@fields) { |
| 297 |
foreach my $j ( $i .. scalar(@values) - 1 ) { |
338 |
foreach my $value (@values) { |
| 298 |
$field->add_subfields( "$subfieldName" => $values[$j] ); |
339 |
$field->add_subfields( "$subfieldName" => $value ); |
| 299 |
} |
340 |
} |
| 300 |
} |
341 |
} |
| 301 |
} |
342 |
} |
| 302 |
} else { |
343 |
} else { |
| 303 |
## Field does not exist, create it. |
344 |
## Field does not exist, create it. |
| 304 |
foreach my $value (@values) { |
345 |
foreach my $value (@values) { |
| 305 |
my $field = MARC::Field->new( $fieldName, '', '', "$subfieldName" => $values[ $i++ ] ); |
346 |
my $field = MARC::Field->new( $fieldName, '', '', "$subfieldName" => $value ); |
| 306 |
$record->insert_fields_ordered($field); |
347 |
$record->insert_fields_ordered($field); |
| 307 |
} |
348 |
} |
| 308 |
} |
349 |
} |
| 309 |
- |
|
|