Bug 9044: DBRev 3.13.00.036
[koha.git] / reports / catalogue_stats.pl
index 09070ab..c8e2194 100755 (executable)
@@ -19,7 +19,7 @@
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 use strict;
-# use warnings;  # FIXME
+#use warnings; FIXME - Bug 2505
 use C4::Auth;
 use CGI;
 use C4::Context;
@@ -51,7 +51,6 @@ 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");
 our $sep        = $input->param("sep");
 $sep = "\t" if ($sep eq 'tabulation');
 my $item_itype;
@@ -75,7 +74,7 @@ if ($do_it) {
        if ($output eq "screen"){
                $template->param(mainloop => $results);
                output_html_with_http_headers $input, $cookie, $template->output;
-               exit(1);
+               exit;
        } else {
                print $input->header(-type => 'application/vnd.sun.xml.calc',
                                      -encoding    => 'utf-8',
@@ -103,7 +102,7 @@ if ($do_it) {
                        print $sep.$col->{totalcol};
                }
                print $sep.@$results[0]->{total};
-               exit(1);
+               exit;
        }
 } else {
        my $dbh = C4::Context->dbh;
@@ -159,7 +158,7 @@ if ($do_it) {
                push @locations, { code => $_, description => "$_ - " . $locations->{$_} };
        }
        
-       my @mime  = ( map { +{type =>$_} } (split /[;:]/,C4::Context->preference("MIME")) );
+       my @mime  = ( map { +{type =>$_} } (split /[;:]/, 'CSV') ); # FIXME translation
        
        $template->param(hasdewey=>$hasdewey,
                                        haslccn   => $haslccn,
@@ -203,8 +202,6 @@ if($barcodefilter){
     }
     # Change * to %
     $barcodefilter =~ s/\*/%/g;
-}else{
-    $barcodefilter = "%";
 }
 
 # Filters
@@ -288,27 +285,31 @@ if($barcodefilter){
                $linefield .= $line;
        }
 
-       my $strsth;
-       $strsth .= "select distinctrow $linefield from biblioitems left join items on (items.biblioitemnumber = biblioitems.biblioitemnumber) where barcode $not LIKE ? AND $line is not null ";
+       my $strsth = "SELECT DISTINCTROW $linefield FROM biblioitems 
+                       INNER JOIN items USING (biblioitemnumber)
+                     WHERE $line IS NOT NULL ";
+    $strsth .= " AND barcode $not LIKE ? " if ($barcodefilter);
        if ( @linefilter ) {
                if ($linefilter[1]){
-                       $strsth .= " and $line >= ? " ;
-                       $strsth .= " and $line <= ? " ;
+                       $strsth .= " AND $line >= ? " ;
+                       $strsth .= " AND $line <= ? " ;
                } elsif ($linefilter[0]) {
                        $linefilter[0] =~ s/\*/%/g;
-                       $strsth .= " and $line LIKE ? " ;
+                       $strsth .= " AND $line LIKE ? " ;
                }
        }
-       $strsth .=" order by $linefield";
+       $strsth .=" ORDER BY $linefield";
        $debug and print STDERR "catalogue_stats SQL: $strsth\n";
-       
+
        my $sth = $dbh->prepare( $strsth );
        if (( @linefilter ) and ($linefilter[1])){
                $sth->execute($barcodefilter,$linefilter[0],$linefilter[1]);
        } elsif ($barcodefilter,$linefilter[0]) {
                $sth->execute($barcodefilter,$linefilter[0]);
-       } else {
+       } elsif ($barcodefilter) {
                $sth->execute($barcodefilter);
+       }else{
+           $sth->execute();
        }
        while ( my ($celvalue) = $sth->fetchrow) {
                my %cell;
@@ -336,24 +337,28 @@ if($barcodefilter){
        my $strsth2 = "
        SELECT distinctrow $colfield
        FROM   biblioitems
-       LEFT JOIN items
-               ON (items.biblioitemnumber = biblioitems.biblioitemnumber)
-       WHERE  barcode $not LIKE ? AND $column IS NOT NULL ";
+       INNER JOIN items
+               USING (biblioitemnumber)
+       WHERE $column IS NOT NULL ";
+       $strsth2 .= " AND barcode $not LIKE ?" if $barcodefilter;
+       
        if (( @colfilter ) and ($colfilter[1])) {
-               $strsth2 .= " and $column> ? and $column< ?";
+               $strsth2 .= " AND $column> ? AND $column< ?";
        }elsif ($colfilter[0]){
                $colfilter[0] =~ s/\*/%/g;
-               $strsth2 .= " and $column LIKE ? ";
+               $strsth2 .= " AND $column LIKE ? ";
        } 
-       $strsth2 .= " order by $colfield";
+       $strsth2 .= " ORDER BY $colfield";
        $debug and print STDERR "SQL: $strsth2";
        my $sth2 = $dbh->prepare( $strsth2 );
        if ((@colfilter) and ($colfilter[1])) {
                $sth2->execute($barcodefilter,$colfilter[0],$colfilter[1]);
        } elsif ($colfilter[0]){
                $sth2->execute($barcodefilter,$colfilter[0]);
+       } elsif ($barcodefilter){
+           $sth2->execute($barcodefilter);
        } else {
-               $sth2->execute($barcodefilter);
+               $sth2->execute();
        }
        while (my ($celvalue) = $sth2->fetchrow) {
                my %cell;
@@ -383,7 +388,9 @@ if($barcodefilter){
        }
 
 # preparing calculation
-       my $strcalc .= "SELECT $linefield, $colfield, count(*) FROM biblioitems LEFT JOIN  items ON (items.biblioitemnumber = biblioitems.biblioitemnumber) WHERE 1 AND barcode $not like ? ";
+       my $strcalc = "SELECT $linefield, $colfield, count(*) FROM biblioitems INNER JOIN  items ON (items.biblioitemnumber = biblioitems.biblioitemnumber) WHERE 1 ";
+       $strcalc .= "AND barcode $not like ? " if ($barcodefilter); 
+       
        if (@$filters[0]){
                @$filters[0]=~ s/\*/%/g;
                $strcalc .= " AND dewey >" . @$filters[0];
@@ -446,7 +453,11 @@ if($barcodefilter){
        $strcalc .= " group by $linefield, $colfield order by $linefield,$colfield";
        $debug and warn "SQL: $strcalc";
        my $dbcalc = $dbh->prepare($strcalc);
-       $dbcalc->execute($barcodefilter);
+       if($barcodefilter){
+          $dbcalc->execute($barcodefilter);
+       }else{
+          $dbcalc->execute();
+       }
 #      warn "filling table";
        
        my $emptycol;