Paul and folks,

MARCgetbiblio is the sub in Biblio.pm that contains the SQL queries that are
supposed to generate a MARC record.  I use it thusly:  
                my $MARCRecord = &MARCgetbiblio($dbh,$bibid);
                my $recordstring=$MARCRecord->as_usmarc();
                
When I use as_usmarc() and I dump the record into a file and test the file
for MARC compatibility with dumpmarc.pl (Paul, did you write this script?)
I get the following:

koha:~# ./dumpmarc.pl -file datatest
Invalid record length "02506" in record 1Invalid record length in record 1: Leader 
says 02506 bytes, but it's actually 2392
Invalid record terminator in record 1
No directory found in record 1
LDR 02506       00517  00100koha:~#

I suspect that the sub MARCgetBiblio is somehow overriding the default behavior
of as_usmarc() and creating a problem with the directory and leader generation:
but that's just a guess.

Here is MARCgetbiblio (I am suspicious of line 6; is it necessary?);

sub MARCgetbiblio {
# Returns MARC::Record of the biblio passed in parameter.
    my ($dbh,$bibid)[EMAIL PROTECTED];
    my $record = MARC::Record->new();
#---- TODO : the leader is missing
        $record->leader('                   ');
    my $sth=$dbh->prepare("select bibid,subfieldid,tag,tagorder,tag_indicator,su
bfieldcode,subfieldorder,subfieldvalue,valuebloblink
                                 from marc_subfield_table
                                 where bibid=? order by tag,tagorder,subfieldcod
e
                         ");
        my $sth2=$dbh->prepare("select subfieldvalue from marc_blob_subfield whe
re blobidlink=?");
        $sth->execute($bibid);
        my $prevtagorder=1;
        my $prevtag='XXX';
        my $previndicator;
        my $field; # for >=10 tags
        my $prevvalue; # for <10 tags
        while (my $row=$sth->fetchrow_hashref) {
                if ($row->{'valuebloblink'}) { #---- search blob if there is one
                        $sth2->execute($row->{'valuebloblink'});
                        my $row2=$sth2->fetchrow_hashref;
                        $sth2->finish;
                        $row->{'subfieldvalue'}=$row2->{'subfieldvalue'};
                }
                if ($row->{tagorder} ne $prevtagorder || $row->{tag} ne $prevtag
) {
                        $previndicator.="  ";
                        if ($prevtag <10) {
                        $record->add_fields((sprintf "%03s",$prevtag),$prevvalue
) unless $prevtag eq "XXX"; # ignore the 1st loop
                        } else {
                                $record->add_fields($field) unless $prevtag eq "
XXX";
                        }
                        undef $field;
                        $prevtagorder=$row->{tagorder};
                        $prevtag = $row->{tag};
                        $previndicator=$row->{tag_indicator};
                        if ($row->{tag}<10) {
                                $prevvalue = $row->{subfieldvalue};
                        } else {
                                $field = MARC::Field->new((sprintf "%03s",$prevt
ag), substr($row->{tag_indicator}.'  ',0,1), substr($row->{tag_indicator}.'  ',1
,1), $row->{'subfieldcode'}, $row->{'subfieldvalue'} );
                        }
                } else {
                        if ($row->{tag} <10) {
                                $record->add_fields((sprintf "%03s",$row->{tag})
, $row->{'subfieldvalue'});
                        } else {
                                $field->add_subfields($row->{'subfieldcode'}, $r
ow->{'subfieldvalue'} );
                        }
                        $prevtag= $row->{tag};
                        $previndicator=$row->{tag_indicator};
                }
        }
        # the last has not been included inside the loop... do it now !
        if ($prevtag <10) {
                $record->add_fields($prevtag,$prevvalue);
        } else {
#               my $field = MARC::Field->new( $prevtag, "", "", %subfieldlist);
                $record->add_fields($field);
        }
        return $record;
}

Joshua


On Fri, Sep 19, 2003 at 09:42:19AM -0500, Ed Summers wrote:
> On Fri, Sep 19, 2003 at 07:58:01PM +0530, Saiful Amin wrote:
> > I never had to worry about the record_length (pos 00-04) or the
> > base_address (pos 12-16) in the leader.  I think they are automagically
> > updated while writing the record via $rec->as_usmarc().
> 
> saiful++
> 
> Yes, they should be automatically calculated when writing the file as marc.
> 
>     print $record->as_usmarc();
> 
> Albeit, this method should really be as_marc() or as_marc21() but there you go
> :)
> 
> //Ed

Reply via email to