5.confección de informes

217
Desarrollo de interfaces: 5.CONFECCIÓN DE INFORMES Jose Alberto Benítez Andrades [email protected] www.indipro.es @indiproweb @jabenitez88 1 Jose Alberto Benítez Andrades– [email protected] - @indiproweb

Upload: jose-benitez-andrades

Post on 12-Jun-2015

1.292 views

Category:

Technology


7 download

DESCRIPTION

JasperReports iReport

TRANSCRIPT

Page 1: 5.confección de informes

1

Desarrollo de interfaces: 5.CONFECCIÓN DE INFORMES

Jose Alberto Benítez [email protected]

@indiproweb@jabenitez88

Jose Alberto Benítez Andrades– [email protected] - @indiproweb

Page 2: 5.confección de informes

2

CONFECCIÓN DE INFORMES – iReport Y JasperReports

JasperReports es el más popular motor de creación de informes en código abierto. Está escrito completamente en Java y es capaz de utilizar los datos procedentes de cualquier tipo de fuente de datos y presentar los documentos con precisión de píxeles, lo cuales se pueden ver, imprimir o exportar en una variedad de formatos de documentos incluyendo HTML, PDF, Excel, OpenOffice y Word.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 3: 5.confección de informes

3

CONFECCIÓN DE INFORMES – iReport Y JasperReports

iReport es un diseñador gratuito y de código abierto para JasperReports. Crea diseños muy sofisticados que contienen gráficos, imágenes, subinformes, tablas de referencias cruzadas y mucho más. Puede acceder a datos a través de JDBC, TableModels, JavaBeans, XML, Hibernate, CSV, y fuentes personalizadas y luego publicar estos informes en formato PDF, RTF, XML, XLS, CSV, HTML, XHTML, texto, DOCX, u OpenOffice.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 4: 5.confección de informes

4

iReport – INSTALACIÓN

http://community.jaspersoft.com/download

Debemos descargar iReportDesigner y JasperReports Library.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 5: 5.confección de informes

5

iReport – Creación de un informe

Suponiendo que tenemos instalado un servidor de MySQL en nuestro ordenador (http://dev.mysql.com/downloads/mysql/)

En primer lugar creamos una pequeña base de datos, la llamamos como queramos y dentro introducimos una tabla con unos registros.

CREATE TABLE participantes ( ID bigint(21) NOT NULL, NOMBRE varchar(100) NOT NULL, USERNAME varchar(100) NOT NULL, PASSWORD varchar(100) NOT NULL, COMENTARIOS varchar(100) default NULL, PRIMARY KEY (ID) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 6: 5.confección de informes

6

iReport – Creación de un informeinsert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (1,'Participante 1','par1user','part1pass','comentarios participante 1');insert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (2,'Participante 2','par2user','part2pass','comentarios participante 2');insert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (3,'Participante 3','par3user','part3pass','comentarios participante 3');insert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (4,'Participante 4','par4user','part4pass','comentarios respecto al participante 4');insert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (5,'Participante 5','par5user','part5pass','sin comentarios para el participante 5');insert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (6,'Participante 6','par6user','part6pass',NULL);insert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (7,'Participante 7','par7user','part7pass','comentatios participante 7');insert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (8,'Participante 8','par8user','part8pass','comentarios participante 8');insert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (9,'Participante 9','par9user','part9pass','comentarios participante 9');insert into participantes(ID,NOMBRE,USERNAME,PASSWORD,COMENTARIOS) values (10,'Participante 10','par10user','part10pass',NULL);

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 7: 5.confección de informes

7

iReport – Creación de un informe

Una vez hemos creado nuestra base de datos MySQL, abrimos el iReport. Creamos un datasource clickando en el icono

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 8: 5.confección de informes

8

iReport – Creación de un informe

Se abrirá la ventana de Connections / Datasources y clickamos en New

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 9: 5.confección de informes

9

iReport – Creación de un informe

Seleccionamos Database JDBC Connection

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 10: 5.confección de informes

10

iReport – Creación de un informe

Damos un nombre cualquiera a la conexión.

Seleccionamos el JDBC Driver de MySQL

En JDBC URL indicamos el nombre de nuestra BBDD

Insertamos los datos de nuestro login.

Pulsamos Test para comprobar que todo funciona correctamente.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 11: 5.confección de informes

11

iReport – Creación de un informe

Ahora nos dirigimos al menú superior File > New… y en Report seleccionamos una plantilla (yo he seleccionado Wood) y pulsamos Launch Report Wizard

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 12: 5.confección de informes

12

iReport – Creación de un informe

Posteriormente realizaremos 6 pasos:

1. Selección de la ubicación en la que se guardará nuestro reporte.2. Selección del datasource e introducción del query para obtener los

datos que nos interesan.3. Selección de los datos que queremos mostrar en el reporte.4. Creación de grupos para el informe ( en este primer ejemplo no

probaremos esto).5. Selección del layout o acomodo de los datos en el reporte6. Felicitación por terminar nuestro informe.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 13: 5.confección de informes

13

iReport – Creación de un informe

Los pasos interesantes son el 3 y el 4, así que será en estos en los que nos enfocaremos más.

El paso 1 se realiza de forma automática, así que no tenemos mucho que hacer en él. En el paso 2 (en donde comenzamos) seleccionamos el directorio en el que queremos guardar nuestro reporte y el nombre que tendrá.

Nota: La extensión de documentos de reportes generados por JasperReports es ".jrxml" que significa "jasper reports xml", y es un documento xml que contiene los datos para generar un archivo compilado (".jasper") que es el que usaremos principalmente en nuestras aplicaciones Java (aunque también podriamos optar por compilar nuestro archivo ".jrxml" desde la misma aplicación Java y así generar el archivo ".jasper" correspondiente).

En este momento no importa mucho en donde guardemos el archivo que se generará, ya que posteriormente tendremos que moverlo para que nuestra aplicación java pueda encontrarlo. Por mi parte llamaré al archivo “ReportePruebaCurso"

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 14: 5.confección de informes

14

iReport – Creación de un informe

Hacemos clic en el botón "Next" para continuar con el paso 3. En este paso debemos seleccionar el datasource desde el que los datos del reporte serán tomados. Por default está seleccionado el "Empty datasource". Así que nosotros seleccionamos el datasource "Conexion MySQL Pruebas" (el datasource que creamos anteriormente).

Al hacer el cambio del datasource veremos que aparece un textarea con el título "Query(SQL)" y en la parte inferior debemos tener un mensaje de error que dice "Invalid query". (IMAGEN EN DIAPO SIGUIENTE)

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 15: 5.confección de informes

15

iReport – Creación de un informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 16: 5.confección de informes

16

iReport – Creación de un informe

Esto ocurre porque, efectivamente, en el textarea no tenemos una consulta válida (de hecho no tenemos ninguna). Por lo que ahora corregiremos eso. Para esto tenemos 3 opciones:

1. Escribir una consulta nosotros mismos de forma directa.2. Cargar una consulta que tengamos guardada en algún archivo .sql o .txt.3. Crear una consulta usando el "diseñador de consultas".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 17: 5.confección de informes

17

iReport – Creación de un informe Nosotros haremos uso del diseñador de consultas. Hacemos clic en el botón

"Design query" con lo que se abrirá una nueva ventana que está dividida en tres secciones.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 18: 5.confección de informes

18

iReport – Creación de un informe

La primer sección es la de la estructura de la consulta. Aquí básicamente podremos cambiar entre las sentencias que estamos editando (SELECT, WHERE, ORDER BY, etc.). La segunda sección es la de los elementos de nuestra base de datos (tablas, vistas, y temporales locales). Aquí podremos seleccionar los elementos de los que queremos obtener datos para la consulta. Finalmente la tercer sección nos muestra los elementos que hemos seleccionado de la segunda sección para que podamos seleccionar los datos a obtener.

La consulta que haremos será para obtener todos los datos de la tabla "participantes", con excepción del "ID". Para esto hacemos doble clic sobre el nombre de la tabla "participantes" en la segunda sección de la ventana que tenemos abierta. Con esto aparecerá en la tercer sección otra ventana con el título "participantes" y un conjunto de checkboxes, cada uno con un campo de nuestra tabla. Para generar la consulta que nos interesa solamente seleccionamos todos los checkboxes (con excepción del "ID") y veremos que la consulta se genera en la primer sección. Ya solo damos clic en el botón "OK".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 19: 5.confección de informes

19

iReport – Creación de un informe

Con esto ya tendremos nuestra consulta en el textarea correspondiente y podemos continuar con el paso 4, para lo que hacemos clic en el botón "Next".

En este paso solo tenemos que seleccionar cuáles campos del query generado en el paso anterior queremos que se muestren en el reporte. Como nosotros queremos que se muestren todos pasamos todos los campos del lado izquierdo al lado derecho y hacemos clic en el botón "Next".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 20: 5.confección de informes

20

iReport – Creación de un informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 21: 5.confección de informes

21

iReport – Creación de un informe

Ahora en el paso 5 debemos seleccionar cómo queremos que los datos sean agrupados. Esto lo explicaré en algún otro post, pero por el momento dejemos todo en blanco y demos clic en el botón "Next".

El último paso es el solamente una felicitación por haber creado un nuevo informe.

Ahora hacemos clic en el botón "Finish" y ya podremos ver la plantilla de nuestro informe.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 22: 5.confección de informes

22

iReport – Creación de un informe

Si queremos ver como se verá el reporte final, en este caso, podemos ver un preview con los datos reales si cambiamos a la vista de "preview" en la ventana del editor.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 23: 5.confección de informes

23

iReport – Creación de un informe

Al hacer clic en la pestaña de "preview", nuestro reporte se compilará y se mostrará. En este caso el reporte puede ser pre-visualizado porque las siguientes condiciones se cumplen:

Tenemos una base de datos poblada (esto es muy importante, ya que si no tiene datos obtendremos un mensaje de error).

Tenemos un datasource configurado para esta base de datos. Nuestro reporte hace una consulta directa a esta base de datos a través del

datasource anterior. El reporte está preparado para mostrar los datos recuperados

anteriormente. Algo importante que ocurre al hacer este preview es que el reporte se

compila generando el archivo “ReportePruebaCurso.jasper" el cual es el archivo que usaremos desde la aplicación Java que crearemos en un momento.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 24: 5.confección de informes

24

iReport – Creación de un informe

Si queremos compilar nuestro reporte de forma manual podemos hacer clic en el botón "Compile Report" de la vista de diseño:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 25: 5.confección de informes

25

iReport – Creación de un informe

Haremos algunas modificaciones para que este reporte se vea un poco mejor: primero cambiaremos el título que dice "Wood Title" por "Reporte de Participantes", cambiamos el color de texto a negro, y eliminamos el fondo y el subtitulo que tiene.

Además cambiamos el título de cada una de las columnas por algo más claro. Por ejemplo, podemos cambiar el título de la columna "participantes_USERNAME" a "Usuario", "participantes_NOMBRE" a "Nombre", etc.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 26: 5.confección de informes

26

iReport – Creación de un informe

Ahora que tenemos un reporte que nos agrada (o al menos que no se ve tan mal) veremos cómo generar este reporte desde una aplicación Java.

Lo primero que haremos es crear un nuevo proyecto en NetBeans. Para esto vamos al menú "File -> new Project...". En la ventana de nuevos proyectos seleccionamos la categoría "Java" y de tipo de proyecto seleccionamos "Java Application" y hacemos clic en el botón "Next". En la siguiente ventana introducimos el nombre de nuestro proyecto y dejamos seleccionada la opción "Create Main Class" y "Set as Main Project".

Hacemos clic en el botón "Finish" para que nuestro proyecto se genere. Lo que haremos a continuación es crear una biblioteca que contenga los archivos jars básicos necesarios de JasperReports. De esta forma no tendremos que agregar cada uno de los jars cada vez que necesitemos usar JasperReports en un proyecto. Además si actualizamos la versión del API que usamos, solo debemos actualizar esta bibliotec

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 27: 5.confección de informes

27

iReport – Creación de un informe

Clickamos en Tools -> libraries

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 28: 5.confección de informes

28

iReport – Creación de un informe Con esto se abrirá la

ventana del "Library Manager". En esta ventana hacemos clic en el botón "New Library":

En la ventana que se abre escribimos el nombre de la nueva biblioteca (en mi caso será "JasperReports") y en el tipo de la biblioteca seleccionamos la opción "Class Libraries".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 29: 5.confección de informes

29

iReport – Creación de un informe Al hacer clic en el botón

"OK" regresaremos al "Library Manager" y tendremos nuestra nueva biblioteca creada. Pero aún nos hace falta agregar los archivos jars que conformarán esta biblioteca. Nos aseguramos que la pestaña "Classpath" esté seleccionada y hacemos clic en el botón "Add Jar/Folder" situado a la derecha. Se abrirá un cuadro de dialogo para que seleccionemos los jars que queremos agregar.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 30: 5.confección de informes

30

iReport – Creación de un informe Navegamos hasta el directorio en el que tenemos los jars de JasperReports que bajamos anteriormente. Para

que los ejemplos que haremos más adelante (en los siguientes posts) funcionen, debemos agregar a la biblioteca los siguientes jars:

jasperreports-3.7.6.jar jasperreports-3.7.6-javaflow.jar jasperreports-fonts-3.7.6.jar commons-beanutils-1.8.0.jar commons-collections-2.1.1.jar commons-digester-1.7.jar commons-logging-1.0.4.jar commons-javaflow-20060411.jar groovy-all-1.7.5.jar iText-2.1.7.jar png-encoder-1.5.jar poi-3.6.jar

Algunos de estos jars se encuentran en el directorio "dist" y otros en el directorio "lib" del archivo .zip de JasperRepots que bajamos anteriormente.

Hacemos clic en el botón "Add Jar/Folder" y con esto tendremos lista nuestra biblioteca "JasperReports" para agregarla a nuestro proyecto.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 31: 5.confección de informes

31

iReport – Creación de un informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 32: 5.confección de informes

32

iReport – Creación de un informe Hacemos clic en el botón "OK" para regresar al ambiente de trabajo.

Ahora hacemos clic derecho en el nodo "Libraries" de la ventana "Projects". Con esto se abrirá un menú contextual con 4 opciones, seleccionamos la opción "Add Library..."

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 33: 5.confección de informes

33

iReport – Creación de un informe En la ventana que se abre seleccionamos la biblioteca que creamos

anteriormente ("JasperReports") y hacemos clic en el botón "Add Library". Al hacer esto veremos se agregar al nodo "Libraries" de nuestro proyecto todos los jars que tiene nuestra biblioteca.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 34: 5.confección de informes

34

iReport – Creación de un informe Ahora debemos recoger el fichero ReportePruebas.jasper que se generó

hace unas diapositivas y lo colocamos en el directorio raíz del proyecto de NetBeans que acabamos de crear (la raíz del proyecto es el directorio en el que se encuentran los subdirectorios "nbproject", "src", entre otros). Copiamos también la imagen wood.jpg si la hemos mantenido en nuestro informe.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 35: 5.confección de informes

35

iReport – Creación de un informe Lo primero que debemos hacer es agregar el conector de mysql al proyecto

JAVA. Para ello debemos descargar el conector de mysql JDBC (http://www.mysql.com/downloads/connector/j/ ). Una vez descargada la agregaremos a la biblioteca de nuestro proyecto.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 36: 5.confección de informes

36

iReport – Creación de un informe

Lo siguiente que debemos hacer ahora es crear una conexión a la base de datos que creamos anteriormente.

public static void main(String[] args) throws Exception { // TODO code application logic here Class.forName("com.mysql.jdbc.Driver"); Connection conexion = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/pruebascurso", "root", "cursomysql"); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 37: 5.confección de informes

37

iReport – Creación de un informe Lo siguiente que debemos hacer es cargar el archivo ".jasper" generado

anteriormente y colocarlo en un objeto "net.sf.jasperreports.engine.JasperReport". Para esto hacemos uso de la clase de utilidad "net.sf.jasperreports.engine.util.JRLoader":

JasperReport reporte = (JasperReport) JRLoader.loadObject("RepotePruebaCurso.jasper");

Ahora el objeto "reporte" contiene la definición del reporte, pero aún hace falta que llenemos este reporte con los datos que obtendrá de la base de datos. Para esto usamos la clase "net.sf.jasperreports.engine.JasperFillManager". Esta clase tiene un método estático, "fillReport", que nos permite llenar el reporte con datos obtenidos de distintas fuentes de datos (una de estas fuentes es la sentencia SQL que escribimos al generar el reporte con el wizard en iReports y la conexión que usaremos en un momento, veremos qué otras fuentes de datos existen y cómo usarlos en los siguientes posts). En este caso la fuente de datos es la conexión directa a la base de datos que creamos anteriormente (el objeto conexion):

JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, conexion);

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 38: 5.confección de informes

38

iReport – Creación de un informe Pasamos "null" como segundo parámetro porque no estamos pasando

ningún parámetro al reporte (esto también lo veremos después).

El objeto "JasperPrint" que obtenemos como resultado de la invocación del método "fillReport" es la representación de nuestro reporte (ahora con datos) que podemos mandar a imprimir, mostrar en pantalla (si estamos usando una aplicación swing o awt), o, como en este caso, guardarlo en un archivo.

Si están haciendo una aplicación swing y quieren mostrar este reporte directamente en un componente pueden pasar el objeto "JasperPrint" que acabamos de crear como parámetro a un nuevo objeto "net.sf.jasperreports.view.JasperViewer", el cual es un componente swing, y agregar este último a un panel.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 39: 5.confección de informes

39

iReport – Creación de un informe Para guardar este reporte a un archivo debemos usar un

"net.sf.jasperreports.engine.JRExporter". "net.sf.jasperreports.engine.JRExporter" es una interface, y las clases que la implementan nos permiten generar el reporte en distintos formatos de una forma sencilla. Veremos cómo generar los reportes en los siguientes formatos: PDF HTML CSV RTF TXT XLS XML XLSX DOCX PPTX

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 40: 5.confección de informes

40

iReport – Creación de un informe Primero declaramos una referencia a un objeto de tipo "JRExporter" de la

siguiente forma:JRExporter exporter =

Será esta referencia la que usaremos de ahora en adelante. Para que nuestro reporte sea guardado en formato PDF creamos un objeto de tipo "net.sf.jasperreports.engine.export.JRPdfExporter" y lo asignamos a nuestra referencia exporter:

JRExporter exporter = new JRPdfExporter();

Ahora, las siguientes líneas son comunes no importando el formato en el que vaya a quedar nuestro reporte:

exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE,new java.io.File("reportePDF.pdf"));exporter.exportReport();

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 41: 5.confección de informes

41

iReport – Creación de un informe La primer línea asigna a nuestro objeto "exporter" el "jasperPrint" (el reporte

con datos) que creamos anteriormente. La segunda línea le dice al "exporter" cuál será el nombre del archivo generado (en este caso "reportePDF.pdf"). Recuerden cambiar el nombre y la extensión del archivo cada vez que cambiemos de formato.

La última línea es la que realiza el proceso de exportación. Si ahora ejecutamos nuestra aplicación veremos que en el directorio raíz del

proyecto se ha creado un archivo llamado "reportePDF.pdf":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 42: 5.confección de informes

42

iReport – Creación de un informe Ahora, para que nuestro reporte sea exportado a formato HTML cambiamos la

línea:JRExporter exporter = new JRPdfExporter();PorJRExporter exporter = new JRHtmlExporter();• y el nombre del archivo de "reportePDF.pdf" a "reporteHTML.html". Al ejecutar

nuevamente nuestra aplicación tendremos veremos que se genera el archivo "reporteHTML.html" en el directorio raíz de la aplicación:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 43: 5.confección de informes

43

iReport – Creación de un informe Como pudimos ver, con un par de modificaciones pudimos hacer que nuestro

reporte se generara en un formato completamente distinto. Con el resto de los formatos es igual de simple. Usamos las siguientes clases para generar los reportes en los siguientes formatos:

PDF: net.sf.jasperreports.engine.exportJRPdfExporter HTML: net.sf.jasperreports.engine.exportJRHtmlExporter CSV: net.sf.jasperreports.engine.exportJRCsvExporter RTF: net.sf.jasperreports.engine.exportJRRtfExporter XLS: net.sf.jasperreports.engine.exportJRXlsExporter XML: net.sf.jasperreports.engine.exportJRXmlExporter TXT: net.sf.jasperreports.engine.exportJRTextExporter XLSX: net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter DOCX: net.sf.jasperreports.engine.export.ooxml.JRDocxExporter PPTX: net.sf.jasperreports.engine.export.ooxml.JRPptxExporter

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 44: 5.confección de informes

44

iReport – Creación de un informe Para generar archivos .txt tendrán que agregar, además, estas dos líneas:

exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, 12);//text exporter

exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, 12);//text exporter

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 45: 5.confección de informes

