php mysql - reporteador

16
En este tutorial aprendermos a crear reportes de datos de nuestra base de datos MySQL en PDF, con la libreria TCPDF, y PHP. Conexion: Sera nuestro archivo conexion.php que nos conectará a la base de datos, en este caso la llamaré personas, que contiene la tabla usuarios con los campos: codigo, nombres, apellidos, telefono y ciudad. Modelo: Es donde se encuentran nuestra clase consulta con su funciones: registrarUsuario y reportePdfUsuarios, la primera funcion, nos registrará los datos que ingresemos en el formulario a nuestra base de datos y el segundo, consultará esos datos, ya con la libreria TCPDF, podremos visualizarlos pero en formato pdf, en nuestro navegador. Control: En esta carpeta se encuentra el archivo controlador.php, que recibirá los datos que ingresemos en el formulario para registrar un usuario , aqui invocamos al la funcion registrarUsuario(), de la clase consulta del archivo consulta.php, y le pasamos como parametro los datos recibidos del formulario. Vista: Sera el archivo que visualizaremos en nuestro navegador, el cual contiene el formulario de regisytro y desde donde podremos generar el reporte. tcpdf: En esta carpeta estan todos los archivos necesarios para poder generar el reporte, creado por tcpdf.org, es una libreria util y muy completa. data_base:

Upload: tjnike10

Post on 28-Oct-2015

688 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Php Mysql - Reporteador

En este tutorial aprendermos a crear reportes de datos de nuestra base de datos MySQL en PDF, con la libreria TCPDF, y PHP. 

Conexion: 

Sera nuestro archivo conexion.php que nos conectará a la base de datos, en este caso la llamaré personas, que contiene la tabla usuarios con los campos: 

codigo, nombres, apellidos, telefono y ciudad. 

Modelo: 

Es donde se encuentran nuestra clase consulta con su funciones: registrarUsuario y reportePdfUsuarios, la primera funcion, nos registrará los datos que ingresemos en el formulario a nuestra base de datos y el segundo, consultará esos datos, ya con la libreria TCPDF, podremos visualizarlos pero en formato pdf, en nuestro navegador.

Control: 

En esta carpeta se encuentra el archivo controlador.php, que recibirá los datos que ingresemos en el formulario para registrar un usuario, aqui invocamos al la funcion registrarUsuario(), de la clase consulta del archivo consulta.php, y le pasamos como parametro los datos recibidos del formulario.

Vista: 

Sera el archivo que visualizaremos en nuestro navegador, el cual contiene el formulario de regisytro y desde donde podremos generar el reporte. 

tcpdf: 

En esta carpeta estan todos los archivos necesarios para poder generar el reporte, creado por tcpdf.org, es una libreria util y muy completa. 

data_base: 

Aqui tenemos el script de nuestra tabla usuarios. 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Generar reportes en PDF con PHP y MySqlPHP tiene funciones especificar para trabajar con pdf, pero son muy difíciles de usar. Luego de googlear un poco encontré R&OS Pdf class, una clase para PHP que tiene una serie de funciones muy sencillas de usar y muy potentes.La instalación es muy fácil, solo hay que bajar los archivos desde la web de R&OS y descomprimirlos en nuestro web server.

Page 2: Php Mysql - Reporteador

En esta clase vienen 2 archivos: class.ezpdf.php y class.pdf.php los cuales contienen todas las propiedades y métodos necesarios para crear documentos PDF. También vamos a encontrar una carpeta fonts, en la cual vienen varias fuentes para utilizar con esta clase.El primer paso para comenzar a generar un archivo pdf es incluir la clase con esta línea:1. include ('class.ezpdf.php'); Luego debemos crear una instancia de la clase Cezpdf, con la cual vamos a manejar la creación del archivo pdf. Para esto creamos un archivo llamado mipdf.php donde vamos a escribir el siguiente código php:

2. $pdf =& new Cezpdf('a4');3. $pdf->selectFont('../fonts/courier.afm');4. $pdf->ezSetCmMargins(1,1,1.5,1.5);

