CREAR UN REPORTE CON FPDF USANDO PHP Y MYSQL
En este post realizaremos un historial clínico de un paciente, en el cual contendrá los datos generales del paciente y un listado de las consultas médicas que realizo, el historial estará en formato PDF. 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
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
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; |
Tabla consultas_medicas
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.php Contiene los parámetros para conectarse a la base de datos y realiza las conexiones.
<php class DB{ var $conect ; var $BaseDatos ; var $Servidor ; var $Usuario ; var $Clave ; function DB(){ $this --->BaseDatos = "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.php Realiza 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.
<?php include_once ( "conexion.php" ); $con = new DB; $pacientes = $con ->conectar(); $strConsulta = "SELECT id_paciente, clave, nombre, apellido_paterno, apellido_materno from 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.php Realiza 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.
<?php // incluimos la libreria fpdf require ( 'fpdf/fpdf.php' ); // incluimos la conexion a la base de datos require ( '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.
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' ; $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); } 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.
$paciente = $_GET [ 'id' ]; |
4. Mostrar los datos del paciente.
// 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); |
5. Listar el historial del paciente Para 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:
// 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().
$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_medico FROM consultas_medicas Inner Join pacientes ON consultas_medicas.id_paciente = pacientes.id_paciente Inner Join medicos ON consultas_medicas.id_medico = medicos.id_medico WHERE 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. |
No hay comentarios.:
Publicar un comentario