45

iReport – Creación de un informe PARTE 2: Uso de DataSources

Personalizados

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 46: 5.confección de informes

46

iReport – Creación de un informe Ahora veremos cómo generar nuestros reportes sin hacer uso de una conexión.

Esto puede ser muy útil en los casos en los que ya tengamos los datos en memoria y no necesitemos realizar una conexión a la base de datos; o en el caso en que, por alguna razón ajena a nosotros, no podamos obtener la conexión.

Para poder hacer esto se nos proporciona una interface: "net.sf.jasperreports.engine.JRDataSource". Esta interface tiene solo dos métodos:

getFieldValue(JRField jrField)next()

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 47: 5.confección de informes

47

iReport – Creación de un informe Creamos un nuevo proyecto en NetBeans (menú "File -> New Project..."). En la

ventana de nuevos proyectos seleccionamos la categoría "Java" y como tipo de proyecto seleccionamos "Java Application" y hacemos clic en el botón "Next". En la siguiente ventana introducimos el nombre de nuestro proyecto y dejamos seleccionada las opciones "Create Main Class" y "Set as Main Project".

Para que podamos pasar datos a nuestro reporte es necesario que utilicemos un datasource. En el ejemplo anterior veíamos que el datasource que usábamos era la base de datos y la conexión a la misma. En esta ocasión el datasource será una de nuestras clases. Esta clase deberá implementar la interface "JRDataSource" y contendrá la lógica para pasar los datos correspondientes a nuestro reporte.

Creamos una nueva clase haciendo clic derecho sobre el nodo "Source Packages" de la ventana "Projects", o sobre el paquete que ya tenemos creado, y en el menú contextual que se abre seleccionamos la opción "New -> Java Class...".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 48: 5.confección de informes

48

iReport – Creación de un informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 49: 5.confección de informes

49

iReport – Creación de un informe En la ventana que se abre escribimos como en nombre de la nueva clase

"Participante" y presionamos el botón "Finish". Con esto veremos en la ventana de nuestro editor la nueva clase "Participante".

Esta clase "Partcipante" representará los datos que se mostrarán en el reporte, tal como en el ejemplo anterior cada uno de los registros de la tabla "participantes" representaba una fila en el reporte final, cada objeto participante que creemos representará una fila en el nuevo reporte.

Agreguemos los siguientes atributos a nuestra clase:

private int id; private String nombre; private String username; private String password; private String comentarios;

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 50: 5.confección de informes

50

iReport – Creación de un informe Además agregamos sus getters y sus setters y dos constructores, uno sin argumentos y uno que reciba como

argumentos todas las propiedades declaradas anteriormente.public class Participante{ private int id; private String nombre; private String username; private String password; private String comentarios;

public Participante() { } public Participante(int id, String nombre, String username, String password, String comentarios) { this.id = id; this.nombre = nombre; this.username = username; this.password = password; this.comentarios = comentarios; }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 51: 5.confección de informes

51

iReport – Creación de un informe public String getComentarios() { return comentarios; }

public void setComentarios(String comentarios) { this.comentarios = comentarios; }

public int getId() { return id; }

public void setId(int id) { this.id = id; }

public String getNombre() { return nombre; }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 52: 5.confección de informes

52

iReport – Creación de un informe public void setNombre(String nombre) { this.nombre = nombre; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }}

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 53: 5.confección de informes

53

iReport – Creación de un informe• Ahora, antes de seguir con nuestro

código Java, pasaremos a crear la plantilla de nuestro reporte con iReport, por lo que abrimos esta herramienta.

• En esta ocasión no haremos uso de un wizard para crear el reporte, sino que lo haremos desde cero.

• Para crear el nuevo reporte vamos el menú "File -> New...". En la ventana que se abre seleccionamos uno de los formatos "Blank" y presionamos el botón "Open this Template":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 54: 5.confección de informes

54

iReport – Creación de un informe• Después introducimos el nombre del reporte, yo lo llamaré "reporte2.jrxml", y la

ubicación en la que se guardará. Recomiendo que en esta ocasión guardemos el reporte en el directorio raíz del proyecto de NetBeans que acabamos de crear. Hacemos clic en el botón "Next" y se nos mostrará un mensaje de felicitación por haber creado un nuevo reporte. Cuando presionen el botón "Finish" verán una hoja dividida en 7 u 8 diferentes porciones horizontales llamadas bandas.