En la línea 2 seleccionamos el tamaño de hoja a utilizar, en la 3 seleccionamos el tipo de fuente que vamos a usar en el archivo pdf y en la línea 4 definimos los márgenes de las páginas generadas en el pdf.OBTENER LOS DATOS DE MYSQL PARA GENERAR UNA TABLAAhora vamos a obtener los datos a mostrar desde una base de datos. En este ejemplo estoy utilizando MySql para obtener los datos de los productos:

5. $conexion = mysql_connect("localhost", "usuario", "clave");6. mysql_select_db("demo", $conexion);7. $result=mysql_query("SELECT idProducto,descrip,desc_tec FROM Productos",$conexion)or die(mysql_error());

CREANDO EL TITULO, ARRAY DE DATOS Y OPCIONES:Una vez que tenemos los datos de la base de datos tenemos que generar el título, el arreglo de datos y las opciones de la tabla a generar. Para esto vamos a usar 3 matrices: una para los títulos de los campos, otra para los datos y otra para las opciones de la tabla:

8. while($datatmp = mysql_fetch_assoc($result)) {9. $data[] = $datatmp;10. }11. $titles = array(12. 'idProducto'=>'ID',13. 'descrip'=>'Descripcion',14. 'desc_tec'=>'Desc. Tecnica'15. );16. $options = array(17. 'showHeadings'=>1,18. 'shadeCol'=>array(0.9,0.9,0.9),19. 'xOrientation'=>'center',20. 'width'=>50021. );

La matriz “data” no requiere mucha explicación, solamente acumulamos los datos uno por uno en esa matriz.En la matriz “titles” asignamos los nombres de cada columna de datos.En cuanto a la matriz “options” solo voy a explicar las opciones más comunes, ya que esta clase es muy completa y tiene varias opciones más:‘showHeadings’=> permite mostrar los nombres de las columnas (encabezados) 1 muestra, 0 oculta.‘shadeCol’=> color de celdas, se ingresa el color en formato RGB.‘xOrientation’=> orientación del texto dentro de las celdas de la tabla.‘width’=> asigna el ancho de la tabla.

Page 3: Php Mysql - Reporteador

IMPRIMIR LOS RESULTADOS:Una vez que tenemos los nombres de las columnas, los datos y la configuración de la tabla debemos generar el pdf con toda la información que necesitamos. Vamos a incluir un titulo para el archivo y datos de fecha y hora para acompañar a la tabla:

22. $txttitle = "LISTADO DE PRODUCTOS "."\n\n\n";23. $pdf->ezText($txttitle, 12);24. $pdf->ezTable($data,$titles, '', $options);25. $pdf->ezText("\n\n\n", 10);

26. $pdf->ezText("Fecha: ".date("d/m/Y")."\n", 10);27. $pdf->ezText("Hora: ".date("H:i:s")."\n\n", 10);28. $pdf->ezStream();

La función exTable es la que va a generar la tabla de datos. Lleva como parámetros: Datos,Encabezados,Titulo y Opciones (en el ejemplo no le indico un titulo a la tabla).La función exText permite ingresar un texto al archivo pdf con su respectivo tamaño de letra.Por último la función ezStream es la que genera el archivo pdf y lo muestra en el navegador.

//////////////////////////////////////////////////////////////////////////////////////////////

Para realizar esto utilizaremos: el lenguaje de programación PHP, el gestor de base de datos MySQL y la librería FPDF.

Lo primero es realizar nuestra base de datos la cual llamaremos clínica, en donde contendrá las siguientes tablas y la siguiente estructura.

Tabla pacientes

12345678910

CREATE TABLE IF NOT EXISTS `pacientes` (  `id_paciente` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  `clave` varchar(10) NOT NULL,  `nombre` varchar(80) NOT NULL,  `apellido_paterno` varchar(80) NOT NULL,  `apellido_materno` varchar(80) NOT NULL,  `sexo` varchar(2) NOT NULL,  `domicilio` text NOT NULL,  PRIMARY KEY (`id_paciente`)) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

Tabla médicos

123456

