Este documento describe cómo crear informes con iReport y JasperReports. Explica que JasperReports es un motor de creación de informes de código abierto que puede generar informes en varios formatos a partir de diferentes fuentes de datos. iReport es un diseñador gratuito para crear informes sofisticados con JasperReports que incluyen gráficos, tablas y más. Luego guía al lector a través de los pasos para instalar iReport, crear un datasource para una base de datos MySQL, diseñar una consulta para recuperar datos y cre
1. Desarrollo de interfaces:
5.CONFECCIÓN DE INFORMES
Jose Alberto Benítez Andrades
jose@indipro.es
www.indipro.es
@indiproweb
@jabenitez88
Jose Alberto Benítez Andrades– jose@indipro.es - @indiproweb 1
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– jose@indipro.es - @jabenitez88 2
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– jose@indipro.es - @jabenitez88 3
4. iReport – INSTALACIÓN
http://community.jaspersoft.com
/download
Debemos descargar
iReportDesigner y JasperReports
Library.
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 4
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– jose@indipro.es - @jabenitez88 5
6. iReport – Creación de un informe
insert 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– jose@indipro.es - @jabenitez88 6
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– jose@indipro.es - @jabenitez88 7
8. iReport – Creación de un informe
Se abrirá la ventana
de Connections /
Datasources y
clickamos en New
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 8
9. iReport – Creación de un informe
Seleccionamos
Database JDBC
Connection
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 9
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– jose@indipro.es - @jabenitez88 10
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– jose@indipro.es - @jabenitez88 11
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 reporte
6. Felicitación por terminar nuestro informe.
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 12
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– jose@indipro.es - @jabenitez88 13
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– jose@indipro.es - @jabenitez88 14
15. iReport – Creación de un informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 15
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– jose@indipro.es - @jabenitez88 16
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– jose@indipro.es - @jabenitez88 17
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– jose@indipro.es - @jabenitez88 18
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– jose@indipro.es - @jabenitez88 19
20. iReport – Creación de un informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 20
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– jose@indipro.es - @jabenitez88 21
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– jose@indipro.es - @jabenitez88 22
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– jose@indipro.es - @jabenitez88 23
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– jose@indipro.es - @jabenitez88 24
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– jose@indipro.es - @jabenitez88 25
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– jose@indipro.es - @jabenitez88 26
27. iReport – Creación de un informe
Clickamos en Tools -> libraries
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 27
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– jose@indipro.es - @jabenitez88 28
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– jose@indipro.es - @jabenitez88 29
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– jose@indipro.es - @jabenitez88 30
31. iReport – Creación de un informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 31
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– jose@indipro.es - @jabenitez88 32
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– jose@indipro.es - @jabenitez88 33
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– jose@indipro.es - @jabenitez88 34
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– jose@indipro.es - @jabenitez88 35
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– jose@indipro.es - @jabenitez88 36
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– jose@indipro.es - @jabenitez88 37
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– jose@indipro.es - @jabenitez88 38
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– jose@indipro.es - @jabenitez88 39
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– jose@indipro.es - @jabenitez88 40
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– jose@indipro.es - @jabenitez88 41
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();
Por
JRExporter 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– jose@indipro.es - @jabenitez88 42
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– jose@indipro.es - @jabenitez88 43
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– jose@indipro.es - @jabenitez88 44
45. iReport – Creación de un informe
PARTE 2: Uso de DataSources
Personalizados
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 45
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– jose@indipro.es - @jabenitez88 46
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– jose@indipro.es - @jabenitez88 47
48. iReport – Creación de un informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 48
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– jose@indipro.es - @jabenitez88 49
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– jose@indipro.es - @jabenitez88 50
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– jose@indipro.es - @jabenitez88 51
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– jose@indipro.es - @jabenitez88 52
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– jose@indipro.es - @jabenitez88 53
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– jose@indipro.es - @jabenitez88 54
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– jose@indipro.es - @jabenitez88 55
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– jose@indipro.es - @jabenitez88 56
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– jose@indipro.es - @jabenitez88 57
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– jose@indipro.es - @jabenitez88 58
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– jose@indipro.es - @jabenitez88 59
60. iReport – Creación de un informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 60
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– jose@indipro.es - @jabenitez88 61
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– jose@indipro.es - @jabenitez88 62
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– jose@indipro.es - @jabenitez88 63
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– jose@indipro.es - @jabenitez88 64
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– jose@indipro.es - @jabenitez88 65
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– jose@indipro.es - @jabenitez88 66
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– jose@indipro.es - @jabenitez88 67
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– jose@indipro.es - @jabenitez88 68
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– jose@indipro.es - @jabenitez88 69
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– jose@indipro.es - @jabenitez88 70
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– jose@indipro.es - @jabenitez88 71
72. iReport – Creación de un informe
else 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– jose@indipro.es - @jabenitez88 72
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– jose@indipro.es - @jabenitez88 73
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– jose@indipro.es - @jabenitez88 74
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– jose@indipro.es - @jabenitez88 75
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– jose@indipro.es - @jabenitez88 76
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– jose@indipro.es - @jabenitez88 77
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– jose@indipro.es - @jabenitez88 78
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– jose@indipro.es - @jabenitez88 79
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– jose@indipro.es - @jabenitez88 80
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– jose@indipro.es - @jabenitez88 81
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– jose@indipro.es - @jabenitez88 82
83. iReport – Creación de un informe
PARTE 3: Parámetros y Variables
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 83
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– jose@indipro.es - @jabenitez88 84
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– jose@indipro.es - @jabenitez88 85
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– jose@indipro.es - @jabenitez88 86
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– jose@indipro.es - @jabenitez88 87
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– jose@indipro.es - @jabenitez88 88
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– jose@indipro.es - @jabenitez88 89
90. iReport – Creación de un informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 90
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– jose@indipro.es - @jabenitez88 91
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– jose@indipro.es - @jabenitez88 92
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– jose@indipro.es - @jabenitez88 93
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– jose@indipro.es - @jabenitez88 94
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– jose@indipro.es - @jabenitez88 95
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– jose@indipro.es - @jabenitez88 96
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– jose@indipro.es - @jabenitez88 97
98. iReport – Creación de un informe
Si ejecutamos nuestro
reporte obtendremos un
archivo con el siguiente
contenido:
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 98
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– jose@indipro.es - @jabenitez88 99
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– jose@indipro.es - @jabenitez88 100
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– jose@indipro.es - @jabenitez88 101
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– jose@indipro.es - @jabenitez88 102
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– jose@indipro.es - @jabenitez88 103
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– jose@indipro.es - @jabenitez88 104
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– jose@indipro.es - @jabenitez88 105
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– jose@indipro.es - @jabenitez88 106
107. iReport – Creación de un informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 107
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– jose@indipro.es - @jabenitez88 108
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– jose@indipro.es - @jabenitez88 109
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– jose@indipro.es - @jabenitez88 110
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– jose@indipro.es - @jabenitez88 111
112. iReport – Creación de un informe
PARTE 4: Gráficas en reportes
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 112
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– jose@indipro.es - @jabenitez88 113
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– jose@indipro.es - @jabenitez88 114
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– jose@indipro.es - @jabenitez88 115
116. iReport – Creación de un informe
El código de la clase Jugador queda de
la siguiente forma:
public class Jugador public int getId()
{ {
private int id; return id;
private String nombre; }
private String consola;
public void setId(int id)
public Jugador(int id, String nombre, String consola) {
{ this.id = id;
this.id = id; }
this.nombre = nombre;
this.consola = consola; public String getNombre()
} {
return nombre;
public String getConsola() }
{
return consola; public void setNombre(String nombre)
} {
this.nombre = nombre;
public void setConsola(String consola) }
{ }
this.consola = consola;
}
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 116
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– jose@indipro.es - @jabenitez88 117
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– jose@indipro.es - @jabenitez88 118
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– jose@indipro.es - @jabenitez88 119
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– jose@indipro.es - @jabenitez88 120
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– jose@indipro.es - @jabenitez88 121
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– jose@indipro.es - @jabenitez88 122
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– jose@indipro.es - @jabenitez88 123
124. iReport – Creación de un informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 124
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– jose@indipro.es - @jabenitez88 125
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– jose@indipro.es - @jabenitez88 126
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– jose@indipro.es - @jabenitez88 127
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– jose@indipro.es - @jabenitez88 128
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– jose@indipro.es - @jabenitez88 129
130. iReport – Confección de informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 130
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– jose@indipro.es - @jabenitez88 131
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– jose@indipro.es - @jabenitez88 132
133. iReport – Confección de informe
Finalmente este es el codigo de la clase Main (omitiendo los imports):
public class Main JasperReport reporte =
{ (JasperReport)JRLoader.loadObject("reporteGrafica.jasper");
public static void main(String[] args) throws Exception JasperPrint jasperPrint =
{ JasperFillManager.fillReport(reporte, null, new
List listaJugadores = new ArrayList(); JRBeanCollectionDataSource(listaJugadores));
for (int i = 1; i <= 49; i++)
JRExporter exporter = new JRPdfExporter();
{
listaJugadores.add(new Jugador(i, "Jugador " + i , "Wii"));
} exporter.setParameter(JRExporterParameter.JASPER_PRINT,
jasperPrint);
for(int i = 50; i <= 79; i++)
{ exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
listaJugadores.add(new Jugador(i, "Jugador " + i , "XBox")); new File("reporte grafica.pdf"));
}
exporter.exportReport();
for(int i = 80; i <= 100; i++)
}
{
listaJugadores.add(new Jugador(i, "Jugador " + i , "PS3")); }
}
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 133
134. iReport – Creación de un informe
PARTE 5: Grupos y subgrupos
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 134
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– jose@indipro.es - @jabenitez88 135
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– jose@indipro.es - @jabenitez88 136
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– jose@indipro.es - @jabenitez88 137
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– jose@indipro.es - @jabenitez88 138
139. iReport – Confección de informe
Jose Alberto Benítez Andrades– jose@indipro.es - @jabenitez88 139
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– jose@indipro.es - @jabenitez88 140
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– jose@indipro.es - @jabenitez88 141
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– jose@indipro.es - @jabenitez88 142
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– jose@indipro.es - @jabenitez88 143
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– jose@indipro.es - @jabenitez88 144
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– jose@indipro.es - @jabenitez88 145
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– jose@indipro.es - @jabenitez88 146