• Cuando generamos nuestro reporte final con datos, cada una de estas bandas se comporta de una forma distinta. Algunas aparecen solo al principio o al final del reporte, otras aparecen con cada nueva fila que se le agrega, otras solo al final de los datos, etc.

• La plantilla de reportes está dividida en 10 bandas predefinidas. Una banda siempre tiene el mismo ancho que la página. Sin embargo el alto de algunas de las bandas puede variar durante la fase de llenado de datos, aún si establecimos un alto en el momento del diseño.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 55: 5.confección de informes

55

iReport – Creación de un informe• Las bandas existentes son:

Background Title Page Header Column Header Detail 1 Column Footer Page Footer Last Page Footer Summary No Data

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 56: 5.confección de informes

56

iReport – Creación de un informe Lo primero que haremos es agregar texto a nuestro reporte. En iReport existen

dos tipos de texto: texto estático y texto dinámico (también llamado expresiones). El texto estático es aquel que no cambia, mientras que las expresiones son como etiquetas que le indican a JasperReports que debe reemplazarlas por algún valor al momento de generar el reporte final.

Existen 3 tipos de expresiones:

Campos (fields) representados con "$F{nombre_campo}". Variables representadas por "$V{nombre_variable}". Parámetros representados por "$P{nombre_parámetro}".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 57: 5.confección de informes

57

iReport – Creación de un informe Cada uno de estos tipos de expresiones tiene un uso particular:

Los campos ("$F{}") le dicen al reporte dónde colocará los valores obtenidos a través del datasource. Por ejemplo, nuestro objeto "Partcipante" tiene un atributo llamado "username". Usando una expresión de campo indicamos en cuál parte o sección del reporte debe aparecer el valor de ese atributo usando "$F{username}". Esto quedará más claro un poco más adelante.

Los parámetros ("$P{}") son valores que usualmente se pasan al reporte directamente desde el programa que crea el JasperPrint del reporte (en nuestra aplicación Java). Aunque también existen algunos parámetros internos que podemos leer pero no modificar. Para hacer uso de estos parámetros simplemente indicamos el nombre del parámetro en el lugar que queremos colocarlo. Pueden encontrar los nombres y significados de los parámetros internos en la documentación de JasperReports.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 58: 5.confección de informes

58

iReport – Creación de un informe Las variables ("$V{}") son objetos usados para almacenar valores como los

resultados de cálculos. Al igual que con los parámetros, JasperReports tiene algunas variables internas que podemos leer. Pueden encontrar los nombres y significados de las variables la documentación de JasperReports.

Cada uno de estos elementos tiene un nombre, un tipo (que debe corresponder con un tipo de objeto Java como String o Integer), y una descripción opcional. Además deben ser registrados para poder ser usados en tiempo de diseño y que puedan ser entendidos al momento de compilar el reporte, y por lo tanto para que nuestro reporte funcione correctamente en tiempo de ejecución. Esto lo veremos un poco más adelante.

Regresemos a donde nos quedamos. Queremos agregar un texto estático a nuestro reporte a modo de título. Para esto debemos agregar un elemento llamado "Static Text". Los elementos que podemos agregar a nuestros reportes están en una ventana llamada "Palette", que se encuentra en la parte derecha de iReport, bajo la categoría "Report Elements". Si no pueden ver la ventana "Palette" presionen las teclas "Ctrl + Shift + 8":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 59: 5.confección de informes

59

iReport – Creación de un informe De esta ventana arrastramos el elemento "Static Text" a la banda "Title". "Title"

es una banda que solo aparece en la parte superior de la primer página. Por lo que nos sirve para colocar el título del reporte y/o el nombre y logo de nuestra empresa.

Una vez que hayamos colocado el texto estático en la banda correspondiente y mientras aún esté seleccionado, modificamos sus propiedades usando la ventana de propiedades del elemento y la barra de formato de texto. También podemos abrir otra ventana que nos ayude a alinear y controlar el alto y el ancho de los elementos yendo al menú "Window -> Formatting Tools".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 60: 5.confección de informes

60

iReport – Creación de un informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 61: 5.confección de informes

61

iReport – Creación de un informe Ahora agregamos los encabezados de las columnas en las que se mostrarán los datos que

pasaremos al reporte. Agregamos estos nombres en la banda "Column Header", la cual se repetirá en cada página antes de mostrar los datos de las columnas.

Agregaremos las columnas "Nombre", "Usuario", "Contraseña", y "Comentarios". Por lo que nuevamente arrastramos un elemento "Static Text" para cada una de las columnas. También podemos ajustar el alto de esta banda para que se ajuste al de nuestro texto, ya sea moviéndola directamente en el diseñador, o desde la ventana de propiedades:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 62: 5.confección de informes

62

iReport – Creación de un informe Nuestro reporte ya casi está terminado, ahora solo nos queda agregar los campos en los

que se mostrarán los datos que pasaremos al reporte en un momento. Para que estos campos puedan ser reemplazados por el valor real es necesario que usemos las expresiones (texto dinámico) de las que hablé anteriormente. Para esto definiremos un "field" para cada uno de los campos que queramos mostrar (en este caso serán los mismos campos para los que definimos las cabeceras de las columnas).

Los fields deben definirse antes de poder ser usados. Esta definición incluye el nombre del field y su tipo. Los fields (así como el resto de las expresiones) se definen en la ventana "Report Inspector" a la izquierda del diseñador del reporte. Ahí existe un nodo llamado "Fields" que es donde se encuentran los fields que hemos definido y que por lo tanto podemos usar.

Hacemos clic derecho en el nodo "Fields" de la ventana "Report Inspector". Con esto se abre un menú contextual. Seleccionamos la opción "Add Field" (la única habilitada).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 63: 5.confección de informes

63

iReport – Creación de un informe Con esto se agregará un field llamado "field1" que por default es de tipo "java.lang.String".

Cambiamos el nombre de este campo por "nombre" usando la ventana de propiedades. Esto es importante porque donde pongamos este campo será en donde se muestre el valor del campo nombre de nuestros objetos Participantes.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 64: 5.confección de informes

64

iReport – Creación de un informe Hacemos lo mismo para el resto de los campos ("username", "password", "comentarios",

"id"). Hay que tener cuidado cuando agreguemos el field "id". Si recuerdan, en la definición de la clase "Participante" la propiedad "id" está definida como "int". Sin embargo, a JasperReports solo podemos pasarle objetos para ser usados como valores, por lo que será necesario cambiar el tipo de la clase ("Field Class en la ventana de propiedades) a "java.lang.Integer" (aunque en realidad no mostraremos el "id" en este ejemplo).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 65: 5.confección de informes

65

iReport – Creación de un informe Ahora debemos indicar en qué parte de nuestro reporte queremos que

se muestren los valores correspondientes a los atributos de los objetos "Participante" que le pasemos. Para eso simplemente arrastramos los fields correspondientes al lugar en el que queremos que se muestren (arrastramos el field "nombre" a donde queremos que se muestre el atributo "nombre", el campo "username" en donde queremos que se muestre el atributo "username", etc.) desde el "Report Inspector". Al arrastrar los fields, iReport agregará automáticamente un encabezado para este field, solo borren el encabezado agregado

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 66: 5.confección de informes

66

iReport – Creación de un informe Estos fields los colocaremos en la banda "Detail 1" la cual se repite cada vez que recibe un

nuevo objeto y coloca sus valores en la misma fila (quedará más claro cuando ejecutemos el ejemplo). Al final, el reporte debe quedar de la siguiente forma:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 67: 5.confección de informes

67

iReport – Creación de un informe Por el momento esto es todo lo que necesitamos hacer en iReport para mostrar este

reporte básico. Hacemos clic en el botón "Compile Report" para compilar el reporte y generar su archivo ".jasper" respectivo.

Podemos ver una vista previa del reporte haciendo clic en la pestaña "Preview". Asegúrense de seleccionar el "Empty datasource" antes de ver el preview, de lo contrario les aparecerá un error indicado que el documento no tiene páginas. Al final deben ver algo como esto:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 68: 5.confección de informes

68

iReport – Creación de un informe Los "nulls" aparecen porque no se recuperó ningún valor que coincidiera con el nombre de

ese field usando nuestro datasource (que en este caso está vacío, lo cual solucionaremos a continuación).

Regresamos al NetBeans y ahora crearemos una clase que implemente la interface "JRDataSource" de la que hablé antes. Esta clase será la que usaremos como datasource para nuestro reporte, y la que regresará los valores correspondientes a cada uno de los fields que creamos antes.

Primero agregamos a nuestro proyecto la libreria "JasperReports" que creamos en las primeras diapos de este ppt. En esta ocasión no necesitaremos agregar el jar con el Driver de la base de datos, ya que no usaremos ninguna.

Creamos una nueva clase llamada "ParticipantesDatasource" y hacemos que esta nueva clase implemente la interface "JRDataSource". Podemos hacer que NetBeans implemente de forma automática los métodos de esta interface (proporcionando una implementación vacía) presionando las teclas "Alt + Insert" y seleccionando la opción "Implement Method" en el menú contextual que se abre.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 69: 5.confección de informes

69

iReport – Creación de un informe

Con esto se abrirá una ventana llamada "Generate Implement Methods" en la cual seleccionamos la interface "JRDataSource" para que se seleccionen de forma automática todos sus métodos y hacemos clic en el botón "Generate".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 70: 5.confección de informes

70

iReport – Creación de un informe Ahora agregaremos a nuestra clase un atributo de tipo "java.util.List" llamado

"listaParticipantes" que mantendrá justamente eso: la lista de los participantes de los cuales mostraremos los datos en el reporte. Inicializamos esta lista a un objeto de tipo "java.util.ArrayList", de esta forma:

private List<Participante> listaParticipantes = new ArrayList<Participante>();

• También agregamos un contador llamado "indiceParticipanteActual" de tipo "int", que usaremos enseguida, y lo inicializamos a "-1"; un poco más adelante explicaré por qué este valor:

private int indiceParticipanteActual = -1;

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 71: 5.confección de informes

71

iReport – Creación de un informe Ahora implementaremos el método getFieldValue. Este método recibe un argumento de

tipo JRField. Este parámetro nos indicará por cuál de los "fields" nos está preguntando el reporte.

En la implementación de este método regresaremos los valores correspondientes a cada uno de los atributos de nuestros objetos "Participante" conforme se vayan pidiendo. Por lo que el método queda así:

public Object getFieldValue(JRField jrField) throws JRException{ Object valor = null;

if("nombre".equals(jrField.getName())) { valor = listaParticipantes.get(indiceParticipanteActual).getNombre(); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 72: 5.confección de informes

72

iReport – Creación de un informeelse if("username".equals(jrField.getName())) { valor = listaParticipantes.get(indiceParticipanteActual).getUsername(); } else if("password".equals(jrField.getName())) { valor = listaParticipantes.get(indiceParticipanteActual).getPassword(); } else if("comentarios".equals(jrField.getName())) { valor = listaParticipantes.get(indiceParticipanteActual).getComentarios(); } return valor; }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 73: 5.confección de informes

73

iReport – Creación de un informe Donde básicamente ocurre lo que dije anteriormente: cada vez que el reporte pregunta por

el valor de un atributo del objeto "Participante" actual (al que hace referencia el contador "indiceParticipanteActual") se regresa el valor correspondiente. Esta petición se hace en base al nombre del field que creamos desde iReport.

Ahora tal vez se estén preguntando ¿en qué momento se incrementa el contador?, o ¿cómo sabe JasperReport cuántos participantes existen? Pues bien, ambas cosas ocurren gracias a la implementación del método "next()".

public boolean next() throws JRException{ return ++indiceParticipanteActual < listaParticipantes.size();}public void addParticipante(Participante participante) { this.listaParticipantes.add(participante); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 74: 5.confección de informes

74

iReport – Creación de un informe JasperReport pregunta a este método para saber si existe otro "Participante" en la lista. Este

método es el primero que se llama al generar el reporte. Por lo que el contador debe comenzar en "-1", así cuando este método se llama la primera vez el contador queda en "0", y cuando se invoca al método "getFieldValue" se regresa el objeto Participante del índice adecuado.

Esto es todo lo que necesitamos para que nuestro datasource funcione para generar reportes. Agregaré un método de utilidad a esta clase, llamado "addParticipante", que me permita agregar un nuevo participante a la lista (aunque si lo prefieren pueden agregar el setter de "listaParticipantes")

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 75: 5.confección de informes

75

iReport – Creación de un informe Para finalizar agregaremos en nuestra clase "Main" un ciclo dentro del cual crearemos 10

objetos "Participante", los cuales iremos agregando uno a uno a un objeto de tipo "ParticipantesDatasource":

ParticipantesDatasource datasource = new ParticipantesDatasource();

for (int i = 1; i <= 10; i++) { Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i); datasource.addParticipante(p); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 76: 5.confección de informes

76

iReport – Creación de un informe El resto del código para generar el reporte es similar al de la primera parte de esta

presentación , solo que en esta ocasión en lugar de pasar un objeto de tipo "Connection" al método "fillReport" del "JasperFillManager" pasamos nuestro objeto "ParticipantesDatasource" de esta forma:

JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, datasource);

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 77: 5.confección de informes

77

iReport – Creación de un informe En el progarma principal tendremos el siguiente código public static void main(String[] args) throws Exception { ParticipantesDatasource datasource = new ParticipantesDatasource();

for (int i = 1; i <= 10; i++) { Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i); datasource.addParticipante(p); }

File reporteFichero = new File("reporte2.jasper"); JasperReport reporte = (JasperReport) JRLoader.loadObject(reporteFichero); JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, datasource);

JRExporter exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte2PDF.pdf")); exporter.exportReport(); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 78: 5.confección de informes

78

iReport – Creación de un informe Al ejecutar este código debemos terminar con un archivo llamado "reporte2PDF.pdf" en el

directorio raíz de nuestro proyecto y que tiene el siguiente contenido:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 79: 5.confección de informes

79

iReport – Creación de un informe Podemos ver que los datos importantes (los datos de los "Participantes") aparecen en la

banda "Details 1" (donde colocamos los fields) y que esta banda se repite por cada uno de los participantes de la lista.

Bien, con esto vemos que podemos crear nuestros propios datasources y pasar datos para generar reportes sin la necesidad de una conexión a base de datos. Es bastante sencillo, solamente debemos proporcionar una clase que implemente la interface "JRDataSource" y que regrese los valores correspondientes a los fields del reporte.

Aunque esto ya es bastante fácil y útil, existe una forma aún más simple para crear un datasource, sin la necesitad de implementar la interface "JRDataSource". Esto es gracias a un conjunto de clases que JasperReports ya nos proporciona y realizan básicamente la misma función que la clase "ParticipantesDatasource" que acabamos de crear. Estas clases son:

JRBeanCollectionDataSource JRJpaDataSource JRBeanArrayDataSource

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 80: 5.confección de informes

80

iReport – Creación de un informe Las cuales ya implementan la interface "JRDataSource". Cada una funciona con distintos

tipos de datos, pero en que nos interesa en este momento es "JRBeanCollectionDataSource" que puede convertir una "java.util.Collection" en un DataSource de forma automática. Modificaremos nuestro método "main" para hacer uso de esta clase.

Ahora, en vez de llenar nuestro "ParticipantesDatasource" en el ciclo simplemente llenaremos un "java.util.List":

List listaPariticipantes = new ArrayList();

for (int i = 1; i <= 10; i++) { Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i); listaPariticipantes.add(p);}

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 81: 5.confección de informes

