Practica 2 - Clase2
Practica 2 - Clase2
Practica 2 - Clase2
Vamos a ver como generar un reporte en PDF obteniendo la información de una base
de datos.
El reporte que se generará contendrá un listado de facultades que pertenecen a una
determinada universidad, esta información sacada de una base de datos.
La base de datos a utilizar es MySQL 5.x.x, así que es necesario agregar al classpath de
tu proyecto el MySQL Conector, junto con todas las librerías necesarias (practica 1).
Una vez hecho esto, ha comenzar a codificar el JRXML, primero hay que crear el
documento y pasarle dos parámetros, el primero es el id de la universidad que
queremos generar el reporte, y el segundo parámetro es la url donde esta la imagen
del logotipo de la universidad, hasta ahora tenemos.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report
Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd
">
<jasperReport
name="plantilla"
pageWidth="595"
pageHeight="842"
leftMargin="20"
rightMargin="20"
topMargin="20"
bottomMargin="20">
<parameter name="P_ID_UNIVERSIDAD"
class="java.lang.String"/>
<parameter name="LOGO_URL" class="java.lang.String"/>
</jasperReport>
Base de Datos
La estructura de la base de datos es muy simple, consta de dos tablas, una se llama
Universidades y la otra se llama Facultades, la tabla Universidades solo tiene tres
campos, el id, el nombre de la universidad y el domicilio, la tabla facultades contiene
cinco campos, el id, facultad, director, total de alumnos y una relación a la tabla
universidades, a continuación muestro el SQL de la base de datos.
--
-- Base de datos: `test`
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `facultades`
--
--
-- Volcar la base de datos para la tabla `facultades`
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `universidades`
--
--
-- Filtros para las tablas descargadas (dump)
--
--
-- Filtros para la tabla `facultades`
--
ALTER TABLE `facultades`
ADD CONSTRAINT `facultades_ibfk_1` FOREIGN KEY
(`id_universidad`) REFERENCES `universidades`
(`id_universidad`) ON DELETE CASCADE ON UPDATE CASCADE;
El siguiente paso es hacer el Query con el que se llenará la información, en este caso
será el siguiente.
Sacamos la fecha del sistema para mostrar como dar formato a una fecha en
JasperReport. Ahora hay que introducir el Query al reporte y pasarle el parámetro
necesario para que podamos sacar dinámicamente, desde Java, la universidad que
queramos.
<queryString><![CDATA[
SELECT U.nombre AS universidad, U.domicilio,
CURDATE() AS fecha, F.facultad, F.director, F.alumnos
FROM facultades F, universidades U
WHERE U.id_universidad = F.id_universidad
AND U.id_universidad = $P{P_ID_UNIVERSIDAD}]]>
</queryString>
Para poner una imagen se utiliza la etiqueta <image> y la url se le pasa mediante el
parámetro $P{LOGO_URL}.
La siguiente sección es el titulo del documento, aquí se pondra con letras grandes el
nombre de la universidad, el domicilio y la fecha en que se ha generado el reporte,
además de una línea divisoria, esto se hace de la siguiente manera.
<title>
<band height="70">
<textField>
<reportElement
x="0"
y="20"
width="530"
height="30"/>
<textElement>
<font pdfFontName="Helvetica-Bold"
size="20" isBold="true"/>
</textElement>
<textFieldExpression class="java.lang.String"><!
[CDATA[$F{universidad}]]></textFieldExpression>
</textField>
<line direction="TopDown">
<reportElement
x="0"
y="49"
width="530"
height="0"
key="line"/>
<graphicElement stretchType="NoStretch"/>
</line>
<textField>
<reportElement
x="0"
y="50"
width="250"
height="20"
key="textField"/>
<textElement>
<font pdfFontName="Helvetica-Bold"
size="10"/>
</textElement>
<textFieldExpression class="java.lang.String"><!
[CDATA[$F{domicilio}]]></textFieldExpression>
</textField>
<textField pattern="EEEEE dd MMMMM yyyy">
<reportElement
x="260"
y="50"
width="270"
height="20"
key="textField"/>
<textElement textAlignment="Right">
<font pdfFontName="Helvetica-Bold"
size="10"/>
</textElement>
<textFieldExpression class="java.util.Date"><!
[CDATA[$F{fecha}]]></textFieldExpression>
</textField>
</band>
</title>
Ahora la última parte interesante de este tutorial es la sección “detail”. Es aquí donde
se desplegará la información del reporte, esta queda de la siguiente manera.
<detail>
<band height="15">
<textField>
<reportElement x="0" y="0" width="200"
height="13"/>
<textFieldExpression class="java.lang.String">
<![CDATA[$F{facultad}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="205" y="0" width="200"
height="13"/>
<textFieldExpression class="java.lang.String">
<![CDATA[$F{director}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="410" y="0" width="20"
height="13"/>
<textFieldExpression class="java.lang.Integer">
<![CDATA[$F{alumnos}]]>
</textFieldExpression>
</textField>
</band>
</detail>
Como se puede ver, solo se han declarado tres textfields, y se ha impreso en ellas lo
que proviene de la base de datos, esta sección es diferente a todas las demás, pues
esta sección itera el resultset (en este caso) o bien un listado de beans enviado desde
Java.
Ya esta listo el reporte, que al final queda de la siguiente manera.
<parameter name="P_ID_UNIVERSIDAD"
class="java.lang.String"/>
<parameter name="LOGO_URL" class="java.lang.String"/>
<queryString><![CDATA[
SELECT U.nombre AS universidad, U.domicilio,
CURDATE() AS fecha, F.facultad, F.director, F.alumnos
FROM facultades F, universidades U
WHERE U.id_universidad = F.id_universidad
AND U.id_universidad = $P{P_ID_UNIVERSIDAD}]]>
</queryString>
<background>
<band height="41">
<image>
<reportElement
x="500"
y="0"
width="33"
height="38"/>
<imageExpression
class="java.lang.String"><![CDATA[$P{LOGO_URL}]]></imageExp
ression>
</image>
</band>
</background>
<title>
<band height="70">
<textField>
<reportElement
x="0"
y="20"
width="530"
height="30"/>
<textElement>
<font pdfFontName="Helvetica-Bold"
size="20" isBold="true"/>
</textElement>
<textFieldExpression
class="java.lang.String"><![CDATA[$F{universidad}]]></textF
ieldExpression>
</textField>
<line direction="TopDown">
<reportElement
x="0"
y="49"
width="530"
height="0"
key="line"/>
<graphicElement
stretchType="NoStretch"/>
</line>
<textField>
<reportElement
x="0"
y="50"
width="250"
height="20"
key="textField"/>
<textElement>
<font pdfFontName="Helvetica-Bold"
size="10"/>
</textElement>
<textFieldExpression
class="java.lang.String"><![CDATA[$F{domicilio}]]></textFie
ldExpression>
</textField>
<textField pattern="EEEEE dd MMMMM yyyy">
<reportElement
x="260"
y="50"
width="270"
height="20"
key="textField"/>
<textElement textAlignment="Right">
<font pdfFontName="Helvetica-Bold"
size="10"/>
</textElement>
<textFieldExpression
class="java.util.Date"><![CDATA[$F{fecha}]]></textFieldExpr
ession>
</textField>
</band>
</title>
<detail>
<band height="15">
<textField>
<reportElement x="0" y="0" width="200"
height="13"/>
<textFieldExpression
class="java.lang.String">
<![CDATA[$F{facultad}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="205" y="0"
width="200" height="13"/>
<textFieldExpression
class="java.lang.String">
<![CDATA[$F{director}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="410" y="0" width="20"
height="13"/>
<textFieldExpression
class="java.lang.Integer">
<![CDATA[$F{alumnos}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Lo siguiente es compilar el jrxml y generar el pdf mediante java, esto es muy sencillo y
se logra con muy pocas lineas de código.
package pruebas;
/**
* Generar un reporte con Jasper Report
* Por Crysfel Villa Roman
* 14/01/2008
*
* */
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
//5-Cerrar la conexion
conn.close();
System.out.println("Done!");
}catch (Exception e){
System.out.println(e);
e.printStackTrace();
}
}
}
Resumen
Primero es necesario conectarse a la base de datos, puede ser cualquier base de datos,
pero en este ejemplo es MySQL.
El segundo paso es compilar el reporte.
El tercer paso es llenar el reporte con la información de la base de datos y pasarle los
parámetros necesarios.
El cuarto paso es exportarlo al formato deseado.
Por ultimo se cierra la conexión a la base de datos.