CREATE TABLE IF NOT EXISTS `medicos` (  `id_medico` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  `cedula` varchar(10) NOT NULL,  `nombre_medico` varchar(200) NOT NULL,  PRIMARY KEY (`id_medico`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Page 4: Php Mysql - Reporteador

Tabla consultas_medicas

123456789

CREATE TABLE IF NOT EXISTS `consultas_medicas` (  `id_consulta` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  `fecha_consulta` date NOT NULL,  `id_paciente` int(5) NOT NULL,  `id_medico` int(5) NOT NULL,  `consultorio` varchar(20) NOT NULL,  `diagnostico` text NOT NULL,  PRIMARY KEY (`id_consulta`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Des pues creamos los siguientes archivos:

conexion.phpContiene los parámetros para conectarse a la base de datos y realiza las conexiones.

1234567891011121314151617181920

<php class DB{   var $conect;    var $BaseDatos;     var $Servidor;  var $Usuario;   var= "clinica";        $this->Servidor = "localhost";        $this->Usuario = "clinic";        $this->Clave = "clinica123";    }

     function conectar() {        if(!($con=@mysql_connect($this->Servidor,$this->Usuario,$this->Clave))){            echo"Error al conectar a la base de datos";            exit();        }        if (!@mysql_select_db($this->BaseDatos,$con)){            echo "Error al seleccionar la base de datos";            exit();        }        $this->conect=$con;        return true;    }}?>

index.phpRealiza el listado de los pacientes en la base de datos y envía la orden de generar el archivo PDF, para ello manda el identificador del paciente por medio de la url y lo recibe el archivo reporte_historial.php por $_GET.

12345

<?php    include_once("conexion.php");

    $con = new DB;    $pacientes = $con->conectar();    $strConsulta = "SELECT id_paciente, clave, nombre, apellido_paterno, apellido_materno from

Page 5: Php Mysql - Reporteador

678910111213141516171819202122

pacientes";    $pacientes = mysql_query($strConsulta);    $numfilas = mysql_num_rows($pacientes);

    echo '<table cellpadding="0" cellspacing="0" width="100%">';    echo '<thead><tr><td>No.</td><td>CLAVE</td><td>NOMBRE</td><td>HISTORIAL</td></tr></thead>';    for ($i=0; $i<$numfilas; $i++)    {        $fila = mysql_fetch_array($pacientes);        $numlista = $i + 1;        echo '<tr><td>'.$numlista.'</td>';        echo '<td>'.$fila['clave'].'</td>';        echo '<td>'.$fila['nombre'].' '.$fila['apellido_paterno'].' '.$fila['apellido_materno'].'</td>';        echo '<td><a href="reporte_historial.php?id='.$fila['id_paciente'].'">ver</a></td></tr>';    }    echo "</table>";?>

reporte_historial.phpRealiza el reporte mediante la librería FPDF.1. En la primera parte llamamos a la libreria fpdf y al archivo conexion para conectar php con la base de datos.

1234

<?php // incluimos la libreria fpdfrequire('fpdf/fpdf.php');// incluimos la conexion a la base de datosrequire('conexion.php');

2. Le insertamos una clase que tiene las siguientes funciones: crear tablas, encabezado y pie. Esta clase fue tomada de los tutoriales de la página oficial de la librería FPDF. Ya que la función multiCell no permite ordenarse por tablas y la función Cell solo funciona en un solo renglón y no mostraría cuando hay muchos más caracteres.

1234567891011121314

class PDF extends FPDF { var $widths; var $aligns; function SetWidths($w) {    $this->widths=$w;}

function SetAligns($a){    $this->aligns=$a;}

function Row($data){    $nb=0;    for($i=0;$iNbLines($this->widths[$i],$data[$i]));    $h=4*$nb;    $this->CheckPageBreak($h);    for($i=0;$iwidths[$i];        $a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';

Page 6: Php Mysql - Reporteador

1516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061

        $x=$this->GetX();        $y=$this->GetY();        $this->Rect($x,$y,$w,$h);        $this->MultiCell($w,4,$data[$i],0,$a);        $this->SetXY($x+$w,$y);    }    $this->Ln($h);}

function CheckPageBreak($h){    if($this->GetY()+$h>$this->PageBreakTrigger)        $this->AddPage($this->CurOrientation);}

function NbLines($w,$txt){    $cw=&$this->CurrentFont['cw'];    if($w==0)        $w=$this->w-$this->rMargin-$this->x;    $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;    $s=str_replace("\r",'',$txt);    $nb=strlen($s);    if($nb>0 and $s[$nb-1]=="\n")        $nb--;    $sep=-1;    $i=0;    $j=0;    $l=0;    $nl=1;    while($i$wmax)        {            if($sep==-1)            {                if($i==$j)                    $i++;            }            else                $i=$sep+1;            $sep=-1;            $j=$i;            $l=0;            $nl++;        }        else            $i++;    }    return $nl;}

function Header(){    $this->SetFont('Arial','',10);    $this->Text(65,14,'Clinica el sol naciente',0,'C', 0);    $this->Ln(30);}

Page 7: Php Mysql - Reporteador

62636465666768697071727374757677787980

function Footer(){    $this->SetY(-15);    $this->SetFont('Arial','B',8);    $this->Cell(100,10,'Historial medico',0,0,'L');}}

3. Recibir el id del paciente, para ello lo obtenemos mediante $_GET.

1 $paciente= $_GET['id'];

4. Mostrar los datos del paciente.

12345678910111213141516171819202122

// creamos el objeto FPDF$pdf=new PDF('L','mm','Letter'); // vertical, milimetros y tamaño$pdf->Open();$pdf->AddPage(); // agregamos la pagina$pdf->SetMargins(20,20,20); // definimos los margenes en este caso estan en milimetros$pdf->Ln(10); // dejamos un pequeño espacio de 10 milimetros

// Realizamos la consulta$con = new DB;$pacientes = $con->conectar();// $paciente contiene el id del paciente a consultar, obtiene los datos de la tabla pacientes$strConsulta = "SELECT * from pacientes where id_paciente =  '$paciente'";$pacientes = mysql_query($strConsulta);$fila = mysql_fetch_array($pacientes);// listamos los datos con Cell$pdf->SetFont('Arial','',12); // definimos el tipo de letra y el tamaño// Cell esta formado por (posición de inicio, ancho, texto, borde, cambio de linea, posición del texto)$pdf->Cell(0,6,'Clave: '.$fila['clave'],0,1);$pdf->Cell(0,6,'Nombre: '.$fila['nombre'].' '.$fila['apellido_paterno'].' '.$fila['apellido_materno'],0,1);$pdf->Cell(0,6,'Sexo: '.$fila['sexo'],0,1);$pdf->Cell(0,6,'Domicilio: '.$fila['domicilio'],0,1);$pdf->Ln(10);

Page 8: Php Mysql - Reporteador

5. Listar el historial del pacientePara listar el historial medico en forma de tablas llamaremos a las funciones antes declaradas de la siguientes forma, primero creamos el encabezado de nuestra tabla de la siguiente manera:

1234567

// Para realizar esto utilizaremos la funcion Row()$pdf->SetFont('Arial','',10);// tipo y tamaño de letra$pdf->SetWidths(array(60, 60, 60, 60));// Definimos el tamaño de las columnas, tomando en cuenta que las declaramos en milimetros, ya que nuestra hoja esta en milimetros.$pdf->Row(array('FECHA', 'MEDICO', 'CONSULTORIO', 'DIAGNOSTICO'));// creamos nuestra fila con las columnas fecha(fecha de la visita al medico), medico(nombre del medico que nos atendio), consultorio y el diagnostico en esa visita.

Despues de crear el encabezado de nuestra tabla obtendremos el historial desde la base de datos y lo mostraremos en nuestro archivo pdf creado, seguiremos utilizando la función Row().

123456789101112131415

$historial = $con->conectar(); // Creamos nuestra conexión a la base de datos // Realizamos nuestra consulta$strConsulta = "SELECT consultas_medicas.fecha_consulta, consultas_medicas.consultorio, consultas_medicas.diagnostico, medicos.nombre_medicoFROM consultas_medicasInner Join pacientes ON consultas_medicas.id_paciente = pacientes.id_pacienteInner Join medicos ON consultas_medicas.id_medico = medicos.id_medicoWHERE pacientes.id_paciente = '$paciente'";// ejecutamos la consulta$historial = mysql_query($strConsulta);// listamos la tabla de historial de visitas de cada paciente$numfilas = mysql_num_rows($historial);for ($i=0; $iRow(array($fila['fecha_consulta'], $fila['consultorio'], $fila['nombre_medico'], $fila['diagnostico']));}//La ultima linea$pdf->Output(); lo que hace es cerrar el archivo y enviarlo al navegador.

Actualizacones:

Se colorean la filas de titulo y las de datos en el historial en pdf, para realizar esto se le agrego el valor true al parametro fill dentro de la función MultiCell que es la que permite heredar de SetFillColor el color de fondo en formato rgb.

/////////////////////////////////////////////////////////////////////////////////////////////////////

Page 9: Php Mysql - Reporteador

REPORTES PDF CON LA CLASE FPDF, PHP Y MYSQL¿Qué es FPDF?

FPDF es una clase escrita en PHP que permite generar documentos PDF directamente desde

PHP, es decir, sin usar la biblioteca PDFlib. La F de FPDF significa Free (gratis y libre): puede

usted usarla para cualquier propósito y modificarla a su gusto para satisfacer sus

necesidades.

FPDF tiene otras ventajas: funciones de alto nivel. Esta es una lista de sus principales

características:

* Elección de la unidad de medida, formato de página y márgenes

* Gestión de cabeceras y pies de página

* Salto de página automático

* Salto de línea y justificación del texto automáticos

* Admisión de imágenes (JPEG, PNG y GIF)

* Colores

* Enlaces

* Admisión de fuentes TrueType, Type1 y codificación

* Compresión de página

La clase se puede descargar en la página oficial http://www.fpdf.org/

Una vez que la incluyas dentro de tu carpeta de proyectos web, puedes crear un pdf como lo

desees.. Aquí mi ejemplo particular, ṕara adaptarlo puedes configurar tu clave usuario, y base

de datos a usar, modificas las consultas a conveniencia, en este caso hay dos tablas dos

funciones y dos consultas..

SetFillColor(62,102,60); // fondo de celda 

$this->SetTextColor(255); // color del texto 

$this->SetDrawColor(0,0,0); // color de linea 

Page 10: Php Mysql - Reporteador

$this->SetLineWidth(.3); // ancho de linea 

$this->SetFont('Arial','', 7); 

$w=array(20,100,15,10,15,15,15); // en este arreglo definiremos el ancho de cada columna 

for($i=0;$iCell($w[$i],4,$header[$i],1,0,'C',1); //por cada encabezado existente, crea una celda 

$this->Ln(); 

//Colores, ancho de línea y fuente en negrita de CONTENIDO 

$this->SetFillColor(244,244,244); // 

$this->SetTextColor(0); 

$this->SetFont(''); 

//Datos 

$fill=false; // variable para alternar relleno 

foreach($data as $row) 

$columna = explode(";",$row); //separar los datos en posiciones de arreglo 

$this->Cell($w[0],6,$columna[0],'LR',0,'L',$fill); //celda(ancho,alto,salto de

linea,border,alineacion,relleno) 

$this->Cell($w[1],6,$columna[1],'LR',0,'L',$fill); 

$this->Cell($w[2],6,$columna[2],'LR',0,'L',$fill); 

$this->Cell($w[3],6,$columna[3],'LR',0,'L',$fill); 

$this->Cell($w[4],6,$columna[4],'LR',0,'L',$fill);

$this->Cell($w[5],6,$columna[5],'LR',0,'L',$fill); 

$this->Cell($w[6],6,$columna[6],'LR',0,'L',$fill);

$this->Ln(); 

$fill=!$fill; //se alterna el valor del boolean $fill para cambiar relleno 

$this->Cell(array_sum($w),0,'','T'); 

function tabla1($header1,$data1) 

//Colores, ancho de línea y fuente en negrita de CABECERA 

$this->SetFillColor(62,102,60); // fondo de celda 

$this->SetTextColor(255); // color del texto 

$this->SetDrawColor(0,0,0); // color de linea 

Page 11: Php Mysql - Reporteador

$this->SetLineWidth(.3); // ancho de linea 

$this->SetFont('Arial','', 6); // negrita 

$w=array(70); // en este arreglo definiremos el ancho de cada columna 

for($i=0;$iCell($w[$i],4,$header1[$i],1,0,'C',1); //por cada encabezado existente, crea una

celda 

$this->Ln(); 

//Colores, ancho de línea y fuente en negrita de CONTENIDO 

$this->SetFillColor(244,244,244); // 

$this->SetTextColor(0); 

$this->SetFont(''); 

//Datos 

$fill=false; // variable para alternar relleno 

foreach($data1 as $row) 

$columna = explode(";",$row); //separar los datos en posiciones de arreglo 

// validación a mano para que respete el limite de la celda

if ($columna[0]>$w[0]){

$this->Cell($w[0],20,$columna[0],'LR',1,'L',$fill); //celda(ancho,alto,salto de

linea,border,alineacion,relleno) 

}

else{

$this->Cell($w[0],5,substr($columna[0],0, 45),'LR',1,'L',$fill); 

$this->Cell($w[0],5,substr($columna[0],45,53),'LR',1,'L',$fill); 

$this->Cell($w[0],5,substr($columna[0],99,150),'LR',1,'L',$fill); 

$this->Ln(0); 

}

$fill=!$fill; //se alterna el valor del boolean $fill para cambiar relleno 

$this->Cell(array_sum($w),0,'','T'); 

function Footer() 

Page 12: Php Mysql - Reporteador

//Pie de página 

$this->SetY(-15); 

$this->SetFont('Arial','I',10); 

$this->SetTextColor(128); 

$this->Cell(0,10,'Pagina '.$this->PageNo().' de {nb}',0,0,'C'); // el parametro {nb} es generado

por una funcion llamada AliasNbPages 

$pdf = new PDF(); 

$pdf->AliasNbPages(); //funcion que calcula el numero de paginas

$sql1 = "SELECT informacion FROM empresa"; 

$modificar11 = mysql_query($sql1, $conex) or die(mysql_error());

$head1 = array("VENEZOLANA DE RIEGO, C.A"); // cabecera 

$i=0; 

while ($fila=mysql_fetch_array($modificar11)){ //llenar variable dat con los campos de una fila

unidos por ; 

$dat1[$i]=$fila[0]; //concatenar para luego ser separado por explode() 

$i++; 

$sql = "SELECT codigo, descripcion, unidad, cantidad, precio_uni, descuento, total FROM

orden_articulos where orden='10733'"; 

$modificar1 = mysql_query($sql, $conex) or die(mysql_error());

$head = array("Codigo","Descripcion","Unidad","Cant","Precio","Dcto","Total"); // cabecera 

$i=0; 

while ($fila=mysql_fetch_array($modificar1)){ //llenar variable dat con los campos de una fila

unidos por ; 

$dat[$i]=$fila[0].";".($fila[1]).";".$fila[2].";".$fila[3].";".$fila[4].";".$fila[5].";".$fila[6]; //concatenar

para luego ser separado por explode() 

$i++; 

$pdf->AddPage(); //crear documento 

$pdf->Image('images/logo.jpg',10,8,30,30); //añadir imagen 

Page 13: Php Mysql - Reporteador

$pdf->Cell(50); 

$pdf->SetFont('Arial','',12); 

$pdf->Cell(120,15,"ORDEN DE COMPRA",0,0,'C'); 

$pdf->Ln(35); 

$pdf->SetFont('Arial','',12); 

$pdf->Ln(10); 

$pdf->tabla1($head1,$dat1); 

$pdf->Ln(30); 

$pdf->tabla($head,$dat);

$pdf->Output(); //el resto es historia 

?>