81

iReport – Creación de un informe Y en lugar de pasar un objeto de tipo "Connection" al método "fillReport" del

"JasperFillManager" pasamos un nuevo objeto "JRBeanCollectionDataSource" construido con la lista "listaPariticipantes":

JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaPariticipantes));

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 82: 5.confección de informes

82

iReport – Creación de un informe Al final nuestra clase "Main" queda así:public static void main(String[] args) throws Exception { List listaPariticipantes = new ArrayList();

for (int i = 1; i <= 10; i++) { Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i); listaPariticipantes.add(p); }

JasperReport reporte = (JasperReport) JRLoader.loadObject("reporte2.jasper");

JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaPariticipantes));

JRExporter exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte2PDF_2.pdf")); exporter.exportReport(); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 83: 5.confección de informes

83

iReport – Creación de un informe PARTE 3: Parámetros y Variables

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 84: 5.confección de informes

84

iReport – Creación de un informe En la parte anterior vimos como hacer uso de los Fields para indicar la

posición dentro de nuestro reporte en la que deben quedar los valores que obtenemos de nuestra aplicación Java.

Ahora hablaré de los otros dos tipos de expresiones que proporciona JasperReports: Parameters y Variables. Y la forma en la que podemos usarlos para hacer más dinámicos nuestros reportes.

Para ello seguiremos usando el ejemplo de la segunda parte.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 85: 5.confección de informes

85

iReport – Creación de un informe Abrimos iReport y el reporte de la parte anterior ("reporte2.jrxml"). En

este momento nuestro reporte debe verse como en la siguiente imagen:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 86: 5.confección de informes

86

iReport – Creación de un informe En donde solo tenemos textos estáticos y "fields" para mostrar un

reporte básico de los datos de ciertos participantes. Si lo recuerdan, la salida del reporte al generarlo desde nuestra aplicación Java, era la siguiente:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 87: 5.confección de informes

87

iReport – Creación de un informe Ahora pasaremos a agregar "Parameters" a este

reporte. Como dije en el tutorial anterior: los parámetros son valores que usualmente se pasan al reporte desde el programa que crea el "JasperPrint" del reporte (nuestra aplicación Java) haciendo uso de un "java.util.Map".

En este caso pasaremos dos parámetros: el título del reporte, y el nombre del autor del mismo.

Al igual que con los Fields, para poder hacer uso de un parámetro primero hay que declararlo en el "Report Inspector" (situado en el panel izquierdo del iReport), por lo que nos dirigimos a esta ventana y hacemos clic derecho sobre el nodo "Parameters". Al hacer esto se abrirá un menú contextual. Seleccionamos la opción "Add Parameter" (la única habilitada).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 88: 5.confección de informes

88

iReport – Creación de un informe

• Con esto se agregará un nuevo parámetro llamado "parameter1" de tipo "java.lang.String". Cambiamos en nombre del parámetro en la ventana de propiedades a "titulo" (recuerden que este nombre es el que deberemos usar desde nuestra aplicación Java para establecer el valor del parámetro).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 89: 5.confección de informes

89

iReport – Creación de un informe Agregamos otro parámetro llamado "autor" de la misma forma que

agregamos el de "titulo".

Ahora eliminamos el elemento que teníamos como título del reporte (el que contiene el texto estático "Reporte de Participantes") y lo reemplazamos por el parámetro "titulo" arrastrándolo desde la ventana del "Report Inspector" a la banda "Title".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 90: 5.confección de informes

90

iReport – Creación de un informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 91: 5.confección de informes

91

iReport – Creación de un informe Ajustamos este elemento

para que tenga el mismo formato que el título que teníamos anteriormente.

Ahora agregamos el segundo parámetro ("autor") en la banda "Page Header", la cual se repite en la parte superior de cada una de las páginas (en la primer página aparece después del título), arrastrándolo a esta banda.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 92: 5.confección de informes

92

iReport – Creación de un informe Si dejamos esta expresión tal y como está ("$P{autor}") solo se mostrará en

nombre del autor en la parte superior de cada una de las páginas (por ejemplo si el autor del reporte es "Juan", solo veremos la palabra "Juan" en la parte superior de los reportes). Esto podría no ser claro para quienes revisen este reporte, por lo que queremos indicar de forma explícita que a lo que se refiere el valor de este parámetro es el nombre del autor. Para hacer esto nos dirigimos a la ventana de propiedades de este parámetro (para lo cual debemos tenerlo seleccionado) y buscamos la categoría "Text field properties". Ahí se encuentra una propiedad llamada "Text Field Expression" cuyo valor es "$P{autor}".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 93: 5.confección de informes

93

iReport – Creación de un informe Lo que haremos es editar esta

expresión para anteponer la palabra "Autor: ". Para hacer esto presionamos el botón "...", con lo que se abrirá una ventana que nos permitirá editar la expresión. En esta ventana modificamos la expresión "$P{autor}" para que quede "Autor: " + $P{autor}. Con esto lo que logramos es que a la cadena estática "Autor: " se le concatene el valor de la expresión dinámica "$P{autor}". Por lo que ahora el lo que aparecerá en la parte superior de cada página del reporte será la cadena "Autor: Juan".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 94: 5.confección de informes

94

iReport – Creación de un informe Ahora presionamos el botón "Compile Report" para que se genere el reporte compilado

"reporte2.jasper".

Veamos una vista previa del reporte, para esto hacemos clic en la pestaña "Preview". Nos pedirá los valores de los dos parámetros. Si colocamos para el parámetro "titulo" el valor "Reporte" y para el parámetro "autor" el valor "Alex" el preview que veremos será el siguiente:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 95: 5.confección de informes

95

iReport – Creación de un informe Ahora veremos cómo pasarle estos valores desde nuestra aplicación Java, por lo que abrimos

nuestro IDE de trabajo, NetBeans.

Ahí nos dirigimos a la clase "Main" que creamos la última vez y buscamos la línea en donde creamos nuestro objeto "JasperPrint":

JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaPariticipantes));

Y antes de esta línea crearemos un objeto "java.util.Map" que contendrá nuestros parámetros. Colocaremos el nombre de los parámetros (en este caso "autor" y "titulo") como llave y sus respectivos valores, "Juan" para el autor y "Reporte Participantes" para el título, como valores.

Map<String, Object> parametros = new HashMap<String, Object>();parametros.put("autor", "Juan");parametros.put("titulo", "Reporte Participantes");

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 96: 5.confección de informes

96

iReport – Creación de un informe Y pasamos este "Map" como el segundo parámetro del método "fillReport", al que hasta ahora

le hemos pasado "null":

JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(listaPariticipantes));

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 97: 5.confección de informes

97

iReport – Creación de un informe El código de nuestro método "main" queda así:public static void main(String[] args) throws Exception{ List<Participante> listaPariticipantes = new ArrayList<Participante>(); for (int i = 1; i <= 10; i++) { Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i); listaPariticipantes.add(p); }

JasperReport reporte = (JasperReport) JRLoader.loadObject("reporte2.jasper");

Map<String, Object> parametros = new HashMap<String, Object>(); parametros.put("autor", "Juan"); parametros.put("titulo", "Reporte Participantes");

JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(listaPariticipantes));

JRExporter exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte3PDF.pdf")); exporter.exportReport();}

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 98: 5.confección de informes

98

iReport – Creación de un informe Si ejecutamos nuestro

reporte obtendremos un archivo con el siguiente contenido:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 99: 5.confección de informes

99

iReport – Creación de un informe Como podemos ver los parámetros "titulo" y "autor" han sido reemplazados

por los valores "Reporte Participantes" y "Juan" respectivamente.

Gracias a los parámetros podemos pasar valores (como en este caso cadenas, pero podemos pasar prácticamente cualquier tipo de objeto) a nuestro reporte directamente desde nuestra aplicación Java.

Ahora veremos el último tipo de expresión que JasperReports nos proporciona, las Variables.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 100: 5.confección de informes

100

iReport – Creación de un informe En este caso usaremos dos variables. La primera será una de las variables

internas que ya proporciona JasperReports: PAGE_NUMBER, que nos dice el número de la página actual. En este caso como el reporte solo tendrá una página solo aparecerá el número 1, pero pueden extender el ejemplo para que se generen más páginas.

La segunda variable que usaremos será una variable creada por nosotros mismos y nos mostrará la suma de los puntos de los Participantes (en este momento los Participantes no tienen puntos, por lo que tendremos que agregarlos).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 101: 5.confección de informes

101

iReport – Creación de un informe Lo primero que haremos es modificar la clase "Participante" agregando el

atributo "puntos" de tipo "int" con sus correspondientes setters y getters:

private int puntos;

public int getPuntos(){ return puntos;}

public void setPuntos(int puntos){ this.puntos = puntos;}

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 102: 5.confección de informes

102

iReport – Creación de un informe y en nuestro método "main" agregamos, en el ciclo que crea los objetos

"Participante", el siguiente código para establecer los puntos de cada uno de los Participantes:

p.setPuntos(i);

Ahora regresamos a iReport y agregamos un nuevo Field en la ventana "Report Inspector" llamado "puntos" de tipo "java.lang.Integer". Este field será usado para mostrar los puntos que tiene cada uno de los Participantes.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 103: 5.confección de informes

103

iReport – Creación de un informe Agregamos una columna, dentro de la banda "Details 1", para mostrar este

field:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 104: 5.confección de informes

104

iReport – Creación de un informe Si compilamos nuestro reporte y ejecutamos nuestra aplicación Java

debemos ver un reporte con el siguiente contenido:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 105: 5.confección de informes

105

iReport – Creación de un informe Ahora agregaremos la variable que realizará la suma de los puntos de todos

los Participantes. Para esto agregamos una nueva variable en el nodo "Variables" de la ventana "Report Inspector" haciendo clic derecho sobre este nodo y seleccionando la opción "Add Variable" del menú contextual que se abre.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 106: 5.confección de informes

106

iReport – Creación de un informe Modificamos sus propiedades en la ventana "Properties" cambiando su

nombre a "sumaPuntos", su "Variable Class" a "java.lang.Integer", y "Calculation" a "Sum" (con esto indicamos que la variable mantendrá la suma de los valores que indicaremos más adelante, otras opciones incluyen un contador, el promedio, el valor más alto, etc.).

Ahora indicaremos la suma de cuáles valores son los que queremos que se almacene en este variable. Para eso hacemos clic en el botón "..." de la propiedad "Variable Expression", con lo que se abrirá una nueva ventana. Es esta nueva ventana indicaremos de dónde se tomarán los valores para la suma. Podemos usar una expresión tan compleja como necesitemos. Como en este caso solo queremos realizar la suma de los puntos escribimos “$F{puntos}". Y presionamos el botón "OK" para confirmar.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 107: 5.confección de informes

107

iReport – Creación de un informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 108: 5.confección de informes

108

iReport – Creación de un informe Modificamos sus propiedades en la ventana "Properties" cambiando su

nombre a "sumaPuntos", su "Variable Class" a "java.lang.Integer", y "Calculation" a "Sum" (con esto indicamos que la variable mantendrá la suma de los valores que indicaremos más adelante, otras opciones incluyen un contador, el promedio, el valor más alto, etc.).

Ahora indicaremos la suma de cuáles valores son los que queremos que se almacene en este variable. Para eso hacemos clic en el botón "..." de la propiedad "Variable Expression", con lo que se abrirá una nueva ventana. Es esta nueva ventana indicaremos de dónde se tomarán los valores para la suma. Podemos usar una expresión tan compleja como necesitemos. Como en este caso solo queremos realizar la suma de los puntos escribimos "F{puntos}". Y presionamos el botón "OK" para confirmar.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 109: 5.confección de informes

109

iReport – Creación de un informe Ahora solo arrastramos nuestra variable "sumaPuntos" desde el "Report Inspector"

hasta la banda "Summary". Esta banda se muestra cuando ya se han mostrado todos los datos de la banda "Details 1" y se muestra justo abajo de ella.

Agregaré un texto estático y una línea en esta banda solo para que se vea un poco mejor. Nuestro reporte hasta ahora debe verse así:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 110: 5.confección de informes

110

iReport – Creación de un informe Ahora para terminar agregaremos la variable "PAGE_NUMBER" que nos dice el número de

página actual en el reporte. Arrastramos esta variable desde el "Report Inspector" hasta la banda "Page Footer", la cual se muestra en la parte inferior de cada página.

Agregaré también un texto estático solo para indicar que el valor que estamos mostrando corresponde al número de página. Al final el reporte queda así:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 111: 5.confección de informes

111

iReport – Creación de un informe Ahora guardamos y compilamos

nuestro reporte y ejecutamos nuestra aplicación desde el NetBeans. El reporte generado debe verse así:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 112: 5.confección de informes

112

iReport – Creación de un informe PARTE 4: Gráficas en reportes

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 113: 5.confección de informes

113

iReport – Creación de un informe Algunas veces es más fácil entender la información cuando se nos

presenta en una imagen. En el caso de los datos, cuando estamos haciendo comparaciones, lo más fácil es visualizarlos en una gráfica de barras o en una gráfica de pie o pastel.

Para este ejemplo los datos que graficaremos son las ventas de consolas de última generación (Wii, XBox360, y PS3). Tomaremos estos datos de VG Chartz que, aunque no son cifras oficiales, mantiene sus datos actualizados. En el momento de escribir este tutorial las ventas van:

Wii: 41.6% para nosotros será 41% XBox 360: 29.6% para nosotros será 30% PS3: 28.8% para nosotros será 29%

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 114: 5.confección de informes

114

iReport – Creación de un informe Bien, para comenzar crearemos un nuevo proyecto Java standalone en

NetBeans (File -> New Project... -> Java -> Java Application), le asignamos un nombre (que en mi caso será ReporteGrafica) y presionamos el botón "Finish" para que el nuevo proyecto se genere y veamos en el editor nuestra clase Main.

Agregamos al nodo "Libraries" de nuestro proyecto la biblioteca "JasperReports" que creamos en la primer parte del tutorial y el jar "commons-logging-1.1.1.jar",como lo hemos venido haciendo hasta ahora.

Adicionalmente debemos agregar dos jars más que nos permitirán generar las gráficas. Puesto que JasperReports hace uso de JFreeChart para generar las gráficas debemos agregar dos de sus jars: jfreechart.jar y jcommon.jar. Si bajaron JasperReports en el archivo .zip que contiene las bibliotecas de soporte entonces ya tienen estos jars (que se encuentran en el directorio lib del .zip anterior), solo deben agregarlos al nodo "Libraries" del proyecto.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 115: 5.confección de informes

115

iReport – Creación de un informe Ahora necesitamos, como en los casos anteriores, una clase cuyas instancias

mantendrán los datos que mostraremos en el reporte. En este caso, como estamos hablando de consolas, creo que lo más adecuado es que esta sea una clase "Jugador". Así que agreguemos esta clase a nuestro proyecto.

Esta clase tendrá tan solo tres atributos: un id , un nombre para distinguir al usuario, y el nombre de la consola que tiene (que es el dato que nos interesa para crear la gráfica).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 116: 5.confección de informes

116

iReport – Creación de un informe El código de la clase Jugador queda de

la siguiente forma:public class Jugador{ private int id; private String nombre; private String consola;

public Jugador(int id, String nombre, String consola) { this.id = id; this.nombre = nombre; this.consola = consola; }

public String getConsola() { return consola; }

public void setConsola(String consola) { this.consola = consola; }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

public int getId() { return id; }

public void setId(int id) { this.id = id; } public String getNombre() { return nombre; }

public void setNombre(String nombre) { this.nombre = nombre; } }

Page 117: 5.confección de informes

117

iReport – Creación de un informe El código de la clase Main es el código estándar que hemos estado usando en

esta serie de tutoriales de JasperReports, con excepción de la parte en la que se crean los Jugadores. En este caso usaremos tres ciclos, uno para cada consola. Por lo que esta parte del código queda más o menos así (listaJugadores es una lista de objetos Jugador):

for (int i = 1; i <= 49; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i , "Wii")); }

for(int i = 50; i <= 79; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i , "XBox")); }

for(int i = 80; i <= 100; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i , "PS3")); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 118: 5.confección de informes

118

iReport – Creación de un informe Ahora abriremos el iReport y comenzaremos con el diseño de nuestro reporte. Creamos un nuevo reporte vacío yendo al menú Archivo -> New... -> Empty

Report. En la ventana que se abre colocamos el nombre de nuestro reporte (reporteGrafica.jrxml) y lo guardamos en el directorio raíz de nuestro proyecto de NetBeans:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 119: 5.confección de informes

119

iReport – Creación de un informe Ahora abriremos el iReport y comenzaremos con el diseño de nuestro reporte. Creamos un nuevo reporte vacío yendo al menú Archivo -> New... -> Empty

Report. En la ventana que se abre colocamos el nombre de nuestro reporte (reporteGrafica.jrxml) y lo guardamos en el directorio raíz de nuestro proyecto de NetBeans:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 120: 5.confección de informes

120

iReport – Creación de un informe Comencemos colocando un título y los encabezados de nuestras columnas de

datos usando textos estáticos, así como los fields para los datos que obtendremos de cada uno de los objetos Jugador (id, nombre, y consola) de la misma forma que lo hicimos en este tutorial (no olviden guardar de forma constante sus avances para no perder su trabajo):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 121: 5.confección de informes

121

iReport – Creación de un informe Ahora vienen los pasos interesantes. Primero debemos crear un

grupo. Un grupo nos permite tratar de forma especial un conjunto de datos que se encuentran asociados (es como un group by en SQL). Además, al crear un grupo se genera también una variable que mantiene el conteo de los elementos de cada grupo (como si hicieramos un count sobre los elementos de los grupos en SQL).

En este caso el grupo que nos interesa es el de las consolas.

Si estuvieramos usando consultas SQL obtener estos datos sería sencillo. Es más, si hubieramos creado nuestro reporte usando el "Report Wizard" podríamos haber creado el grupo que nos interesa desde ahí. Pero como estamos usando un DataSource propio, tenemos que agregar el grupo a mano. Afortunadamente es muy sencillo agregar grupos desde iReport. Lo único que debemos hacer es click derecho sobre el nodo "report name" (la raíz de los elementos del proyecto) en el panel "Report Inspector". Con esto se abrirá un menú contextual. De este seleccionamos el elemento "Add Report Group":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 122: 5.confección de informes

122

iReport – Creación de un informe Al hacer esto se abrirá la ventana del "Group Wizard". En esta colocamos el

nombre del grupo, en este caso será CONSOLAS, y en el campo "Group by the following report object:" seleccionamos el field "consola" que creamos anteriormente. Con esto conseguiremos que el nuevo grupo que se creará se haga con respecto al valor del atributo "consola" de nuestros objeto "Jugador".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 123: 5.confección de informes

123

iReport – Creación de un informe Presionamos el botón "Siguiente >" y se nos mostrarán dos radio buttons

preguntando si quieremos agregar la cabecera (header) y el pie de pagina (footer) del grupo. Nosotros deseleccionamos estas opciones (se encuentran seleccionadas por default) ya que no nos interesa agregar ninguno de estos elementos. Para terminar presionamos el botón "Finalizar" y ya tendremos agregado nuestro grupo.

No es muy obvio el que este grupo existe, de hecho los únicos indicadores que tenemos son que se han agregado en la zona de las bandas del "Report Inspector" dos nuevas bandas: "CONSOLAS Group Header" y "CONSOLAS Group Footer", además se ha agregado una variable llamada "CONSOLAS_COUNT", que es la variable que nos interesa y por la que hemos creado el grupo, que mantendrá el número de jugadores que tienen cada una de las consolas:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 124: 5.confección de informes

124

iReport – Creación de un informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 125: 5.confección de informes

125

iReport – Creación de un informe Ahora agregaremos nuestra gráfica. Para eso arrastraremos desde la Paleta de

elementos del reporte un "Chart" y lo colocamos en la banda "Summary" (ajusten el tamaño de la banda para que la gráfica se vea bien).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 126: 5.confección de informes

126

iReport – Confección de informe

Al arrastrar la gráfica se abrirá una nueva ventana preguntándonos qué tipo de gráfico queremos mostrar. En este caso seleccionaremos el gráfico de pie o de pastel (la primer o segunda opción):

Presionamos el botón "OK" y la gráfica se agregará a nuestro reporte, ajústenla para que abarque toda el área de la banda.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 127: 5.confección de informes

127

iReport – Confección de informe

Lo último que haremos es configurar la gráfica para que obtenga los datos de los campos y variables que nos interesa mostrar. Para esto, hacemos click derecho sobre la gráfica, con lo que se abrirá un menú contextual. En este menú seleccionamos la opción "Chart Data".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 128: 5.confección de informes

128

iReport – Confección de informe

Con lo que se abrirá una nueva ventana, y en esta ventana seleccionamos la pestaña "Details". En esta pestaña configuraremos tres valores:

Key expression Value expression Label expression

La "Key expression" dice cuál será la base que se usará para cada uno de las piezas de la gráfica. En nuestro caso queremos que cada trozo muestre las consolas. Por lo que colocamos como valor $F{consola}.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 129: 5.confección de informes

129

iReport – Confección de informe

La "Value expression" dice cuál será el tamaño de cada una de las piezas de la gráfica. Nosotros queremos que cada pieza sea equivalente al número de consolas que se han comprado. Por lo que colocamos como valor $V{CONSOLAS_COUNT}.

Label expression es la etiqueta que se mostrará para cada valor. Nosotros queremos mostrar el nombre de la consola junto con el número de unidades que se han vendido de cada una. Por lo que colocamos como valor $F{consola} + " - " + $V{CONSOLAS_COUNT}. Lo cual colocará como valor el nombre de la consola, concatenándole el signo " - " y concatenándole el número de consolas vendidas (el número de jugadores que han comprado cada una de las consolas).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 130: 5.confección de informes

130

iReport – Confección de informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 131: 5.confección de informes

131

iReport – Confección de informe

