You are on page 1of 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); 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(); JasperFillManager.fillReport(reportFile.getPath(),

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 import import import import import import import import import java.io.File; java.io.IOException; java.util.HashMap; java.util.Map; javax.faces.context.ExternalContext; javax.faces.context.FacesContext; javax.servlet.ServletContext; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; 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

You might also like