JavaBean Datasource Ireport

5
41071

JavaBean Datasource Ireport

0. Índice de contenidos.

1. Introducción

En esta ocasión vuelvo manos a la obra para explicar cómo realizar un informe con JasperReports-Ireport.
Como ya habréis visto en adictos existen muy buenos tutoriales al respecto,
así que espero aportar mi granito de arena al maravilloso mundo de generación de informes.

La particularidad del caso que nos ocupa, es conseguir que la fuente de datos del informe sea una lista de
JavaBeans y no una consulta definida previamente en el informe.
Esta última opción es una manera muy habitual de definir la fuente de datos, sin embargo,
en ocasiones puede que no sea la opción que maás se adapte a nuestras necesidades.

Por ejemplo, imaginemos que nuestra aplicación gestiona la generación de informes mediante un servlet
que tiene establecido un datasource en concreto pero uno de los informes no recupera
la información que debe mostrar de ese datasource.
Una solución podría ser crear un servlet para cada datasource y que el informe fuese el encargado de ejecutar la consulta.
Pero seguramente no merezca la pena desarrollar un nuevo servlet solo para un informe.

Otra solución es la que nos ocupa, es decir, recuperamos toda la información desde la aplicación, conformamos una lista de objetos con toda esta información e indicamos al informe que ese será su datasource.
Esto es un ejemplo pero seguro que podéis aplicar esta forma de definir el datasource de un informe en más de una ocasión.

A continuación vemos cual será cada uno de los pasos a seguir.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil Dell Latitude E5500(Core Duo T9550 2.66GHz, 4GB RAM, 340 GB HD)
  • Sistema operativo: Windows XP
  • JDK 1.6.0_1
  • Eclipse Galileo
  • Maven 2.1.0
  • MySQL 5.1.40-Comunity
  • JasperReport 3.0.0
  • Ireport 3.5.2

3. Importando a Eclipse

Lo primero de todo para poder probar la aplicación es descargarse los fuentes de aquí.
Hay que tener en cuenta que para el ejemplo he usado MySQL, por tanto si utilizáis cualquier otra base de datos será
necesario modificar el fichero de dependencias y la clase Database.java para establecer correctamente la conexión.
Una vez descargados los fuentes:

  • Importamos el proyecto desde eclipse

  • Seleccionamos Maven 2 Project y pulsamos Next

  • A continuación, buscamos el proyecto dentro del workspace en que tengamos descomprimido los fuentes

  • Por último pulsamos finish.

  • Podemos observar como el proyecto se ha importado correctamente.

Una vez tenemos el proyecto en eclipse será necesario realizar un mvn install desde
línea de comandos para que se descarguen las dependencias necesarias en caso de que todavía
no las tengamos en nuestro repositorio local

4. La Aplicación

La aplicación del ejemplo es muy sencilla y se define en la clase App.java que vemos a continuación:

public class App 
{
	
	
	
	
    public static void main( String[] args ) throws SQLException
    {
    	Connection con=null;
        //Map con los posibles otros parametros del informe
    	HashMap map=new HashMap();
		
    	try {
        	// Recumeramos la conxion a base de datos
        	 con =Database.getConexion();
        	// Recuperamos la lista ojetos que mostraremos en el informe
        	List alumnos=Database.getAlumnos(con);
			// Generamos el informe
        	ReportRoutines.exportPDF(alumnos, map);
        	
        	
        	
        	
			
		} catch (SQLException e) {
			
			e.printStackTrace();
			
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();

		} catch (JRException e) {
			
			e.printStackTrace();
			
		}finally{
			//Cerramos conexion con base de datos
			con.close();
		}
    	
    }
}

Como podemos ver nuestra aplicación recupera la conexión con base de datos, lanza la consulta correspondiente y devuelve una lista de objetos (Alumnos.java).
Finalmente se llama al método encargado de generar el informe pasándole como parámetros la lista de objetos y un map con el resto de posibles parámetros
que necesitase el informe.

De las acciones realizadas, la que verdaderamente nos importa para el caso que nos ocupa es la acción de generar el informe. A continuación
vemos la clase ReportRoutines.java, encargada de gestionar la generación de nuestro informe.

public class ReportRoutines {
	
	
	private static final String REPORT_PATH = "C:\\tutos\\reports\\test.jrxml";
	private static final String REPORT_EXPORT_PATH = "C:\\tutos\\reports\\test.pdf";
	
	/**
	 * Genera el pdf para el informe
	 * @param aux = Lista de objetos que mostraremos en el informe
	 * @param map = Resto de parametros que viajan al informe
	 * @throws JRException
	 */
	