Presionamos el botón "Close" y hemos terminado con nuestro reporte. Cambiamos a la vista "Preview" para compilar el reporte. No se nos mostrará nada del reporte final. De hecho los regresará a la vista del "Designer" y mostrará una excepción en la ventana de salida indicando algo así: "Key is null in pie dataset". Esto es normal ya que la gráfica no puede generarse ya que no existen datos. Lo importante es que se haya generado el archivo "reporteGrafica.jasper".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 132: 5.confección de informes

132

iReport – Confección de informe

Ahora ejecutamos nuestra aplicación, con lo que debe generarse nuestro reporte en PDF y debemos ver, al final del reporte, la siguiente gráfica:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 133: 5.confección de informes

133

iReport – Confección de informe Finalmente este es el codigo de la clase Main (omitiendo los imports):

public class Main { public static void main(String[] args) throws Exception { List listaJugadores = new ArrayList();

for (int i = 1; i <= 49; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i , "Wii")); }

for(int i = 50; i <= 79; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i , "XBox")); }

for(int i = 80; i <= 100; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i , "PS3")); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

JasperReport reporte = (JasperReport)JRLoader.loadObject("reporteGrafica.jasper"); JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaJugadores));

JRExporter exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("reporte grafica.pdf"));

exporter.exportReport(); } }

Page 134: 5.confección de informes

134

iReport – Creación de un informe PARTE 5: Grupos y subgrupos

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 135: 5.confección de informes

135

iReport – Confección de informe

Ahora veremos cómo deben ser usados los grupos para, bueno, agrupar un conjunto de datos relacionados y mostrar estos grupos de forma clara en el reporte. Usaremos la misma idea del tutorial anterior, en la que se mostraron las ventas de las consolas de última generación (Wii, XBox 360, y PS3). Solo que en este caso mostraremos por cada consola el nombre de los jugadores que las han comprado, separados claramente de los que han comprado las otras consolas.

Para comenzar creamos un nuevo proyecto en NetBeans (File -> New Project... -> Java -> Java Application). Damos un nombre y una ubicación a nuestro proyecto y presionamos el botón "Finish" para que la clase Main aparezca en nuestro editor.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 136: 5.confección de informes

136

iReport – Confección de informe

Recuerden agregar al nodo "Libraries" del panel "Projects" la biblioteca "JasperReports" que creamos en la primer parte del tutorial.

Usaremos la misma clase "Jugador" en en el tutorial anterior para mantener los datos que serán mostrados en el reporte.

El código que colocaremos en la clase Main es el mismo que en el tutorial anterior. Solo que en este caso en vez de tener 100 jugadores, modificaremos los ciclos for para tener solo 10. Por lo tanto quedan de la siguiente forma:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 137: 5.confección de informes

137

iReport – Confección de informe

for (int i = 1; i <= 4; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i , "Wii")); }

for(int i = 5; i <= 7; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i , "XBox")); }

for(int i = 8; i <= 10; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i , "PS3")); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 138: 5.confección de informes

138

iReport – Confección de informe

Ahora abrimos iReport y creamos un nuevo reporte vacio (Archivo -> New... -> Empty Report). En la ventana que se abre le damos un nombre al reporte (reporteGrupo.jrxml) y lo guardamos en el directorio raíz del proyecto de NetBeans. Presionamos el botón "Finalizar" para que aparezca la plantilla vacio de nuestro reporte.

Colocamos el título del reporte en la banda "Title" usando un texto estático. También agregamos los fields correspondientes para los datos de los objetos Jugador (id, nombre, y consola). En esta ocasión en la banda "Detail" solamente colocamos los fields id y nombre (ya que los grupos serán formados en base al field consola). Y no colocamos nada en la banda "Column Header":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 139: 5.confección de informes

139

iReport – Confección de informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 140: 5.confección de informes

140

iReport – Confección de informe

Ahora crearemos el grupo correspondiente a las consolas. Para esto hacemos click derecho en el nodo "report name" del panel "Report Inspector". Y en el menú contextual que aparece seleccionamos la opción "Add Report Group":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 141: 5.confección de informes

141

iReport – Confección de informe

Con esto se abrirá la ventana "New group wizard". En ella debemos introducir el nombre del grupo, que en este caso será "CONSOLAS" y el campo sobre el cual se crearán los grupos que, como habiamos dicho, será el campo "consola":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 142: 5.confección de informes

142

iReport – Confección de informe Presionamos el botón "Siguiente >". En la pantalla siguiente dejamos

seleccionadas las dos opciones ("Add the group header" y "Add the group footer"). Presionamos en botón "Finalizar" con lo que veremos que en la plantilla de nuestro reporte han aparecido dos nuevas bandas, "CONSOLAS Group Header" y "CONSOLAS Group Footer", además de una nueva variable, CONSOLAS_COUNT:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 143: 5.confección de informes

143

iReport – Confección de informe Agregaré un cuadro negro ("Rectangle" de la paleta de elementos del reporte) en

la banda "CONSOLAS Group Header" para poder distinguirlo en el momento de generar el reporte final. Además arrastraré a esta banda el field $F{consola} que creamos anteriormente. Al arrastrar este field se nos preguntará qué es lo que queremos mostrar: el valor del campo ("The field value") o el resultado de una función de agregación ("The result of an aggregation fuction"). Como lo que queremos mostrar es el valor del campo dejamos seleccionada la primera opción (si queremos mostrar el número de los elementos del grupo podemos volver a arrastrar este field a la banda).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 144: 5.confección de informes

144

iReport – Confección de informe Si, al igual que yo, agregaron el

cuadro negro en la banda, será neccesario que cambien el color de la letra del campo (Forecolor) a blanco para poder verlo.

El reporte final debe verse más o menos así:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 145: 5.confección de informes

145

iReport – Confección de informe

Ahora cambiamos a la pestaña "Preview" para que se compile nuestro reporte y genere, en el mismo directorio en el que colocamos nuestro archivo "reporteGrupo.jrxml", el archivo "reporteGrupo.jasper".

Ahora regresamos al NetBeans y ejecutamos nuestra aplicación. Esto generará un archivo PDF en el mismo directorio que los archivos .jrxml y .jasper. El contenido del reporte el siguiente:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 146: 5.confección de informes

146

iReport – Confección de informe

Como podemos ver, los tres grupos (uno por cada consola) se muestran de forma independiente uno de otro. Además en cada grupo se listan solo los jugadores que tienen la consola del grupo.

El código final de la clase Main es el siguiente:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 147: 5.confección de informes

147

public class Main{ public static void main(String[] args) throws Exception { List listaJugadores = new ArrayList(); for (int i = 1; i <= 4; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i, "Wii")); }

for (int i = 5; i <= 7; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i, "XBox")); } for (int i = 8; i <= 10; i++) { listaJugadores.add(new Jugador(i, "Jugador " + i, "PS3")); }

JasperReport reporte = (JasperReport) JRLoader.loadObject("reporteGrupo.jasper"); JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaJugadores));

JRExporter exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("reporte grafica.pdf"));

exporter.exportReport(); }}

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 148: 5.confección de informes

148

PARTE 6: SUBREPORTES

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 149: 5.confección de informes

149

iReport – Confección de informe

Los subreportes son una característica importante de una herramienta generadora de reportes. Permiten crear reportes más complejos y simplificar el trabajo de diseño.

Los subreportes son muy útiles cuando se crea un reporte maestro de detalles o cuando la estructura de un solo reporte no es suficiente para describir la complejidad del documento de salida deseado.

Un subreporte es solamente un reporte que ha sido incorporado a otro reporte. De hecho podemos tener subreportes dentro de otros subreportes.

En esta última parte veremos cómo realizar subreportes .Veremos dos ejemplos, el primero mostrará cómo hacer los subreportes mediante una conexión JDBC a la base de datos. El segundo mostrará como hacerlo con un DataSource propio.

En ambos casos crearemos un reporte de alumnos de una escuela y subreportes de cada uno de los alumnos con la lista de materias que tiene cada uno (aunque por facilidad todos tendrán las mismas materias cuando hagamos el ejemplo con el DataSource propio).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 150: 5.confección de informes

150

iReport – Confección de informe

1 - SUBREPORTES CON CONEXIÓN A BASE DE DATOS

Lo primero que haremos es generar una base de datos de prueba. Yo hare uso de MySql 5.1, pero pueden usar el manejador que más les guste. Creamos una base de datos llamada "pruebaReportes" y usamos el siguiente script para crear la tabla "alumnos":

