Está en la página 1de 55

UNIVERSIDAD DE EL SALVADOR

ADACAD

JasperReports
Elaborado por:
Rudy Chicas
Jefe de ADACAD

Ciudad Universitaria, diciembre de 2010

Indice de contenido
INTRODUCCION..........................................................................................................................i
INSTALACION DE PLUGIN iReport PARA NetBeans................................................................1
ORIGENES DE DATOS..............................................................................................................1
Conexiones JDBC...................................................................................................................3
JavaBeans..............................................................................................................................8
ESTRUCTURA DE REPORTES...............................................................................................15
ELEMENTOS INTERNOS DE UN REPORTE..........................................................................16
Styles....................................................................................................................................17
Parameters...........................................................................................................................17
Fields.....................................................................................................................................19
Variables...............................................................................................................................19
Scriplets................................................................................................................................20
Bandas..................................................................................................................................21
DISEO DE REPORTES..........................................................................................................21
Elementos de reportes..........................................................................................................21
Construyendo el reporte.......................................................................................................23
Manejo de Grupo..................................................................................................................35
IMPLEMENTACION DE REPORTES EN APLICACION JSF...................................................45
Configuracin de los servlets................................................................................................45
Clases para el soporte de reportes......................................................................................47
Clase de implementacin de Reporte..................................................................................50
Integrando con la vista..........................................................................................................51
BIBLIOGRAFIA.........................................................................................................................53

INTRODUCCION
iReport es la interfaz de usuario ms frecuentemente utilizada para el uso de las libreras
JasperReports. JasperReports es una herramienta para la creacin de informes en Java, que permite
la adicin de contenido enriquecido a los informes.
iReport permite crear los archivos fuentes de los reportes, y compilarlos para crear un archivo de
extensin .jasper. Estos archivos son los que se utilizan para la implementacin de los reportes en las
aplicaciones Java.

INSTALACION DE PLUGIN iReport PARA NetBeans


El plugin de iReport para NetBeans puede ser descargado en la siguiente direccin:
http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=4425
Para realizar la instalacin hay que seguir la forma tpica para instalar un plugin en NetBeans.

ORIGENES DE DATOS
Tanto el IDE tradicional de iReport como el plugin de iReport para NetBeans permiten la configuracin
de varios orgenes de datos.
Los orgenes de datos que pueden ser usados con reportes JasperReports son:

Conexiones JDBC

JavaBeans

XML

CSV

Hibernate connection

Spring-loaded Hibernate connection

Proveedor de origen de datos JasperReports

Orgenes de datos personalizados

Conexin LDAP Mondrian

Conexin XML/A

EJBQL Connection

Origen de datos vaco

En este documento nos centraremos en el estudio de las conexiones JDBC y los orgenes de datos
JavaBeans.
Los orgenes de datos sirven para tener acceso a un conjunto de datos en tiempo de diseo de los
reportes, y no significa que al ser configurado para el diseo del reporte, estar disponible en tiempo
de ejecucin.
Para definir un origen de datos es necesario hacer clic sobre el botn de configuracin. La siguiente
figura muestra el botn de configuracin de orgenes de datos en una instalacin en NetBeans.

Conexiones JDBC
Los orgenes de datos del tipo JDBC son conexiones directas a la base de datos que estarn
disponibles en tiempo de diseo.
Para definir una conexin JDBC se debe acceder al editor de orgenes de datos de iReport, y
seleccionar la opcin Database JDBC connection.

Al hacer clic en el botn Next aparecer la interfaz de configuracin de la conexin.

En este interfaz habr que especificar el nombre de la conexin, el driver JDBC a utilizar, el URL de la
conexin, el nombre de usuario de la base con la que nos queremos conectar y el password.

Para probar la conexin, podemos usar el botn Test. Se nos pedir que confirmemos la clave del
usuario, y si no hay errores, el sistema nos enviar un mensaje de xito de la conexin.
Posteriormente podemos guardar los datos de la conexin.

Para especificar qu datos se usarn en el reporte, es necesario especificar una consulta para el
reporte (Report Query). La consulta del reporte puede ser de cualquiera de los tipos de orgenes de
datos soportados.
Para las conexiones JDBC la consulta del reporte es una consulta SQL a la base de datos, como se
muestra en la siguiente figura.

Al escribir la consulta, iReport retorna los campos especificados en la sentencia SQL y sus tipos de
datos. Es tambin posible hacer una revisin de los datos en la base de datos haciendo clic en el
botn Refresh Preview Data.

