• User Newbie

    Report - Stampa

    Riporto quel che ho chiesto su HTML.it (si può fare pubblicità? Se no, scusatemi!)

    Ho grandissimi problemi con la gestione delle stampe di report commerciali.

    Ho provato due alternative:

    1. Generazione di codice HTML con CSS
    2. Generazione file PDF

    Il primo l'ho abbandonato subito perchè non mi permetteva di inserire "Intestazione di Pagina" e "Piè di pagina" su ogni pagina stampata.

    Per il secondo ho creato una classe PHP a cui passo la query e lui genera il report.

    Il problema è:

    1. Non riesco ad inserire il subtotale di ogni colonna per ogni pagina
    2. E' una faticaccia scrivere tutto il codice a mano.

    Non esiste qualche programma che, in maniera automatica, genera report in PHP? Che mi aggiunga i subtotali ad ogni colonna?

    Ho visto un programma (fatto in Delphi + Access Mdb) che addirittura permette di creare report personalizzati con un word processor simile a Word.

    image

    E' una funzionalità offerta da Delphi? Un programma esterno? Come si può fare lo stesso in php?

    Cioè, come do la possibilità al cliente di personalizzare i propri report?


  • Super User

    Di solito li gestisco in pdf usando la classe R&OS


  • User Newbie

    Come fai a capire quando finisce una pagina per inserire i subtotali?

    Ho dato un'occhiata al file readme.pdf della classe ma non trovo niente in merito: non si riesce a capire quando la pagina stia finendo per inserire il subtotale per pagina.

    E poi non si riesce a costruire il report in maniera visuale. Ad esempio guardando la pagina ed inserendo i vari campi con un drag&drop del mouse.

    Attualmente uso fpdf con queste due classi:

    <?php
    require('../include/fpdf/mysql_table.php');
    session_start();
    
    /* 
    @author Salvatore Baglieri
    */
    class PDF extends PDF_MySQL_Table {
    function Header() {
        //Logo
        
        //Arial bold 15
        $this->SetFont('Arial','B',20);
        //Move to the right
        //$this->Cell(80);
        //Title
        $this->Cell(100,15,'Elenco dei pazienti',1,0,'C');
        $this->SetFont('Arial','',8);
        $this->Image('../immagini/logo.png', ($this->GetX())+50, 10, '', 18);
        // $this->MultiCell(0,5,$_SESSION['query'],1,1,'C');
        //Line break
        $this->Ln(20);
    }
    
    //Page footer
    function Footer() {
        //Position at 1.5 cm from bottom
        $this->SetY(-15);
        
        //Arial italic 8
        $this->SetFont('Arial','I',8);
        $this->Write(10,'Documento stampato il '.date('d-m-Y').' alle '.date('h:i').' con xxx - ');
        $this->SetTextColor(0,0,255);
        $this->SetFont('','U');
        $this->Write(10,'Digital 2B s.n.c.','http://www.digital2b.com');
        $this->SetTextColor(0,0,0);
        $this->SetFont('Arial','I',8);
        // $this->Image('immagini/xxx.jpg',10,280, 10, 10);
        
        $this->Line(10, 196, 285, 196);
        //Page number
        $this->Cell(0,10,'Pagina '.$this->PageNo().'/{nb}',0,0,'R');
    }
    
    
    }
    
    //Connect to database
    mysql_connect('xxx','xxx','xxx');
    mysql_select_db('xxx');
    
    $pdf=new PDF();
    $pdf->SetCompression(true);
    $pdf->SetTitle('Elenco_Pazienti');
    $pdf->AliasNbPages();
    $pdf->Open();
    $pdf->AddPage('L');
    
    //Second table: specify 3 columns
    $pdf->AddCol('IdAnagrafica',5,'Id','L');
    $pdf->AddCol('Cognome',35,'Cognome','L');
    $pdf->AddCol('Nome',35,'Nome','L');
    //$pdf->AddCol('Sesso',12,'Sesso','C');
    $pdf->AddCol('DatadiNascita',22,'Data Nascita','C');
    $pdf->AddCol('CodiceFiscale',36,'Codice Fiscale','L');
    $pdf->AddCol('Professione',45,'Professione','L');
    $pdf->AddCol('Domicilio',45,'Domicilio','L');
    $pdf->AddCol('ComunediResidenza',45,'Comune','L');
    $prop=array('HeaderColor'=>array(255,150,100),
                'color1'=>array(210,245,255),
                'color2'=>array(255,255,210),
                'padding'=>2);
    $pdf->SetFont('Arial','',9);
    $pdf->Table($_SESSION['query'],$prop);
    $pdf->Output("Elenco_Pazienti.pdf", "D");
    ?>
    

    Utilizzando questa classe:

    <?php
    require('fpdf.php');
    
    class PDF_MySQL_Table extends FPDF {
    var $ProcessingTable=false;
    var $aCols=array();
    var $TableX;
    var $HeaderColor;
    var $RowColors;
    var $ColorIndex;
    
    
    function Header() {
        //Print the table header if necessary
        if($this->ProcessingTable)
            $this->TableHeader();
    }
    
    
    function TableHeader() {
        //$this->SetFont('Arial','B',12);
        $this->SetFont('','B','');
        $this->SetX($this->TableX);
        $fill=!empty($this->HeaderColor);
        if($fill)
            $this->SetFillColor($this->HeaderColor[0],$this->HeaderColor[1],$this->HeaderColor[2]);
        foreach($this->aCols as $col)
            $this->Cell($col['w'],6,$col['c'],1,0,'C',$fill);
        $this->Ln();
        $this->SetFont('','','');
    }
    
    
    function Row($data)
    {
        $this->SetX($this->TableX);
        $ci=$this->ColorIndex;
        $fill=!empty($this->RowColors[$ci]);
        if($fill)
            $this->SetFillColor($this->RowColors[$ci][0],$this->RowColors[$ci][1],$this->RowColors[$ci][2]);
        foreach($this->aCols as $col)
            $this->Cell($col['w'],5,$data[$col['f']],1,0,$col['a'],$fill);
        $this->Ln();
        $this->ColorIndex=1-$ci;
    }
    
    function CalcWidths($width,$align)
    {
        //Compute the widths of the columns
        $TableWidth=0;
        foreach($this->aCols as $i=>$col)
        {
            $w=$col['w'];
            if($w==-1)
                $w=$width/count($this->aCols);
            elseif(substr($w,-1)=='%')
                $w=$w/100*$width;
            $this->aCols*['w']=$w;
            $TableWidth+=$w;
        }
        //Compute the abscissa of the table
        if($align=='C')
            $this->TableX=max(($this->w-$TableWidth)/2,0);
        elseif($align=='R')
            $this->TableX=max($this->w-$this->rMargin-$TableWidth,0);
        else
            $this->TableX=$this->lMargin;
    }
    
    function AddCol($field=-1,$width=-1,$caption='',$align='L')
    {
        //Add a column to the table
        if($field==-1)
            $field=count($this->aCols);
        $this->aCols[]=array('f'=>$field,'c'=>$caption,'w'=>$width,'a'=>$align);
    }
    
    function Table($query,$prop=array())
    {
        //Issue query
        $res=mysql_query($query) or die('Error: '.mysql_error()."<BR>Query: $query");
        //Add all columns if none was specified
        if(count($this->aCols)==0)
        {
            $nb=mysql_num_fields($res);
            for($i=0;$i<$nb;$i++)
                $this->AddCol();
        }
        //Retrieve column names when not specified
        foreach($this->aCols as $i=>$col)
        {
            if($col['c']=='')
            {
                if(is_string($col['f']))
                    $this->aCols*['c']=ucfirst($col['f']);
                else
                    $this->aCols*['c']=ucfirst(mysql_field_name($res,$col['f']));
            }
        }
        //Handle properties
        if(!isset($prop['width']))
            $prop['width']=0;
        if($prop['width']==0)
            $prop['width']=$this->w-$this->lMargin-$this->rMargin;
        if(!isset($prop['align']))
            $prop['align']='C';
        if(!isset($prop['padding']))
            $prop['padding']=$this->cMargin;
        $cMargin=$this->cMargin;
        $this->cMargin=$prop['padding'];
        if(!isset($prop['HeaderColor']))
            $prop['HeaderColor']=array();
        $this->HeaderColor=$prop['HeaderColor'];
        if(!isset($prop))
            $prop=array();
        if(!isset($prop))
            $prop=array();
        $this->RowColors=array($prop,$prop);
        //Compute column widths
        $this->CalcWidths($prop['width'],$prop['align']);
        //Print header
         $this->TableHeader();
        //Print rows
        //$this->SetFont('Arial','',11);
        $this->ColorIndex=0;
        $this->ProcessingTable=true;
        while($row=mysql_fetch_array($res))
            $this->Row($row);
        $this->ProcessingTable=false;
        $this->cMargin=$cMargin;
        $this->aCols=array();
    }
    }
    ?>
    

    Tutta via:

    1. La creazione del report NON è visuale;
    2. Non riesce ad inserire i subtotali alla fine di ogni pagina (non posso metterlo sul pié di pagina, come è facilmente intuibile).

  • Super User

    Tengo conto dell'altezza del "foglio" se supera il massimo da me deciso crea un'altra pagina