CREATE TABLE alumnos ( ID bigint(21) NOT NULL, NOMBRE`varchar(100) NOT NULL, CLAVE varchar(100) NOT NULL, PRIMARY KEY (ID) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 después este para las materias:CREATE TABLE materias ( ID BIGINT(21) NOT NULL, NOMBRE VARCHAR(100) NOT NULL, PRIMARY KEY (ID) ) ENGINE=INNODB DEFAULT CHARSET=latin1

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 151: 5.confección de informes

151

iReport – Confección de informe

y finalmente esta será la tabla intermedia, o tabla de unión de las dos anteriores (ya que se generará una relación N:M entra ambas):

CREATE TABLE alumnos_materias ( ALUMNO_ID BIGINT(21) NOT NULL, MATERIA_ID BIGINT(21) NOT NULL, PRIMARY KEY (ALUMNO_ID, MATERIA_ID),

FOREIGN KEY (ALUMNO_ID) REFERENCES alumnos(ID), FOREIGN KEY (MATERIA_ID) REFERENCES materias (ID) ) ENGINE=INNODB DEFAULT CHARSET=latin1

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 152: 5.confección de informes

152

iReport – Confección de informe

Ahora que tenemos las tablas usaremos el siguiente script para llenarlas:INSERT INTO alumnos VALUES (1, 'Alumno 1', '00001');INSERT INTO alumnos VALUES (2, 'Alumno 2', '00002');INSERT INTO alumnos VALUES (3, 'Alumno 3', '00003');INSERT INTO alumnos VALUES (4, 'Alumno 4', '00004');INSERT INTO alumnos VALUES (5, 'Alumno 5', '00005');INSERT INTO alumnos VALUES (6, 'Alumno 6', '00006');INSERT INTO alumnos VALUES (7, 'Alumno 7', '00007');INSERT INTO alumnos VALUES (8, 'Alumno 8', '00008');INSERT INTO alumnos VALUES (9, 'Alumno 9', '00009');INSERT INTO alumnos VALUES (10, 'Alumno 10', '000010');

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 153: 5.confección de informes

153

iReport – Confección de informe

INSERT INTO materias VALUES (1, 'Matematicas');INSERT INTO materias VALUES (2, 'Fisica');INSERT INTO materias VALUES (3, 'Quimica');INSERT INTO materias VALUES (4, 'Biologia');INSERT INTO materias VALUES (5, 'Historia');INSERT INTO materias VALUES (6, 'Geografia');INSERT INTO alumnos_materias VALUES (1, 1);INSERT INTO alumnos_materias VALUES (1, 3);INSERT INTO alumnos_materias VALUES (1, 5);

INSERT INTO alumnos_materias VALUES (2, 1);INSERT INTO alumnos_materias VALUES (2, 2);INSERT INTO alumnos_materias VALUES (2, 3);

INSERT INTO alumnos_materias VALUES (3, 2);INSERT INTO alumnos_materias VALUES (3, 4);INSERT INTO alumnos_materias VALUES (3, 6);

INSERT INTO alumnos_materias VALUES (4, 4);INSERT INTO alumnos_materias VALUES (4, 5);INSERT INTO alumnos_materias VALUES (4, 6);

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

INSERT INTO alumnos_materias VALUES (5, 1);INSERT INTO alumnos_materias VALUES (5, 4);INSERT INTO alumnos_materias VALUES (5, 5);

INSERT INTO alumnos_materias VALUES (6, 2);INSERT INTO alumnos_materias VALUES (6, 5);INSERT INTO alumnos_materias VALUES (6, 6);

INSERT INTO alumnos_materias VALUES (7, 1);INSERT INTO alumnos_materias VALUES (7, 3);INSERT INTO alumnos_materias VALUES (7, 5);

INSERT INTO alumnos_materias VALUES (8, 1);INSERT INTO alumnos_materias VALUES (8, 2);INSERT INTO alumnos_materias VALUES (8, 3);

INSERT INTO alumnos_materias VALUES (9, 2);INSERT INTO alumnos_materias VALUES (9, 4);INSERT INTO alumnos_materias VALUES (9, 6);

INSERT INTO alumnos_materias VALUES (10, 4);INSERT INTO alumnos_materias VALUES (10, 5);INSERT INTO alumnos_materias VALUES (10, 6);

Page 154: 5.confección de informes

154

iReport – Confección de informe

Ya con los datos listos procedemos a crear el proyecto en NetBeans ("File -> New Project... -> Java -> Java Application"). Con lo que se creará una clase Main que aparecerá en nuestro editor.

Por el momento dejaremos así el proyecto de NetBeans y procederemos a crear la plantilla de nuestro reporte desde iReport.

Como en esta ocasión tenemos una base de datos, usaremos el "Report Wizard", por lo que vamos al menú "Archivo -> New.. -> Report Wizard". Con esto se abrirá el wizard de 7 pasos que expliqué en la primera parte de este ppt.

El paso 2 (en el que empieza el wizard) nos pide dar un nombre al archivo del reporte y una ubicación. Denle el nombre que gusten (en mi caso "reporteMaestro.jrxml") y guárdenlo en la carpeta raíz del proyecto de NetBeans que acabamos de crear.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 155: 5.confección de informes

155

iReport – Confección de informe

Presionamos el botón "Siguiente >" para ir la paso 3. Aquí debenos seleccionar el Data Source que se usará para generar el reporte. Si ya tienen creado el datasource para la base de datos "pruebaReportes" pueden seleccionarla aquí. Sino no se preocupen, este es el momento para crearlo.

Para crear el datasource que usaremos hacemos click en el botón "New":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 156: 5.confección de informes

156

iReport – Confección de informe

Esto abrirá una ventana en la que tendremos que seleccionar el tipo de Datasource que queremos usar. En nuestro caso será un "Database JDBC connection" (la primer opción).

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 157: 5.confección de informes

157

iReport – Confección de informe

Presionamos el botón "Next >". En la siguiente pantalla debemos darle un nombre y algunos parámetros al datasource, como la dirección del servidor y el nombre de la base de datos.

Para probar que la conexión puede establecerse, hagan click en el botón "Test" y, si todo estpa bien, debe aparecer un mensaje como el siguiente:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 158: 5.confección de informes

158

iReport – Confección de informe

Si obtuvieron el mensaje anterior hagan click en "Aceptar" y posteriormente en el botón "Save" para guardar el datasource.

Veremos que en la ventana del paso 3 del "Report Wizard" ahora tenemos un textarea que nos indica que debemos introducir un query. Pueden usar el query designer si gustan (haciendo click en el botón "Design Query") para crear la query que usaremos para obtener todos los datos de la tabla "alumnos" (solo de esa tabla). Al final la query debe ser más o menos así:

SELECT alumnos.`ID` AS alumnos_ID, alumnos.`NOMBRE` AS alumnos_NOMBRE, alumnos.`CLAVE` AS alumnos_CLAVEFROM `alumnos` alumnos

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 159: 5.confección de informes

159

iReport – Confección de informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 160: 5.confección de informes

160

iReport – Confección de informe

Hacemos click en el botón "Siguiente >" para ir al paso 4. En este paso tendremos que seleccionar los campos, de los que acabamos de seleccionar, que queremos mostrar en el reporte. En este caso solo queremos mostrar el nombre y la clave del alumno (el id lo usaremos como un elemento auxiliar para obtener los datos del subreporte, por lo que es necesario que también lo releccionemos). Por lo que seleccionamos todos los campos:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 161: 5.confección de informes

161

iReport – Confección de informe

Presionamos el botón "Siguiente >". En el paso 5 podemos seleccionar un campo sobre el que queramos crear un grupo. Nosotros no queremos crear ninguno, por lo que dejamos todo como está y presionamos el botón "Siguiente >" para ir al paso 6 en el que seleccionaremos el layout del reporte. La opción por defecto ("Columnar Layout") esta bien, por lo que la dejamos y hacemos click en "Siguiente >" para ir al paso final en el que nos felicitarán por haber creado exitosamente nuestro reporte

Ahora podemos hacer click en el botón "Finalizar" para ver aparecer la plantilla de nuestro reporte, en la pestaña "Designer", el cual debe verse de la siguiente forma:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 162: 5.confección de informes

162

iReport – Confección de informe

Modificaremos los textos estáticos para que concuerden un poco más con el tipo de reporte que queremos lograr. También eliminaremos las etiqueta y el texto que muestran el valor de id ya que, como dijimos hace un momento, no nos interesa mostrarlo:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 163: 5.confección de informes

163

iReport – Confección de informe

Si generamos la vista previa del reporte veremos lo siguiente:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 164: 5.confección de informes

164

iReport – Confección de informe

Ahora procederemos a agregar el subreporte. Este subreporte mostrará las materias a las que esta inscrito cada uno de los alumnos.

Para esto arrastramos el elemento "Subreport" desde los "Report Elements" y lo colocamos en la banda details, justo debajo de los campos de texto:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 165: 5.confección de informes

165

iReport – Confección de informe

Al hacer esto se abrirá la ventana del "Subreport Wizard" que es la que nos guiará en el proceso de la creación del subreporte:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 166: 5.confección de informes

166

iReport – Confección de informe

El primer paso consiste en indicar si nuestro subreporte será un reporte nuevo, uno existente, o si solo queremos crear el elemento subrepote. Nosotros crearemos un nuevo reporte (que es el que mostrará las materias a las que está inscrito cada alumno), así que dejamos seleccionada la primera opción ("Create a new report") y hacemos click en el botón "Siguiente >".

En el paso 2 se nos preguntara qué datasource usaremos para este reporte. Nosotros usaremos el datasource creado hace unos momentos (que en mi caso se llamaba "Prueba Reportes"). Seleccionamos este en el menú desplegable, con los que nos aparecerá un textarea para que coloquemos una query. Pueden usar el query designer si gustan para obtener una query que seleccione todos los campos de las tablas "alumnos_materias" y "materias" y haga un join entre estas (que obtenga las materias que tiene cada alumno). La query final queda de la siguiente forma:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 167: 5.confección de informes

167

iReport – Confección de informe

SELECT alumnos_materias.`ALUMNO_ID` AS alumnos_materias_ALUMNO_ID, alumnos_materias.`MATERIA_ID` AS alumnos_materias_MATERIA_ID, materias.`ID` AS materias_ID, materias.`NOMBRE` AS materias_NOMBREFROM `materias` materias INNER JOIN `alumnos_materias` alumnos_materias ON materias.`ID` = alumnos_materias.`MATERIA_ID`

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 168: 5.confección de informes

168

iReport – Confección de informe

Presionamos el botón "Siguiente >" para ir al paso 3, en el que se nos preguntará qué campos de los regresados por la consulta queremos mostrar en el reporte (o en este caso en el subreporte). A nosotros solo nos interesa mostrar los campos que tienen que ver con la materia, por lo que solo seleccionamos los campos "materias_NOMBRE" y "materias_ID":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 169: 5.confección de informes

169

iReport – Confección de informe

Presionamos en botón "Siguiente >" para ir al paso 4. En este paso podemos elegir si queremos crear un grupo, como nosotros no queremos crear ninguno, simplemente dejamos todo como está y volvemos a presionar el botón "Siguiente >".

En el paso 5 podemos elegir el layout del reporte. Puden seleccionar el que quieran. En mi caso dejaré la opción por default ("Columnar Layout") y presionamos el botón "Siguiente >".

En el paso 6 podemos darle un nombe y una ubicación al subreporte. Yo le llamaré "subreporteMaterias.jrxml" y lo guardaré en el mismo directorio que el "reporteMaestro.jrxml" (en la carpeta raíz del proyecto de NetBeans). También podemos ejegir si queremos guardar la ruta del subreporte (para que el reporte maestro sepa donde buscarlo) como un parámetro llamado $P{SUBREPORT_DIR}, o como una ruta absoluta estática. Lo mejor es elegir está ultima ya que modificaremos la ruta para que busque el subreporte en en el mismo directorio que el reporte maestro. Así si los movemos de un directorio a otro, solo tendremos que preocuparnos de llevarnos los dos juntos.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 170: 5.confección de informes

170

iReport – Confección de informe

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 171: 5.confección de informes

171

iReport – Confección de informe

Presionamos una vez más el botón "Siguiente >" para ir al ultimo paso.

En el paso final (el paso 7) debemos seleccionar cómo le pasaremos el datasource al subreporte desde el reporte maestro. Tenemos 5 opciones: Usar la misma conexión que el reporte maestro Usar otra conexión Usar una expresión de un JRDataSource Usar un datasource vacío No usar conexión o datasource alguno

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 172: 5.confección de informes

172

iReport – Confección de informe Nosotros seleccionamos la primera opción ya que queremos que el subreporte

use la misma conexión que el reporte maestro:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 173: 5.confección de informes

173

iReport – Confección de informe presionamos el botón "Finalizar" para mostrar el subreporte:

Modificamos un poco el diseño del reporte para que se vea bien al mostrarlo dentro del reporte maestro (cambiamos unos textos, eliminamos otros, y eliminamos la banda "Page Footer", también agregamos una línea en la banda "Summary" para identificar en el reporte final cuando termine la lista de materias):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 174: 5.confección de informes

174

iReport – Confección de informe Ahora agregamos un

nuevo parámetro al subreporte (click derecho en el nodo "Parameters" del panel "Report Inspector" y seleccionamos "Añadir Parameter") llamado alumnos_ID de tipo java.lang.Long.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 175: 5.confección de informes

175

iReport – Confección de informe Lo siguiente que haremos es el primero de los dos trucos para generar subreportes

en base a una conexión con base de datos: hacemos click sobre la ventana del designer, pero fuera del reporte para que en el panel de propiedades aparezcan las propiedades del "subreporteMaterias". Una vez en este panel buscamos la propiedad "Query Text" de la sección "More...":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 176: 5.confección de informes

176

iReport – Confección de informe Hacemos click en el botón "..." para que se abra una ventana que contiene el texto

de la consulta que creamos al crear el subreporte. Agregamos el final de la consulta lo siguiente:

AND alumnos_materias.`ALUMNO_ID`= $P{alumnos_ID}

Con esto lograremos que el subreporte se genere solo con las materias que correspondan al alumno con el id que le indiquemos (lo cual haremos en un momento y que de hecho es el segundo secreto).

Presionamos el botón "OK" para guardar la consulta.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 177: 5.confección de informes

177

iReport – Confección de informe Para terminar guardamos el subreporte y cambiamos a la vista "Preview" para

compilar el reporte y generar el archivo "subreporteMaterias.jasper". El preview debe verse más o menos así:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 178: 5.confección de informes

178

iReport – Confección de informe Ahora podemos regresar al reporteMaestro, el cual debe verse así (después de

ajustar el tamaño y la posición del componente subreporte):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 179: 5.confección de informes

179

iReport – Confección de informe Seleccionamos el elemento subreporte y en el panel de propiedades buscamos el

elemento "Subreport Expression" de la sección "Subreport Properties". Eliminamos la ruta absoluta y dejamos solo el nombre del reporte ("subreporteMaterias.jasper"):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 180: 5.confección de informes

180

iReport – Confección de informe Ahora viene el segundo de los secretos para le generación de los subreportes

usando conexión a base de datos. Seleccionamos el componente del subreporte y buscamos en panel de propiedades y buscamos la propiedad "Parameters" de la sección "Subreport Properties":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 181: 5.confección de informes

181

iReport – Confección de informe

Hacemos click en el botón "..." con lo que se abrirá una ventana que nos permite agregar parámetros que serán pasados del reporte maestro al subreporte.

Si recuerdan nosotros indicamos en el subreporte que queremos que muestre las materias en las que está inscrito un alumno con un particular. Pues bien es aquí en donde pasamos ese dato, el id del alumno del que se están mostrando los datos. Este parámetro nos permitirá pasarle el valor al parámetro "alumnos_ID" que agregamos en el subreporte.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 182: 5.confección de informes

182

iReport – Confección de informe

Presionamos el botón "Add" y agregamos como nombre del parámetro "alumnos_ID" y como valor "$F{alumnos_ID}":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 183: 5.confección de informes

183

iReport – Confección de informe

Presionamos "OK" en ambas ventanas y listo, ya tenemos nuestro reporte maestro con subreportes.

Ahora guardamos el reporte y cambiamos a la vista de "Preview". Ahora debemos ver algo como lo siguiente:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 184: 5.confección de informes

184

iReport – Confección de informe

Con esto terminamos la parte que corresponde a iReport y podemos regresar al NetBeans.

Si lo recuerdan dejamos la clase Main vacia, ahora procederemos a llenarla con el código para generar el reporte.

Recuerden que lo primero que debemos hacer es agregar al nodo "Libraries" del panel "Projects" la biblioteca "JasperReports" que creamos en el primer tutorial de la serie, el jar "commons-logging-1.1.1.jar", y el jar "mysql-connector-java-5.1.7-bin.jar" que es el driver de la base de datos.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 185: 5.confección de informes

185

iReport – Confección de informe Una vez que tenemos esto, escribimos el siguiente códifo en el método main de la clase

Main: Class.forName("com.mysql.jdbc.Driver"); Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/pruebareportes", "user", "pass");

JasperReport reporte = (JasperReport) JRLoader.loadObject("reporteMaestro.jasper"); JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, conexion);

JRExporter exporter = new JRPdfExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reportePDF.pdf"));

exporter.exportReport();

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 186: 5.confección de informes

186

iReport – Confección de informe

Al ejecutarlo se creará el archivo "reportePDF.pdf" en el directorio raíz del proyecto. Si abrimos el archivo veremos más o menos lo siguiente:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 187: 5.confección de informes

187

iReport – Confección de informe

Con lo que comprobamos que el reporte, junto con su subreporte, se ha generado correctamente . Ahora veremos cómo hacer esto mismo usando un DataSource propio.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 188: 5.confección de informes

188

iReport – Confección de informe

2 - Subreportes con datasources propios Para hacer un subreporte con un datasource propio también es necesario

conocer un par de secretos, los cuales revelaré un unos momentos.

Lo primero que haremos es crear un nuevo proyecto en NetBeans ("File -> New Project... ->Java -> Java Application"). Con lo que se creará una clase Main que aparecerá en nuestro editor.

Recuerden que también debemos agregar al nodo "Libraries" del panel "Projects" la biblioteca "JasperReports" que creamos en el primer tutorial de la serie.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 189: 5.confección de informes

189

iReport – Confección de informe Crearemos las clases que mantendrán los datos que mostraremos en el reporte ("Alumno" y "Materia"). La clase "Alumno" tendrá

solo los atributos "id", "clave" y "nombre" (con sus correspondientes setters y getters):

public class Alumno { private int id; private String clave; private String nombre;

public Alumno() { }

public Alumno(int id, String clave, String nombre) { this.id = id; this.clave = clave; this.nombre = nombre; }

public String getClave() { return clave; }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 190: 5.confección de informes

190

iReport – Confección de informe public void setClave(String clave) { this.clave = clave; }

public int getId() { return id; }

public void setId(int id) { this.id = id; }

public String getNombre() { return nombre; }

public void setNombre(String nombre) { this.nombre = nombre; } }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 191: 5.confección de informes

191

iReport – Confección de informe La clase "Materia" tendrá los atributos "id" y "nombre":public class Materia { private int id; private String nombre;

public Materia() { }

public Materia(int id, String nombre) { this.id = id; this.nombre = nombre; }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 192: 5.confección de informes

192

iReport – Confección de informe public int getId() { return id; }

public void setId(int id) { this.id = id; }

public String getNombre() { return nombre; }

public void setNombre(String nombre) { this.nombre = nombre; } }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 193: 5.confección de informes

193

iReport – Confección de informe

Aún falta agregar algunas cosas a la clase "Alumno", pero dejaremos este proyecto a un lado por el momento mientras creamos la plantilla de nuestro reporte desde iReport.

Abrimos el iReport y creamos un nuevo reporte vacío (menú Archivo -> New... -> Empty report). Asignamos al reporte un nombre (que en mi caso será "reporteMaestroDS.jrxml") y lo guardamos en la raíz del proyecto de NetBeans. Hacemos click en el botón "Finalizar" con lo que veremos aparecer la plantilla vacia dentro de la vista "Designer".

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 194: 5.confección de informes

194

iReport – Confección de informe

Agregamos un par de fields (clave y nombre), y unos textos estáticos para que este reporte maestro sea similar al anterior (eliminé algunas bandas para que el reporte se vea más claro):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 195: 5.confección de informes

195

iReport – Confección de informe

Agregamos un field adicional llamado "materiasDS" de tipo "net.sf.jasperreports.engine.JRDataSource". Como este tipo no aparece en el combo para selección de tipo del field debemos escribirlo en la ventana que se abre al presionar el botón "..." junto a este combo box:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 196: 5.confección de informes

196

iReport – Confección de informe

Este field será el que dirá a JasperReports que debe llamar al getter correspondiente de la clase Alumno que crearemos más adelante para preguntar a cuáles materias está inscrito (quedará claro cuando escribamos el código Java).

Ahora agregamos arrastramos el elemento "Subreport" de los "Report Elements" a la banda "Details":

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 197: 5.confección de informes

197

iReport – Confección de informe Al hacer esto se abrirá la ventana "Subreport wizard". Como ahora no usaremos una

conexión no necesitamos un query, entonces no todos los pasos aplican.

En el primer paso seleccionamos si queremos crear un nuevo reporte que servirá de subreporte, usar un reporte existente, o solo crear un elemento subreporte. Seleccionamos la primera opcion ("Create a new report") y presionamos el botón "Siguiente >".

En el paso 2 debemos seleccionar un datasource. Nosotros seleccionaremos el "Empty datasource". Presionamos el botón "Siguiente >" para ir al paso 3, en el que debemos seleccionar los fields que queremos agregar al subreporte. Como nosotros no estamos usando una conexión, no tenemos fields para seleccionar, así que simplemente presionamos el botón "Siguiente >".

En el paso 4 podemos escoger crear un grupo, aqui pasa lo mismo que en el paso 3 así que seguimos adelante.

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 198: 5.confección de informes

198

iReport – Confección de informe En el paso 5 seleccionamos un

layout para el subreporte. Pueden seleccionar el que quieran, yo usaré el "Columnar Layout". Presionamos el botón "Siguiente >".

Vamos al paso 6. Aquí le damos una ubicación y un nombre al proyecto. Le daré de nombre "subreporteMateriasDS.jrxml". Lo guardamos en el mismo directorio que el "reporteMaestroDS.jrxml". Además indicamos que queremos que la ruta del subreporte se almacene en una referencia estática absoluta ("Use a static absolute path reference"):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 199: 5.confección de informes

199

iReport – Confección de informe

Pulsamos el botón "Siguiente >" para ir al último paso.

En el paso 7 debemos indicar cómo queremos pasar los datos del reporte maestro al subreporte. En este caso queremos usar una "JRDatasource expression" (la tercer opción), seleccionamos esta opción y agregamos la expresión creada anteriormente ("$F{materiasDS}"), que será la que nos permita conectar el reporte con el subreporte:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 200: 5.confección de informes

200

iReport – Confección de informe

Presionamos el botón "Finalizar" con lo que aprecerá el subreporte en la vista de diseño:

Agregamos dos fields: uno para el identificador de la materia (de tipo java.lang.Integer), y uno para el nombre de la materia (de tipo java.lang.String):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 201: 5.confección de informes

201

iReport – Confección de informe

Ahora arreglamos un poco el diseño del subreporte para que se vea mejor: eliminamos la página "Page Footer", agregamos los fields que acabamos de crear a la banda "Detail", y arreglamos un poco el título. También agregamos una línea en la banda "Summary" para saber cuando termina el subreporte:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 202: 5.confección de informes

202

iReport – Confección de informe

Guardamos el reporte y cambiamos a la vista preview para compilar el subreporte. En la vista de preview deberían ver algo así (recuerden seleccionar que quieren usar el "Empty datasource"):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 203: 5.confección de informes

203

iReport – Confección de informe

Ahora regresemos al reporteMaestro, el cual debe verse así (después de ajustar el tamaño y la posición del componente subreporte):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 204: 5.confección de informes

204

iReport – Confección de informe

Seleccionamos el elemento subreporte y en el panel de propiedades buscamos el elemento "Subreport Expression" de la sección "Subreport Properties". Eliminamos la ruta absoluta y dejamos solo el nombre del reporte ("subreporteMateriasDS.jasper"):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 205: 5.confección de informes

205

iReport – Confección de informe

Esto es todo lo que se necestita hacer para generar el reporte, así que cambiaremos a la vista "Preview" para compilar el reporte. Deben ver algo así:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 206: 5.confección de informes

206

iReport – Confección de informe

Ahora regresamos al proyecto de NetBeans.

Hace unos momentos creamos dos clases: "Alumno" y "Materia" y dijimos que aún les faltaba algo: falta crear la relación entre un objeto alumno y las materias que tiene. Para esto agregaremos un atributo de tipo java.util.List a la clase "Alumno" que mantendrá la lista de materias a las que está inscrito el alumno (con sus correspondientes getters y setters). Además agregaremos un método auxiliar que nos permitirá agregar las materias de una forma más simple:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 207: 5.confección de informes

207

iReport – Confección de informe

private List materias = new ArrayList();

public List getMaterias() { return materias; }

public void setMaterias(List materias) { this.materias = materias; }

public void addMateria(Materia materia) { this.materias.add(materia); }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 208: 5.confección de informes

208

iReport – Confección de informe

Ahora viene el segundo secreto para crear subreportes con datasource propios: si lo recuerdan, en el reporteMaestro agregamos un parémetro llamado "materiasDS" de tipo "net.sf.jasperreports.engine.JRDataSource". Es por medio de este parámetro que el reporte maestro pregunta a cada uno de los alumnos con cuáles materias está relacionado (a cuáles está inscrito) para poder generar el subreporte.

Es el alumno el encargado de regresar esta información a JasperReports por medio de un getter, que debe estár formado siguiente el patrón de getters como si tuviera un atributo llamado "materiasDS" de tipo "net.sf.jasperreports.engine.JRDataSource". Por lo que el método será de la siguiente forma:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 209: 5.confección de informes

209

iReport – Confección de informe

public JRDataSource getMateriasDS() { { return new JRBeanCollectionDataSource(materias);

El código completo de la clase "Alumno" queda de la siguiente forma:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 210: 5.confección de informes

210

iReport – Confección de informeimport java.util.ArrayList; import java.util.List; import net.sf.jasperreports.engine.JRDataSource;import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

/** * @author Alex */

public class Alumno { private int id; private String clave; private String nombre; private List materias = new ArrayList();

public Alumno() { }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 211: 5.confección de informes

211

public Alumno(int id, String clave, String nombre) { this.id = id; this.clave = clave; this.nombre = nombre; }

public String getClave() { return clave; } public void setClave(String clave) { this.clave = clave; } public int getId() { return id; }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 212: 5.confección de informes

212

public void setId(int id) { this.id = id; }

public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; }

public List getMaterias() { return materias; }

public void setMaterias(List materias) { this.materias = materias; }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 213: 5.confección de informes

213

public void addMateria(Materia materia) { this.materias.add(materia); } public JRDataSource getMateriasDS() { return new JRBeanCollectionDataSource(materias); } }

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 214: 5.confección de informes

214

iReport – Confección de informe

Este es todo el cambio que necesita la clase "Alumno" para que nuestros subreportes se generen exitosamente.

Ahora regresaremos a la clase "Main". Aquí agregaremos 2 ciclos for, uno que creará las instancias de "Alumno" y las agregará a la lista que posteriormente pararemos como DataSource y JasperReports, y un ciclo interno que creará instancias de "Materia" y las relacionará con los alumnos (todos los alumnos tendrán las mismas tres materias en este caso). Los cliclos quedán así (listaAlumnos es un objeto List que mantendrá los objetos Alumno):

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 215: 5.confección de informes

215

iReport – Confección de informe

for (int i = 1; i <= 5; i++) { Alumno alumno = new Alumno(i, "0000" + i, "Alumno " + i); listaAlumnos.add(alumno);

for (int j = 1; j <= 3; j++) { alumno.addMateria(new Materia(j, "Materia " + j)); }}

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 216: 5.confección de informes

216

El código completo de Main es el siguiente (omitiendo los imports):public class Main { public static void main(String[] args) throws Exception { List listaAlumnos = new ArrayList();

for (int i = 1; i <= 5; i++) { Alumno alumno = new Alumno(i, "0000" + i, "Alumno " + i); listaAlumnos.add(alumno);

for (int j = 1; j <= 3; j++) { alumno.addMateria(new Materia(j, "Materia " + j)); } }

JasperReport reporte = (JasperReport) JRLoader.loadObject("reporteMaestroDS.jasper"); JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaAlumnos)); JRExporter exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("reporteMaestroDS.pdf")); exporter.exportReport(); }}

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88

Page 217: 5.confección de informes

217

iReport – Confección de informe

Esto generará un archivo llamado "reporteMaestroDS.pdf" en el directrio raíz del proyecto de NetBeans. El archivo tendrá el siguiente contenido:

Jose Alberto Benítez Andrades– [email protected] - @jabenitez88