JavaBeans
Los orgenes de datos del tipo JavaBeans set Datasource son orgenes de datos basados en clases
Java que retornarn una coleccin (Collection) o arreglo (Array) de objetos de una clase Java que
contiene los datos que necesitamos mostrar en el reporte.
Aunque no es indispensable, si deseamos contar con un conjunto de datos que nos sirva para realizar
pruebas del reporte en tiempo de diseo, deberemos especificar una clase que genere dichos datos.
Esta clase no ser parte de nuestra aplicacin, por lo que debemos escribirla en un paquete separado
del resto.
Como ejemplo, se muestra la clase CarrerasDataSourceDesing, que se encuentra en el paquete
reportdesing.

Lista de cdigo 3.2.1: Clase CarrerasDataSourceDesing, origen de datos para el diseo del reporte.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package reportdesing;
import control.CarrerasBean;
import java.util.ArrayList;
import java.util.Collection;
/**
*
* @author rchicas
*/
public class CarrerasDataSourceDesing {
public static Collection getCarreras() {
ArrayList carreras = new ArrayList();
for(int i=0;i<=10;i++){
CarrerasBean carrera = new CarrerasBean();
carrera.setCodigo("ABC" + i);
carrera.setIdCarrera(i);
carrera.setMaxInscribir(5);
carrera.setNombre("Nombre Carrera" + i);
carrera.setPlanEstudios("Plan"+i);
carrera.setTotalUV(48+i);
carreras.add(carrera);
}
}

return carreras;

Adicionalmente es necesario especificar el mtodo esttico que devolver la coleccin o el arreglo de


objetos, que en este caso es llamado getCarreras.

Para acceder a la clase y su mtodo, iReport requiere de la configuracin de Classpath, en el que se


debe especificar la ruta donde se encuentra las clases a las que se est haciendo referencia. Si
utilizamos el plugin de NetBeans, para configurar el Classpath es necesario ir al men Opciones
(Options), seleccionar iReport y la pestaa Classpath.

10

Si iReport puede acceder a la clase y su mtodo, al presionar el botn Test mostrar un mensaje de
xito.
Para utilizar este tipo de orgenes de datos, se debe especificar la clase de los objetos que nos
devolver el mtodo especificado, en este caso getCarreras. En otras palabras, el mtodo
getCarreras devuelve una coleccin de objetos del tipo CarrerasBean, por lo que la clase que se
especifique en la consulta del reporte debe ser del tipo CarrerasBean.

11

En la interfaz en la que se especifica la consulta del reporte, se debe seleccionar los atributos de la
clase que formarn parte de nuestro reporte. Esto se hace seleccionando los atributos de la clase y
haciendo clic en el botn Add selected field. Estos sern los campos que estarn disponibles en el
reporte como campos (fields).

12

Si deseamos ver los datos de prueba hacemos clic en el botn Refresh Preview Data, lo que
ejecutar el mtodo getCarreras y devolver la coleccin de objetos.

13

Puede observarse que los datos que devuelve la vista previa son los datos que se generan en el
mtodo getCarreras, no los que se encuentran en la base de datos, puesto que no se est usando
una conexin a la base.
La configuracin de la clase que generar la coleccin de datos es opcional, ya que su nico objetivo
es poner a nuestra disposicin un conjunto de datos para la vista preliminar del reporte.

En caso de optar por no crear dicha clase, las pruebas del


reporte debern hacerse cuando ste haya sido integrado a la
aplicacin.

14

ESTRUCTURA DE REPORTES
Un reporte basado en JasperReports consta de los siguiente elementos:

Title: Titulo del reporte. La informacin contenida en esta banda ser mostrada una sola vez
en la primera pgina del reporte.

Page Header: Encabezado de pgina. La informacin contenido en esta banda ser mostrada
en cada pgina del reporte.

Column Header: Encabezado de columna. El uso ms frecuente de esta banda es para


desplegar los encabezados de las tablas de datos en los reportes tipo cuadrculas.

Detail: Detalle del reporte. En esta banda incluyen los campos que constituyen el detalle del
reporte. En un reporte tipo cuadrcula se colocan los campos de la tabla.

Column Footer: Pie de columna. Se utiliza generalmente para totalizar el detalle de cada
campo (columna). Tanto el encabezado de columna, como el pi de columna solo sern
mostrados cuando inicia el set de datos y cuando termina.
Si se requiere que el encabezado de las columnas aparezca en todas las pginas, se debern
colocar los encabezados en el elemento Page Header.

Page Footer: Ser mostrado en todas las pginas del reporte.

Sumary: Resumen. Se muestra nicamente en la ltima pgina del reporte. Generalmente es


usado para consolidar datos mostrados en las otras partes del reporte.

15

ELEMENTOS INTERNOS DE UN REPORTE


La estructura de objetos para un reporte Jarper puede verse en la barra de objetos del reporte
mostrado en la siguiente figura.

16

Utilizaremos la estructura de objetos del rbol de objetos, para explicar las caractersticas bsicas de
cada elemento.

Styles
El nodo Styles permite agregar estilos personalizados o referencias a estilos por defecto al reporte.
Un estilo es una coleccin de propiedades predefinidas que se refieren al aspecto de los elementos
(como color de fondo, bordes, y fuentes).
Es posible definir un estilo por defecto para el reporte, para que todas las propiedades no definidas de
un elemento se refieran e ese estilo.

Parameters
Los parmetros definidos por defecto son utilizados para recibir informacin de la clase que invoca y
ejecuta el reporte. Pueden ser utilizados para guiar un comportamiento especfico durante el tiempo
de ejecucin y para proveer datos adicionales para el contexto de impresin como imgenes, ttulos,
etc.

17

La referencia a los parmetros se realizar a travs de la expresin:

$P{nombre_parametro}

El parmetro especial REPORT_PARAMETERS_MAP es de tipo Map compuesto por el par de


valores <Nombre_Parametro, Valor>. La expresin empleada para invocar un valor de ese parmetro
tendr la forma:

$P{REPORT_PARAMETERS_MAP}.get(Nombre_Parametro)

18

Fields
Los campos se refieren a los campos del conjunto de datos que devuelve un origen de datos. Estos
son identificados por un nombre, un tipo y una descripcin opcional.
La forma de hacer referencia a un campo es a travs de la expresin:
$F{nombre_campo}

Variables
Las variables son objetos que se usan para almacenar resultados de clculos como subtotales,
sumas, entre otros. Las variables deben tener un tipo de dato asignado, tal como los parmetros y los
campos.
Las variables cuentan con algunos atributos que las diferencian de los parmetros y los campos:

19

Calculation: Es el mtodo de clculo que se aplicar a la variable. Los tipos de clculos que se
pueden seleccionar son:

Nothing. No se realiza ningn clculo.

Count. Cuenta el nmero de veces que la expresin resulta en valores diferentes a nulo.

Distict count. Cuenta el nmero expresiones resultantes diferentes entre s. El orden entre
las expresiones no es tomado en cuenta.

Sum. Para cada iretacin, suma al valora actual el valor de la expresin actual.

Average. Calcula el promedio aritmtico de todas las expresiones recibidas.

Lowest. Retorna la expresin de menor valor de las recibidas.

Highest. Retorna la expresin de mayor valor de las recibidas.

Standard derivation. Calcula la desviacin estndar de las expresiones recibidas.

Variance. Calcula la varianza de las expresiones recibidas.

System. Esta opcin no realiza ningn clculo, ni se evala ninguna expresin. El


reporteador mantiene en memoria el ltimo valor asignado a la variable.

First. Devuelve la primera expresin evaluada.

Las variables tambin cuentan con un tipo de reinicio (reset type), que especifica el momento
en que una variable ser reiniciada. Los tipos de reinicio son:

None. El valor inicial de la variable es ignorado siempre.

Report. La variable ser inicializada solo cuando se inicia la creacin del reporte.

Page. La variable es inicializada cada vez que se despliega una pgina.

Column. La variable es inicializada cada vez que se despliega una columna.

Group. La variable es inicializada cada vez que se despliega un grupo nuevo.

Scriplets
Para
implementar
un
scriptlet
es
necesario
extender
la
clase
nt.sf.jasperreports.engine.JRAbstractScriptlet. Esta clase expone un conjunto de mtodos para
manejar los eventos que ocurren durante la generacin de un reporte, y provee la estructura de datos
para acceder a todas las variables, campos y parmetros del reporte.
En otras palabras, un scriptlet permite manipular un reporte desde una clase Java, de tal manera que
es posible modificar el comportamiento especificado durante su diseo.

20

Bandas
Como se explic en el apartado Estructura de reportes la estructura de un reportes est compuesta
por 8 bandas principales y el backgroud (9 bandas en total). Pueden agregarse dos bandas ms:
group header y group footer.

DISEO DE REPORTES
El diseo de los reportes se realiza a travs de la paleta de elementos de reportes. Los elementos
son insertados en la banda en la que deseamos que aparezca, arrastrando el elemento de la paleta a
la banda correspondiente.

Elementos de reportes

Line

Rectangle

Elipse

Static Text

Text Field

Image

Subreport

Cosstab

Chart

Frame

Los elementos del reporte estn disponibles en la paleta de controles de iReport en NetBeans (barra
de herramientas en la interfaz clsica de iReport).

21

Para agregar un elemento al reporte, se debe seleccionar uno de los controles y arrastrarlo a la
banda en la que desea que aparezca.

22

Una vez que el elemento se encuentra en la banda, puede ser editado a travs de la ventana
propiedades.

Construyendo el reporte
Para explicar el proceso de construccin de reportes se realizar como ejemplo, un reporte que
muestre las carreras almacenadas en la tabla carreras de la base de datos.
Dado que en las aplicaciones instituciones se usar JavaBean datasource como orgenes de datos,
desarrollaremos este ejemplo usando ese tipo de origen de datos.
Lo primero ser configurar el origen de datos como se explic en el apartado Orgenes de
datos/JavaBeans. Cuando ya tenemos la consulta del reporte configurada, podemos proceder al
diseo del reporte.
La clase CarrerasBean que ser el JavaBean a utilizar como origen de datos se muestra en la lista de
cdigo 6.2.1.
Lo primero que haremos es insertar un texto esttico con el ttulo del reporte. Para ello hay que
arrastrar a la banda Title un elemento Static Text de la paleta de controles. Los elementos de texto
esttico pueden ser editados al hacer doble clic sobre l.

23

Lista de cdigo 6.2.1: Bean administrado CarrerasBean


package control;
import
import
import
import

dao.impl.CarreraDaoImpl;
javax.faces.context.FacesContext;
javax.servlet.ServletContext;
org.springframework.web.context.support.WebApplicationContextUtils;

/*
*
* @author rchicas
*/
public class CarrerasBean {
private
private
private
private
private
private

int idCarrera;
String codigo;
String nombre;
String planEstudios;
int totalUV;
int maxInscribir;

/**
* Accin para almacenamiento
*/
public void guardarAction() {
ServletContext servletContext = (ServletContext)
FacesContext.getCurrentInstance().getExternalContext().getContext();
CarreraDaoImpl carreraDao = (CarreraDaoImpl)
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext).getBean("ca
rreraDao");
}

Integer id = carreraDao.guardar(this);

public void actualizarAction() {


ServletContext servletContext = (ServletContext)
FacesContext.getCurrentInstance().getExternalContext().getContext();
CarreraDaoImpl carreraDao = (CarreraDaoImpl)
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext).getBean("ca
rreraDao");
}

carreraDao.actualizar(this);

public void borrarAction() {


ServletContext servletContext = (ServletContext)
FacesContext.getCurrentInstance().getExternalContext().getContext();
CarreraDaoImpl carreraDao = (CarreraDaoImpl)
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext).getBean("ca
rreraDao");
}

carreraDao.borrar(idCarrera);

...
/*Mtodos get y set */
...
}

24

Una vez que se ha habilitado la posibilidad de edicin del texto por defecto, escribimos
Universidad de El Salvador
Sistema de Administracin Acadmica

Otra posibilidad para editar el texto de un elemento de texto esttico es ir a las propiedades del
elemento y hacer clic en el botn de modificacin de la propiedad Text.
Ahora podemos aplicar formato al texto. En este caso, haremos que el texto sea mostrado en
negritas. Para ello, en la ventana de propiedades del elemento, buscar la opcin Bold y hacer clic en
el checkbox que corresponde.

25

Ahora agregaremos el ttulo del reporte, que obtendremos de un parmetro enviado al reporte desde
la aplicacin que lo invocar.
Para ello, incorporamos a la banda Title un elemento del tipo Text Field, que inicialmente aparecer
vaco.
Una vez que se ha agregado a la banda, hacemos clic derecho en l y seleccionamos la opcin Edit
expression.

26

En la ventana de edicin de expresiones, escribimos la expresin:

$P{REPORT_PARAMETERS_MAP}.get(ReportTitle)

Esta expresin evala el mapa de parmetros REPORT_PARAMETERS_MAP y obtiene el parmetro


ReportTitle.

Ahora pasaremos a incorporar los campos de los datos que deseamos mostrar. Para ello, podemos
seleccionar los campos que se han definido como parte de la consulta del reporte.
En el rbol de objetos del reporte, expandimos el nodo Fields. Esto nos mostrar los campos
disponibles que fueron configurados en la consulta del reporte. Una forma de crear el cuadro de datos
que deseamos mostrar es seleccionar los campos y arrastrarlos a la banda Detail. iReport colocar
etiquetas en la banda Column Header y los elementos Text Field en la banda Detail.

27

Modificamos los Static Text de Column Header, escribindo el texto en maysculas, modificando la
propiedad Bold para que el texto sea mostrado en negritas y la propiedad Horizontal Alignment a
Center para que el texto sea centrado.
Dado que se trata de una tabla de datos, agregaremos los bordes a la tabla. Para ello, en el
encabezado del reporte, agregamos un elemento Rectangle para que sea el marco de los
encabezados de columna.

28

Para que el elemento sea mostrado, hacer clic derecho en el rectngulo y seleccionamos la opcin
Send to Back, para que el elemento quede detrs de los cuadros de texto esttico.
Posterior a eso, es necesario agregar las lneas de los campos. Para ello usaremos objetos Line,
haciendo una especie de rectngulo abierto por arriba. En otras palabras, habr que agregar una
lnea horizontal inferior, y las lneas verticales de separacin entre los campos. La lnea horizontal
superior no es necesaria.
Una vez hecho esto, incorporaremos al reporte los campos que muestren el nmero de pgina y el
total de pginas. iReport ya cuenta con una herramienta que ingresa los elementos de texto para los
campos y sus respectivos valores.
Para hacer esto, es necesario arrastrar de la paleta de controles, la herramienta Page X of Y a la
banda de Encabezado de pgina.

29

La herramienta agrega a la banda dos elementos uno con el valor:


"Pg. "+$V{PAGE_NUMBER}+" de"

Y el otro con el valor:


" " + $V{PAGE_NUMBER}

En ambos casos, el tipo de dato del elemento es de tipo String, por lo que es permitido realizar la
concatenacin de los valores. El tipo de dato de las variables, campos, parmetros y de los Text
Fields son definidos en la propiedad Expression class.
Se puede observar que el funcionamiento del control de pginas est basado en una variable de
nombre PAGE_NUMBER, que es una variable predefinida en todos los reportes creados con iReport.

30

31

Por ser una variable intrnseca sus propiedades no estn disponibles en tiempo de diseo. Sin
embargo es importante tener claro que se trata de una variable de tipo entera y cuya operacin es
COUNT y cuyo tipo de reinicio es Report.
Estas caractersticas harn que la variable cuente el nmero de veces que es evaluada (invocada) en
el reporte, acumulando 1 por cada vez que es evaluada. Esto permite que al utilizar la variable en el
reporte, en el primer cuadro de texto (que muestra la pgina actual) se utiliza el tipo de evaluacin
Now, es decir que el valor de la variable se mostrar en ese cuadro de texto cada vez que sea
necesario desplegar ese elemento.
En el siguiente cuadro de texto, que muestra el total de pginas, la variable se evala en el contexto
del reporte. En otras palabras, cuando ese cuadro de texto sea evaluado, el cuadro de texto mostrar
el valor con el que termin esa variable al finalizar la construccin del reporte. Eso significa, el total de
pginas.

Finalmente, ingresamos al reporte un logotipo de la institucin. Para ello arrastramos un control


Image de la paleta de controles.
Esto nos mostrar un elemento de imagen dentro de la banda a la que la hayamos arrastrado. Para
este caso, la arrastraremos a la banda Title

32

Ajustamos la imagen para que se muestre con el tamao y ubicacin que sea necesaria.

33

Para verificar el diseo del reporte, podemos usar la opcin Preview. Para ello hacemos clic en la
pestaa Preview, compilar el reporte y generar una vista preliminar del mismo.

Podemos observar que el ttulo del reporte se muestra con un valor null. Esto es as porque el valor
que se desplegar es un parmetro que no ha sido recibido. Para que el reporte no muestre la
palabra null cuando se encuentran valores nulos, es necesario modificar la propiedad del elemento a
Blank when null.

34

Manejo de grupos
Los grupos es la forma en la que JasperReports permite organizar los datos en bloques de datos de
acuerdo a los criterios de agrupamiento. Un grupo es definido a travs de una expresin. Cuando
esta expresin cambia su valor, un nuevo grupo es iniciado.
Para ejemplificar esto, usaremos el ejemplo anterior, agregando el atributo facultad a la clase
CarrerasBean y por ende, agregando al mtodo que genera los datos de muestra para tiempo de
diseo, el cdigo necesario para que incluya valores para ese atributo.
La clase CarrerasBean modificada se muestra en la lista de cdigo 6.3.1
Lista de cdigo 6.3.1: Bean administrado CarrerasBean modificado
package control;
import
import
import
import

dao.impl.CarreraDaoImpl;
javax.faces.context.FacesContext;
javax.servlet.ServletContext;
org.springframework.web.context.support.WebApplicationContextUtils;

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author rchicas
*/
public class CarrerasBean {
private int idCarrera;
private String codigo;
private String nombre;
private String planEstudios;
private int totalUV;
private int maxInscribir;
private String facultad;
...
/**
* @return the facultad
*/
public String getFacultad() {
return facultad;
}
/**
* @param facultad the facultad to set
*/
public void setFacultad(String facultad) {
this.facultad = facultad;
}
}

35

El mtodo getCarreras de la clase CarrerasDataSourceDesing se muestra en la lista de cdigo 6.3.2.


Lista de cdigo 6.3.2: Clase CarrerasDataSourceDesing modificada.
package reportdesing;
import control.CarrerasBean;
import java.util.ArrayList;
import java.util.Collection;
/**
*
* @author rchicas
*/
public class CarrerasDataSourceDesing {
public static Collection getCarreras(){
ArrayList carreras = new ArrayList();
for(int i=0;i<=10;i++){
CarrerasBean carrera = new CarrerasBean();
carrera.setCodigo("ABC" + i);
carrera.setIdCarrera(i);
carrera.setMaxInscribir(5);
carrera.setNombre("Nombre Carrera" + i);
carrera.setPlanEstudios("Plan"+i);
carrera.setTotalUV(48+i);
if(i%2 > 0 || i==0)
carrera.setFacultad("Facultad"+i);
else
carrera.setFacultad("Facultad"+(i-1));
}

carreras.add(carrera);

return carreras;
}

El mtodo genera una carrera para la facultad 0 y dos carreras para el resto de las facultades, para
permitirnos apreciar el manejo de los grupos.
Posterior a ello, habr que agregar el atributo faculta a la consulta del reporte. Una vez hecho esto, es
necesario agregar el grupo al reporte, para ello hay que hacer clic derecho en el nodo principal del
rbol de objetos del reporte o sobre una de las bandas. Esto nos mostrar un men contextual en el
que deberemos seleccionar la opcin Add Report Group.

36

Esto nos mostrar un asistente con el que podremos configurar el grupo. Indicamos que nombre del
grupo y la expresin que lo definir. En nuestro caso, la expresin es el campo facultad.

37

Cuando finalizamos la configuracin del grupo, iReport nos muestra las bandas que hemos incluido
en el reporte. En este caso las bandas Group Header y Group Footer.

38

Agregamos un texto de campo a la banda facultad Group Header para que cada vez que cada vez
que inicie un nuevo grupo, muestre el nombre del nuevo grupo. En este caso, los grupos estn
basados en el nombre de la facultad, por lo que el campo a mostrar es el de facultad.

39

40

Copiamos los elementos de lnea para la rejilla de datos y la pegamos en la banda que estamos
editando.

41

42

iReport crea una variable contador por cada grupo. Esto permite contar el nmero de registros por
cada grupo.
Usaremos esa variable para que en el footer del grupo nos muestre el valor con un texto.
Para ello, agregamos un Text Field a la banda facultad Group Footer, y editamos la expresin.

Ahora copiamos los elementos de lnea de la banda facultad Group Header y la pegamos en la banda
que estamos editando.
Para ajustar el tamao de las bandas, hay que mover el borde inferior de la banda hacia arriba o
abajo segn se desee. Para ajustar la banda a su lmite inferior, basta con dar doble clic al borde
inferior y se ajustar a la posicin del elemento ms inferior de la banda.

43

44

Las modificaciones realizadas para los grupos han sido hechas nicamente para que estn
disponibles en tiempo de diseo, ya que en la base de datos no existe ese campo. Por esta razn, a
la hora de realizar la implementacin, no se incluirn las modificaciones relacionadas a esta seccin.

IMPLEMENTACION DE REPORTES EN APLICACION JSF

Configuracin de los servlets


En las aplicaciones JSP, los reportes son resueltos como parte del servlet principal de la aplicacin.
JSF nos permite configurar varios servlets en una aplicacin. Las libreras de JasperReports nos
permiten configurar estos servlets independientes entre s, de acuerdo a los formatos de documento
que deseemos que soporte nuestra aplicacin.
Lista de cdigo 7.1.1: Servlets correspondientes a los formatos soportados
<!-- JasperReports Servlet -->
<servlet>
<servlet-name>PdfServlet</servlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.PdfServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>JExcelApiServlet</servlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.JExcelApiServlet</servletclass>
</servlet>
<servlet>
<servlet-name>RtfServlet</servlet-name>
<servlet-class>net.sf.jasperreports.j2ee.servlets.RtfServlet</servlet-class>
</servlet>
<!-- JasperReports Servlet Mapping -->
<servlet-mapping>
<servlet-name>PdfServlet</servlet-name>
<url-pattern>/servlets/report/PDF</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JExcelApiServlet</servlet-name>
<url-pattern>/servlets/report/EXCEL</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RtfServlet</servlet-name>
<url-pattern>/servlets/report/RTF</url-pattern>
</servlet-mapping>

Tambin crearemos dos clases que darn soporte a los reportes. La primera de ellas ReportUtil
servir para implementar los mtodos de llenado y exportado de los archivos de JasperReports
compilados (.jasper).

45

Clases para el soporte de reportes


Lista de cdigo 7.2.1: Clase de soporte a los reportes

package util;
import java.io.File;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletContext;
import
import
import
import
import
import
import
import

net.sf.jasperreports.engine.JRAbstractExporter;
net.sf.jasperreports.engine.JRDataSource;
net.sf.jasperreports.engine.JRException;
net.sf.jasperreports.engine.JRExporterParameter;
net.sf.jasperreports.engine.JasperFillManager;
net.sf.jasperreports.engine.JasperPrint;
net.sf.jasperreports.engine.export.JRHtmlExporter;
net.sf.jasperreports.engine.export.JRHtmlExporterParameter;

public class ReportUtil {


public static JasperPrint fillReport (File reportFile, Map<String, Object>
parameters, JRDataSource jrDataSource) throws JRException {
parameters.put("BaseDir", reportFile.getParentFile());
JasperPrint jasperPrint =
parameters, jrDataSource);

JasperFillManager.fillReport(reportFile.getPath(),

return jasperPrint;
}
public static String getJasperFilePath (ServletContext context, String reportDir,
String jasperFile) {
return context.getRealPath(reportDir + jasperFile);
}
private static void exportReport (JRAbstractExporter exporter, JasperPrint
jasperPrint, PrintWriter out) throws JRException {
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
}

exporter.exportReport();

public static void exportReportAsHtml (JasperPrint jasperPrint, PrintWriter out)


throws JRException {
JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,
Boolean.FALSE);
exporter.setParameter(JRHtmlExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
Boolean.TRUE);
exporter.setParameter(JRHtmlExporterParameter.CHARACTER_ENCODING, "ISO-8859-9");
}

exportReport(exporter, jasperPrint, out);

46

La clase AbstractBaseReportBean es una clase abstracta que implementa los mtodos bsicos para
el manejo de los reportes. La clase que implementen esta clase, tendrn a su disposicin los mtodos
elementales para el manejo de los reportes, lgicamente debiendo implementar aquellos que no
estn implementados.

Lista de cdigo 7.2.2: Clase abstracta que implementa las funciones bsica del manejo de reportes.

package util;
import
import
import
import

java.io.File;
java.io.IOException;
java.util.HashMap;
java.util.Map;

import
import
import
import
import

javax.faces.context.ExternalContext;
javax.faces.context.FacesContext;
javax.servlet.ServletContext;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

import
import
import
import

net.sf.jasperreports.engine.JRDataSource;
net.sf.jasperreports.engine.JRException;
net.sf.jasperreports.engine.JasperPrint;
net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;

public abstract class AbstractBaseReportBean {


public enum ExportOption {
PDF, HTML, EXCEL, RTF
}
private ExportOption exportOption;
private String reportDir = "/";
public AbstractBaseReportBean() {
super();
setExportOption(ExportOption.PDF);
}
protected void prepareReport() throws JRException, IOException {
ExternalContext externalContext =
FacesContext.getCurrentInstance().getExternalContext();
ServletContext context = (ServletContext) externalContext.getContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
HttpServletResponse response = (HttpServletResponse)
externalContext.getResponse();
File reportFile = new File(ReportUtil.getJasperFilePath(context,
getReportDir(), getNombArch() + ".jasper"));
JasperPrint jasperPrint = ReportUtil.fillReport(reportFile,
getReportParameters(), getJRDataSource());

47

if (getExportOption().equals(ExportOption.HTML)) {
ReportUtil.exportReportAsHtml(jasperPrint, response.getWriter());
} else {
request.getSession().setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESS
ION_ATTRIBUTE, jasperPrint);
response.sendRedirect(request.getContextPath() + "/servlets/report/" +
getExportOption());
}
}

FacesContext.getCurrentInstance().responseComplete();

public ExportOption getExportOption() {


return exportOption;
}
public void setExportOption(ExportOption exportOption) {
this.exportOption = exportOption;
}
protected Map<String, Object> getReportParameters() {
return new HashMap<String, Object>();
}
/**
* @return the reportDir
*/
public String getReportDir() {
return reportDir;
}
/**
* @param reportDir the reportDir to set
*/
public void setReportDir(String reportDir) {
this.reportDir = reportDir;
}
protected abstract JRDataSource getJRDataSource();
protected abstract String getNombArch();
}

Un ejemplo de la implementacin de la clase abstracta, es la lista de cdigo 7.3.1.

48

Clase de implementacin de Reporte


Lista de cdigo 7.3.1: Clase de implementacin del reporte para carreras.

package control;
import
import
import
import
import

util.AbstractBaseReportBean;
java.util.HashMap;
java.util.Map;
javax.el.ValueExpression;
javax.faces.context.FacesContext;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class ReporteCarrerasBean extends AbstractBaseReportBean {
private final String NOMBRE_ARCHIVO = "carreras";
@Override
protected String getNombArch() {
return this.NOMBRE_ARCHIVO;
}
@Override
protected Map<String, Object> getReportParameters() {
Map<String, Object> reportParameters = new HashMap<String, Object>();
reportParameters.put("ReportTitle", "Listado de carreras registradas en el
sistema");
}

return reportParameters;

@Override
protected JRDataSource getJRDataSource() {
ValueExpression ve =
FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueEx
pression(FacesContext.getCurrentInstance().getELContext(), "#{buscarCarreraBean}",
BuscarCarreraBean.class);
BuscarCarreraBean buscarCarreraBean = (BuscarCarreraBean)
ve.getValue(FacesContext.getCurrentInstance().getELContext());
JRBeanCollectionDataSource dataSource = null;
if(buscarCarreraBean !=null){
if(buscarCarreraBean.getListaCarreras() == null)
buscarCarreraBean.buscarTodosAction();
dataSource = new
JRBeanCollectionDataSource(buscarCarreraBean.getListaCarreras());
}
return dataSource;
}

49

public String execute() {


try {
super.prepareReport();
} catch (Exception e) {
}

e.printStackTrace();

return null;
}

Integrando con la vista


La interfaz que se encargar de invocar al mtodo execute de la clase que implementa el reporte
especfico (ReporteCarrerasBean), desplegar las opciones de los formatos disponibles para el
reporte, y la llamada al mtodo a travs de una accin vinculada a un botn, como se muestra en la
lista de cdigo 7.4.1.
Lista de cdigo 7.4.1: Cdigo JSF que pone el reporte a disposicin del usuario
<h:form id="form">
<h:selectOneRadio value="#{reporteCarrera.exportOption}">
<f:selectItem itemValue="PDF" itemLabel="PDF"/>
<f:selectItem itemValue="HTML" itemLabel="HTML"/>
<f:selectItem itemValue="EXCEL" itemLabel="EXCEL"/>
<f:selectItem itemValue="RTF" itemLabel="RTF"/>
</h:selectOneRadio>
<h:commandButton action="#{reporteCarrera.execute}" value="Get Report" />
</h:form>

50

51

BIBLIOGRAFIA

The Definitve Guide to iReport


Guilio Toffoli
Apress

JasperReports and JSF Integration


http://www.jroller.com/hakan/entry/jasperreports_and_jsf_integration

iReport Tutorials & Help


http://jasperforge.org/website/ireportwebsite/IR%20Website/ir_documentation.html?
header=project&target=ireport

52

También podría gustarte