	public static void exportPDF (List aux, HashMap map) throws JRException
	{
			// Definimos cual sera nuestra fuente de datos
			JRBeanCollectionDataSource ds =new JRBeanCollectionDataSource(aux);
			// Recuperamos el fichero fuente 
			JasperDesign jd=JRXmlLoader.load(REPORT_PATH);
			// Compilamos el informe jrxml
			JasperReport report = JasperCompileManager.compileReport(jd);
			// Rellenamos el informe con la conexion creada y sus parametros establecidos
			JasperPrint print = JasperFillManager.fillReport(report,map, ds);
			
			// Exportamos el informe a formato PDF
			JasperExportManager.exportReportToPdfFile(print, REPORT_EXPORT_PATH);
		
	}
	

}

Como he dicho anteriormente aquí es donde esta lo verdaderamente importante para que nuestro informe funcione
con el datasource formado por la lista de objetos recuperados en el paso anterior. Hacemos uso de la clase JRBeanCollectionDataSource para
definir el datasource a partir de la lista de objetos, después basta con pasar ese datasource al método JasperFillManager.fillReport

5. El informe

Una vez que ya sabemos cómo definir el datasource con una lista de objetos nos dispondremos a crear el informe propiamente dicho. En este punto y como veremos
a continuación indicaremos al informe que tipo de objeto será el que conforme la fuente de datos. De esta manera IReports es capaz de leer los fileds del objeto
y podremos utilizar cada uno de estos field en el diseño de nuestro informe.

  • Creamos un informe en blanco

  • Ahora, en el menú lateral izquierdo pulsamo el botón derecho sobre el nombre del informe y seleccioname Edit Query
    • A continuación aparece una ventana emergente con cuatro pestañas. Nos situamos sobre la segunda pestaña, JavaBean Datasource.

    • Indicamos en nombre de la clase con el paquete completo y pulsamos en boton Read attributes
    • Apereceran en la misma venta todos los campos de la clase que le indiquemos. De estos campos seleccionamos aquellos que queremos que se incluir en el informe y pulsamos el botón Add selected field
    • En este punto es importante tener en cuenta que para que Ireport reconozca nuestra clase es necesario añadirle al classpath el jar donde se encuentra dicha clase

    • Comprobamos que tenemos todos los fields disponible para incluir en el informe

    • Por último añadimos los campos recuperados en el informe.

    6. Comprobando el resultado.

    Para poder ver el resultado basta con situarnos encima de la clase App.java y :

    Si nos vamos al directorio de salida definido en la clase ReportRoutines podemos ver que nos ha generado correctamente el informe en PDF.

    7. Conclusiones.

    Como vemos JasperReports-Ireport nos permite de una manera sencilla tener a mano distintas opciones de definir una fuente de datos y creedme, ésto es una ventaja ya que
    en ocasiones y debido a distintos motivos, pero sobre todo a la complejidad de los modelos de datos puede hacerse muy complicado sacar toda la información
    a mostrar en el informe en una sola consulta. Como siempre conocer la herramienta que con la que estamos trabajando supondrá una gran diferencia en nuestra productividad
    así que con este tutorial espero que hayáis aprendido un poquito mas acerca de JasperReports-Ireport.

    Un saludo.

    Saúl

    Correo a: sgdiaz@autentia.com

    5 COMENTARIOS

    1. GEneralmente no leo tutoriales sobre tecnologia en español, pero este ha valido la pena. claro, conciso y corto. un saludo

    2. Hola amigo y en que parte importas la clase de dominio de java al gestor de jasperreports ?

      «com.autentia.tutos.alumnos» eso de donde sale ?

      imagino que tendras que crear un data adapter para colecciones de objetos con su «JRDataSourceFactory»

      eso no lo explicas en el tutorial es decir esta incompleto , o es intencionado ? yo siempre intento que el contenido que realizo tenga un minimo de calidad

      saludos

    3. ¡Muy bueno!
      Me gustaria plantear una duda:
      Cuando hacemos un listado, si la ultima linea de detalle es la 4 ó la 5..,
      Como podemos subir la linea de totales adonde termina la de detalle?

    DEJA UNA RESPUESTA

    Por favor ingrese su comentario!

    He leído y acepto la política de privacidad

    Por favor ingrese su nombre aquí

    Información básica acerca de la protección de datos

    • Responsable:
    • Finalidad:
    • Legitimación:
    • Destinatarios:
    • Derechos:
    • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad