X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=reports%2Fcatalogue_stats.pl;h=3addbe77e0859a2db310390bea7480cf23d06491;hb=d141fac8352ce884e02582066e106733d35f2b4f;hp=aacc7cef66ec2295774822c4977451a593cb47b8;hpb=49ee6854f2a8a0e5c05d07e1c4dfd401b6a14ad0;p=koha.git diff --git a/reports/catalogue_stats.pl b/reports/catalogue_stats.pl index aacc7cef66..3addbe77e0 100755 --- a/reports/catalogue_stats.pl +++ b/reports/catalogue_stats.pl @@ -1,6 +1,5 @@ #!/usr/bin/perl -# $Id$ # Copyright 2000-2002 Katipo Communications # @@ -23,12 +22,10 @@ use strict; use C4::Auth; use CGI; use C4::Context; -use HTML::Template; -use C4::Search; +use C4::Branch; # GetBranches use C4::Output; use C4::Koha; -use C4::Interface::CGI::Output; -use C4::Circulation::Circ2; +use C4::Circulation; =head1 NAME @@ -36,31 +33,31 @@ plugin that shows a stats on borrowers =head1 DESCRIPTION - -=over2 +=over 2 =cut +our $debug = 0; my $input = new CGI; -my $do_it=$input->param('do_it'); my $fullreportname = "reports/catalogue_stats.tmpl"; -my $line = $input->param("Line"); -my $column = $input->param("Column"); -my @filters = $input->param("Filter"); +my $do_it = $input->param('do_it'); +my $line = $input->param("Line"); +my $column = $input->param("Column"); +my @filters = $input->param("Filter"); my $deweydigits = $input->param("deweydigits"); -my $lccndigits = $input->param("lccndigits"); -my $cotedigits = $input->param("cotedigits"); -my $output = $input->param("output"); -my $basename = $input->param("basename"); -my $mime = $input->param("MIME"); -my $del = $input->param("sep"); +my $lccndigits = $input->param("lccndigits"); +my $cotedigits = $input->param("cotedigits"); +my $output = $input->param("output"); +my $basename = $input->param("basename"); +my $mime = $input->param("MIME"); +my $del = $input->param("sep"); my ($template, $borrowernumber, $cookie) = get_template_and_user({template_name => $fullreportname, query => $input, type => "intranet", authnotrequired => 0, - flagsrequired => {editcatalogue => 1}, + flagsrequired => {reports => 1}, debug => 1, }); $template->param(do_it => $do_it); @@ -71,16 +68,18 @@ if ($do_it) { output_html_with_http_headers $input, $cookie, $template->output; exit(1); } else { - print $input->header(-type => 'application/vnd.sun.xml.calc', -name=>"$basename.csv" ); - my $cols = @$results[0]->{loopcol}; + print $input->header(-type => 'application/vnd.sun.xml.calc', + -encoding => 'utf-8', + -attachment=>"$basename.csv", + -name=>"$basename.csv" ); + my $cols = @$results[0]->{loopcol}; my $lines = @$results[0]->{looprow}; - my $sep; - $sep =C4::Context->preference("delimiter"); + my $sep = C4::Context->preference("delimiter"); print @$results[0]->{line} ."/". @$results[0]->{column} .$sep; foreach my $col ( @$cols ) { print $col->{coltitle}.$sep; } - print "\n"; + print "Total\n"; foreach my $line ( @$lines ) { my $x = $line->{loopcell}; print $line->{rowtitle}.$sep; @@ -102,163 +101,86 @@ if ($do_it) { my $dbh = C4::Context->dbh; my @values; my %labels; + my $count=0; my $req; - $req = $dbh->prepare("select distinctrow left(dewey,3) from biblioitems order by dewey"); - $req->execute; - my $hasdewey=1; my @select; - push @select,""; - while (my ($value) =$req->fetchrow) { - $hasdewey =1 if (($value) and (! $hasdewey)); - push @select, $value; - } - my $CGIdewey=CGI::scrolling_list( -name => 'Filter', - -id => 'Filter', - -values => \@select, - -size => 1, - -multiple => 0 ); - - $req = $dbh->prepare( "select distinctrow left(lccn,3) from biblioitems order by lccn"); - $req->execute; - undef @select; - push @select,""; - my $haslccn=1; - my $hlghtlccn; - while (my ($value) =$req->fetchrow) { - $hlghtlccn = !($hasdewey); - $haslccn =1 if (($value) and (! $haslccn)); - push @select, $value; - } - my $CGIlccn=CGI::scrolling_list( -name => 'Filter', - -id => 'Filter', - -values => \@select, - -size => 1, - -multiple => 0 ); - - $req = $dbh->prepare("select distinctrow left(itemcallnumber,5) from items order by itemcallnumber"); - $req->execute; - undef @select; - push @select,""; - my $hascote=1; - my $hlghtcote; - while (my ($value) =$req->fetchrow) { - $hascote =1 if (($value) and (! $hascote)); - $hlghtcote = (($hasdewey) and ($haslccn)) or (!($hasdewey) and !($haslccn)); - push @select, $value; - } - my $CGIcote=CGI::scrolling_list( -name => 'Filter', - -id => 'Filter', - -values => \@select, - -size => 1, - -multiple => 0 ); - - undef @select; - push @select,""; - for (my $i=1950;$i<=2050;$i++) { - push @select, $i; - } - my $CGIpublicationyear=CGI::scrolling_list( -name => 'Filter', - -id => 'Filter', - -values => \@select, - -size => 1, - -multiple => 0 ); + # FIXME: no such field "dewey" + # $req = $dbh->prepare("select count(dewey) from biblioitems "); + # $req->execute; + my $hasdewey = 0; + +# (rch) biblioitems.lccn is mapped to lccn MARC21 010$a in default framework. +# This is not the LC Classification. It's the Control Number. +# So I'm just going to remove this bit. Call Number is handled in itemcallnumber. +# + my $haslccn = 0; +# $req = $dbh->prepare( "select count(lccn) from biblioitems "); +# $req->execute; +# my $hlghtlccn; +# while (my ($value) =$req->fetchrow) { +# $hlghtlccn = !($hasdewey); +# $haslccn =1 if (($value>2) and (! $haslccn)); +# $count++ if (($value) and (! $haslccn)); +# push @select, $value; +# } +# my $CGIlccn=CGI::scrolling_list( -name => 'Filter', +# -id => 'Filter', +# -values => \@select, +# -size => 1, +# -multiple => 0 ); + +# No need to test for data here. If you don't have itemcallnumbers, you probably know it. +# FIXME: Hardcoding to 5 chars on itemcallnum. +# + my $hascote = 1; + my $highcote = 5; - $req = $dbh->prepare("select distinctrow itemtype from biblioitems order by itemtype"); + $req = $dbh->prepare("select itemtype, description from itemtypes order by description"); $req->execute; - undef @select; - push @select,""; - while (my ($value) =$req->fetchrow) { - push @select, $value; + my $CGIitemtype = $req->fetchall_arrayref({}); + + my $authvals = GetKohaAuthorisedValues("items.ccode"); + my @authvals; + foreach (keys %$authvals) { + push @authvals, { code => $_, description => $authvals->{$_} }; } - my $CGIitemtype=CGI::scrolling_list( -name => 'Filter', - -id => 'Filter', - -values => \@select, - -size => 1, - -multiple => 0 ); - $req = $dbh->prepare("select distinctrow publishercode from biblioitems order by publishercode"); - $req->execute; - undef @select; - push @select,""; - while (my ($value) =$req->fetchrow) { - push @select, $value; - } - my $CGIpublisher=CGI::scrolling_list( -name => 'Filter', - -id => 'Filter', - -values => \@select, - -size => 1, - -multiple => 0 ); - undef @select; - push @select,""; - my $branches=getbranches(); - my %select_branches; - $select_branches{""} = ""; - foreach my $branch (keys %$branches) { - push @select, $branch; - $select_branches{$branch} = $branches->{$branch}->{'branchname'}; + my $branches=GetBranches(); + my @branchloop; + foreach (keys %$branches) { + my $thisbranch = ''; # FIXME: populate $thisbranch to preselect one + my %row = (branchcode => $_, + selected => ($thisbranch eq $_ ? 1 : 0), + branchname => $branches->{$_}->{'branchname'}, + ); + push @branchloop, \%row; } - my $CGIbranch=CGI::scrolling_list( -name => 'Filter', - -id => 'Filter', - -values => \@select, - -labels => \%select_branches, - -size => 1, - -multiple => 0 ); - - $req = $dbh->prepare("select distinctrow location from items order by location"); - $req->execute; - undef @select; - push @select,""; - my $CGIlocation=CGI::scrolling_list( -name => 'Filter', - -id => 'Filter', - -values => \@select, - -size => 1, - -multiple => 0 ); - - my @mime = ( C4::Context->preference("MIME") ); - foreach my $mime (@mime){ - warn "".$mime; + + my $locations = GetKohaAuthorisedValues("items.location"); + my @locations; + foreach (sort keys %$locations) { + push @locations, { code => $_, description => "$_ - " . $locations->{$_} }; } - my $CGIextChoice=CGI::scrolling_list( - -name => 'MIME', - -id => 'MIME', - -values => \@mime, - -size => 1, - -multiple => 0 ); - - my @dels = ( C4::Context->preference("delimiter") ); - my $CGIsepChoice=CGI::scrolling_list( - -name => 'sep', - -id => 'sep', - -values => \@dels, - -size => 1, - -multiple => 0 ); + my @mime = ( map { +{type =>$_} } (split /[;:]/,C4::Context->preference("MIME")) ); + my @delim = ( map { +{delim=>$_} } (split //,C4::Context->preference("delimiter")) ); $template->param(hasdewey=>$hasdewey, - CGIFromDeweyClass => $CGIdewey, - CGIToDeweyClass => $CGIdewey, - haslccn=> $haslccn, - hlghtlccn => $hlghtlccn, - CGIFromLoCClass => $CGIlccn, - CGIToLoCClass => $CGIlccn, - hascote=> $hascote, - hlghtcote => $hlghtcote, - CGIFromCoteClass => $CGIcote, - CGIToCoteClass => $CGIcote, + haslccn => $haslccn, + hascote => $hascote, CGIItemType => $CGIitemtype, - CGIFromPublicationYear => $CGIpublicationyear, - CGIToPublicationYear => $CGIpublicationyear, - CGIPublisher => $CGIpublisher, - CGIBranch => $CGIbranch, - CGILocation => $CGIlocation, - CGIextChoice => $CGIextChoice, - CGIsepChoice => $CGIsepChoice + CGIBranch => \@branchloop, + locationloop => \@locations, + authvals => \@authvals, + CGIextChoice => \@mime, + CGIsepChoice => \@delim, ); } output_html_with_http_headers $input, $cookie, $template->output; +## End of Main Body sub calculate { @@ -277,61 +199,62 @@ sub calculate { # Checking filters # my @loopfilter; - for (my $i=0;$i<=11;$i++) { + for (my $i=0;$i<=12;$i++) { my %cell; if ( @$filters[$i] ) { if ((($i==1) or ($i==3) or ($i==5) or ($i==9)) and (@$filters[$i-1])) { $cell{err} = 1 if (@$filters[$i]<@$filters[$i-1]) ; } $cell{filter} .= @$filters[$i]; - $cell{crit} .="Dewey Classification From" if ($i==0); - $cell{crit} .="Dewey Classification To" if ($i==1); - $cell{crit} .="Lccn Classification From" if ($i==2); - $cell{crit} .="Lccn Classification To" if ($i==3); - $cell{crit} .="Cote Classification From" if ($i==4); - $cell{crit} .="Cote Classification To" if ($i==5); - $cell{crit} .="Document type" if ($i==6); - $cell{crit} .="Publisher" if ($i==7); - $cell{crit} .="Publication year From" if ($i==8); - $cell{crit} .="Publication year To" if ($i==9); - $cell{crit} .="Branch :" if ($i==10); - $cell{crit} .="Location:" if ($i==11); + $cell{crit} .= + ($i== 0) ? "Dewey Classification From" : + ($i== 1) ? "Dewey Classification To" : + ($i== 2) ? "Lccn Classification From" : + ($i== 3) ? "Lccn Classification To" : + ($i== 4) ? "Item CallNumber From" : + ($i== 5) ? "Item CallNumber To" : + ($i== 6) ? "Item type" : + ($i== 7) ? "Publisher" : + ($i== 8) ? "Publication year From" : + ($i== 9) ? "Publication year To" : + ($i==10) ? "Library :" : + ($i==11) ? "Shelving Location :" : + ($i==12) ? "Collection Code :" : ''; push @loopfilter, \%cell; } } +# warn map {"filtres $_\n"} @filters[0..3]; + my @linefilter; -# warn "filtres ".@filters[0]; -# warn "filtres ".@filters[1]; -# warn "filtres ".@filters[2]; -# warn "filtres ".@filters[3]; - $linefilter[0] = @$filters[0] if ($line =~ /dewey/ ) ; $linefilter[1] = @$filters[1] if ($line =~ /dewey/ ) ; $linefilter[0] = @$filters[2] if ($line =~ /lccn/ ) ; $linefilter[1] = @$filters[3] if ($line =~ /lccn/ ) ; - $linefilter[0] = @$filters[4] if ($line =~ /items.itemcallnumber/ ) ; - $linefilter[1] = @$filters[5] if ($line =~ /items.itemcallnumber/ ) ; - @linefilter[0] = @$filters[6] if ($line =~ /itemtype/ ) ; - @linefilter[0] = @$filters[7] if ($line =~ /publishercode/ ) ; + $linefilter[0] = @$filters[4] if ($line =~ /items\.itemcallnumber/ ) ; + $linefilter[1] = @$filters[5] if ($line =~ /items\.itemcallnumber/ ) ; + $linefilter[0] = @$filters[6] if ($line =~ /itemtype/ ) ; + $linefilter[0] = @$filters[7] if ($line =~ /publishercode/ ) ; $linefilter[0] = @$filters[8] if ($line =~ /publicationyear/ ) ; $linefilter[1] = @$filters[9] if ($line =~ /publicationyear/ ) ; - @linefilter[0] = @$filters[10] if ($line =~ /items.homebranch/ ) ; - @linefilter[0] = @$filters[11] if ($line =~ /items.location/ ) ; -# + $linefilter[0] = @$filters[10] if ($line =~ /items\.homebranch/ ) ; + $linefilter[0] = @$filters[11] if ($line =~ /items\.location/ ) ; + $linefilter[0] = @$filters[12] if ($line =~ /items\.ccode/ ) ; + my @colfilter ; $colfilter[0] = @$filters[0] if ($column =~ /dewey/ ) ; $colfilter[1] = @$filters[1] if ($column =~ /dewey/ ) ; $colfilter[0] = @$filters[2] if ($column =~ /lccn/ ) ; $colfilter[1] = @$filters[3] if ($column =~ /lccn/ ) ; - $colfilter[0] = @$filters[4] if ($column =~ /itemcallnumber/ ) ; - $colfilter[1] = @$filters[5] if ($column =~ /itemcallnumber/ ) ; - @colfilter[0] = @$filters[6] if ($column =~ /itemtype/ ) ; - @colfilter[0] = @$filters[7] if ($column =~ /publishercode/ ) ; + $colfilter[0] = @$filters[4] if ($column =~ /items\.itemcallnumber/ ) ; + $colfilter[1] = @$filters[5] if ($column =~ /items\.itemcallnumber/ ) ; + $colfilter[0] = @$filters[6] if ($column =~ /itemtype/ ) ; + $colfilter[0] = @$filters[7] if ($column =~ /publishercode/ ) ; $colfilter[0] = @$filters[8] if ($column =~ /publicationyear/ ) ; $colfilter[1] = @$filters[9] if ($column =~ /publicationyear/ ) ; - @colfilter[0] = @$filters[10] if ($column =~ /items.homebranch/ ) ; - @colfilter[0] = @$filters[11] if ($column =~ /items.location/ ) ; + $colfilter[0] = @$filters[10] if ($column =~ /items\.homebranch/ ) ; + $colfilter[0] = @$filters[11] if ($column =~ /items\.location/ ) ; + $colfilter[0] = @$filters[12] if ($column =~ /items\.ccode/ ) ; # 1st, loop rows. my $linefield; @@ -344,10 +267,9 @@ sub calculate { }else { $linefield .= $line; } - - + my $strsth; - $strsth .= "select distinctrow $linefield from biblioitems, items where (items.biblioitemnumber = biblioitems.biblioitemnumber) and $line is not null "; + $strsth .= "select distinctrow $linefield from biblioitems left join items on (items.biblioitemnumber = biblioitems.biblioitemnumber) where $line is not null "; if ( @linefilter ) { if ($linefilter[1]){ $strsth .= " and $line >= ? " ; @@ -358,7 +280,7 @@ sub calculate { } } $strsth .=" order by $linefield"; - warn "". $strsth; + $debug and print STDERR "catalogue_stats SQL: $strsth\n"; my $sth = $dbh->prepare( $strsth ); if (( @linefilter ) and ($linefilter[1])){ @@ -372,8 +294,8 @@ sub calculate { my %cell; if ($celvalue) { $cell{rowtitle} = $celvalue; - } else { - $cell{rowtitle} = ""; +# } else { +# $cell{rowtitle} = ""; } $cell{totalrow} = 0; push @loopline, \%cell; @@ -382,17 +304,21 @@ sub calculate { # 2nd, loop cols. my $colfield; if (($column =~/dewey/) and ($deweydigits)) { - $colfield .="left($column,$deweydigits)"; + $colfield = "left($column,$deweydigits)"; }elsif (($column=~/lccn/) and ($lccndigits)) { - $colfield .="left($column,$lccndigits)"; + $colfield = "left($column,$lccndigits)"; }elsif (($column=~/itemcallnumber/) and ($cotedigits)) { - $colfield .="left($column,$cotedigits)"; + $colfield = "left($column,$cotedigits)"; }else { - $colfield .= $column; + $colfield = $column; } - my $strsth2; - $strsth2 .= "select distinctrow $colfield from biblioitems, items where (items.biblioitemnumber = biblioitems.biblioitemnumber) and $column is not null "; + my $strsth2 = " + SELECT distinctrow $colfield + FROM biblioitems + LEFT JOIN items + ON (items.biblioitemnumber = biblioitems.biblioitemnumber) + WHERE $column IS NOT NULL "; if (( @colfilter ) and ($colfilter[1])) { $strsth2 .= " and $column> ? and $column< ?"; }elsif ($colfilter[0]){ @@ -400,7 +326,7 @@ sub calculate { $strsth2 .= " and $column LIKE ? "; } $strsth2 .= " order by $colfield"; - warn "". $strsth2; + $debug and print STDERR "SQL: $strsth2"; my $sth2 = $dbh->prepare( $strsth2 ); if ((@colfilter) and ($colfilter[1])) { $sth2->execute($colfilter[0],$colfilter[1]); @@ -412,12 +338,15 @@ sub calculate { while (my ($celvalue) = $sth2->fetchrow) { my %cell; my %ft; - $cell{coltitle} = $celvalue; + if ($celvalue) { + $cell{coltitle} = $celvalue; +# } else { +# $cell{coltitle} = ""; + } $ft{totalcol} = 0; push @loopcol, \%cell; } - my $i=0; my @totalcol; my $hilighted=-1; @@ -434,65 +363,114 @@ sub calculate { } # preparing calculation - my $strcalc .= "SELECT $linefield, $colfield, count( * ) FROM biblioitems, items WHERE (items.biblioitemnumber = biblioitems.biblioitemnumber) AND $line is not null AND $column is not null"; - @$filters[0]=~ s/\*/%/g if (@$filters[0]); - $strcalc .= " AND dewey >" . @$filters[0] ."" if ( @$filters[0] ); - @$filters[1]=~ s/\*/%/g if (@$filters[1]); - $strcalc .= " AND dewey <" . @$filters[1] ."" if ( @$filters[1] ); - @$filters[2]=~ s/\*/%/g if (@$filters[2]); - $strcalc .= " AND lccn >" . @$filters[2] ."" if ( @$filters[2] ); - @$filters[3]=~ s/\*/%/g if (@$filters[3]); - $strcalc .= " AND lccn <" . @$filters[3] ."" if ( @$filters[3] ); - @$filters[4]=~ s/\*/%/g if (@$filters[4]); - $strcalc .= " AND items.itemcallnumber >" . @$filters[4] ."" if ( @$filters[4] ); - @$filters[5]=~ s/\*/%/g if (@$filters[5]); - $strcalc .= " AND items.itemcallnumber <" . @$filters[5] ."" if ( @$filters[5] ); - @$filters[6]=~ s/\*/%/g if (@$filters[6]); - $strcalc .= " AND biblioitems.itemtype like '" . @$filters[6] ."'" if ( @$filters[6] ); - @$filters[7]=~ s/\*/%/g if (@$filters[7]); - $strcalc .= " AND biblioitems.publishercode like '" . @$filters[7] ."'" if ( @$filters[7] ); - @$filters[8]=~ s/\*/%/g if (@$filters[8]); - $strcalc .= " AND publicationyear >" . @$filters[8] ."" if ( @$filters[8] ); - @$filters[9]=~ s/\*/%/g if (@$filters[9]); - $strcalc .= " AND publicationyear <" . @$filters[9] ."" if ( @$filters[9] ); - @$filters[10]=~ s/\*/%/g if (@$filters[10]); - $strcalc .= " AND items.homebranch like '" . @$filters[10] ."'" if ( @$filters[10] ); - @$filters[11]=~ s/\*/%/g if (@$filters[11]); - $strcalc .= " AND items.location like '" . @$filters[11] ."'" if ( @$filters[11] ); + my $strcalc .= "SELECT $linefield, $colfield, count(*) FROM biblioitems LEFT JOIN items ON (items.biblioitemnumber = biblioitems.biblioitemnumber) WHERE 1"; + if (@$filters[0]){ + @$filters[0]=~ s/\*/%/g; + $strcalc .= " AND dewey >" . @$filters[0]; + } + if (@$filters[1]){ + @$filters[1]=~ s/\*/%/g ; + $strcalc .= " AND dewey <" . @$filters[1]; + } + if (@$filters[2]){ + @$filters[2]=~ s/\*/%/g ; + $strcalc .= " AND lccn >" . @$filters[2]; + } + if (@$filters[3]){ + @$filters[3]=~ s/\*/%/g; + $strcalc .= " AND lccn <" . @$filters[3]; + } + if (@$filters[4]){ + @$filters[4]=~ s/\*/%/g ; + $strcalc .= " AND items.itemcallnumber >=" . $dbh->quote(@$filters[4]); + } + + if (@$filters[5]){ + @$filters[5]=~ s/\*/%/g; + $strcalc .= " AND items.itemcallnumber <=" . $dbh->quote(@$filters[5]); + } + + if (@$filters[6]){ + @$filters[6]=~ s/\*/%/g; + $strcalc .= " AND " . + (C4::Context::preference('Item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype') + . " LIKE '" . @$filters[6] ."'"; + } + + if (@$filters[7]){ + @$filters[7]=~ s/\*/%/g; + @$filters[7].="%" unless @$filters[7]=~/%/; + $strcalc .= " AND biblioitems.publishercode LIKE \"" . @$filters[7] ."\""; + } + if (@$filters[8]){ + @$filters[8]=~ s/\*/%/g; + $strcalc .= " AND publicationyear >" . @$filters[8]; + } + if (@$filters[9]){ + @$filters[9]=~ s/\*/%/g; + $strcalc .= " AND publicationyear <" . @$filters[9]; + } + if (@$filters[10]){ + @$filters[10]=~ s/\*/%/g; + $strcalc .= " AND items.homebranch LIKE '" . @$filters[10] ."'"; + } + if (@$filters[11]){ + @$filters[11]=~ s/\*/%/g; + $strcalc .= " AND items.location LIKE '" . @$filters[11] ."'"; + } + if (@$filters[12]){ + @$filters[12]=~ s/\*/%/g; + $strcalc .= " AND items.ccode LIKE '" . @$filters[12] ."'"; + } + $strcalc .= " group by $linefield, $colfield order by $linefield,$colfield"; - warn "". $strcalc; + $debug and warn "SQL: $strcalc"; my $dbcalc = $dbh->prepare($strcalc); $dbcalc->execute; - warn "filling table"; +# warn "filling table"; + + my $emptycol; while (my ($row, $col, $value) = $dbcalc->fetchrow) { - warn "filling table $row / $col / $value "; - $table{$row}->{$col}=$value; +# warn "filling table $row / $col / $value "; + $emptycol = 1 if (!defined($col)); + $col = "zzEMPTY" if (!defined($col)); + $row = "zzEMPTY" if (!defined($row)); + + $table{$row}->{$col}+=$value; $table{$row}->{totalrow}+=$value; $grantotal += $value; } + +# my %cell = {rowtitle => 'zzROWEMPTY'}; +# push @loopline,\%cell; +# undef %cell; +# my %cell; +# %cell = {coltitle => "zzEMPTY"}; + push @loopcol,{coltitle => "NULL"} if ($emptycol); foreach my $row ( sort keys %table ) { my @loopcell; #@loopcol ensures the order for columns is common with column titles + # and the number matches the number of columns foreach my $col ( @loopcol ) { - push @loopcell, {value => $table{$row}->{$col->{coltitle}}} ; + my $value =$table{$row}->{($col->{coltitle} eq "NULL")?"zzEMPTY":$col->{coltitle}}; + push @loopcell, {value => $value } ; } - push @looprow,{ 'rowtitle' => $row, + push @looprow,{ 'rowtitle' => ($row eq "zzEMPTY")?"NULL":$row, 'loopcell' => \@loopcell, - 'hilighted' => 1 , + 'hilighted' => ($hilighted *= -1 > 0), 'totalrow' => $table{$row}->{totalrow} }; - $hilighted = -$hilighted; } - warn "footer processing"; +# warn "footer processing"; foreach my $col ( @loopcol ) { my $total=0; foreach my $row ( @looprow ) { - $total += $table{$row->{rowtitle}}->{$col->{coltitle}}; - warn "value added ".$table{$row->{rowtitle}}->{$col->{coltitle}}. "for line ".$row->{rowtitle}; + $total += $table{($row->{rowtitle} eq "NULL")?"zzEMPTY":$row->{rowtitle}}->{($col->{coltitle} eq "NULL")?"zzEMPTY":$col->{coltitle}}; +# warn "value added ".$table{$row->{rowtitle}}->{$col->{coltitle}}. "for line ".$row->{rowtitle}; } - warn "summ for column ".$col->{coltitle}." = ".$total; +# warn "summ for column ".$col->{coltitle}." = ".$total; push @loopfooter, {'totalcol' => $total}; } @@ -511,4 +489,4 @@ sub calculate { return \@mainloop; } -1; \ No newline at end of file +1;