Introducción a JasperReports e iReport (Segunda parte) En esta segunda parte del artículo se mostrará paso a paso la manera de diseñar, compilar y visualizar un reporte con iReport. Posteriormente se mostrará la manera en que puede ser llenado y mostrado dinámicamente desde una aplicación Java.
Configuración de la conexión a una base de datos. Para establecer una conexión entre iReport y una base de datos, se debe proporcionar el driver JDBC correspondiente. La versión 0.5.1 de iReport ya proporciona drivers JDBC para establecer conexiones con bases de datos como MySQL y Access. Para nuestro ejemplo se usará una conexión con una base de datos Access, para la cual se ha configurado un origen de datos con nombre DSN. En el artículo “El puente JDBC-ODBC(Ejemplo de conexión entre Access y Java)” se explica detalladamente la manera de configurar un origen de datos.
Suponiendo que se ha configurado un origen de datos nombrado para una base de datos Access con los siguientes valores:
Nombre de driver: PDRV
Nombre de inicio de sesión: cvazquez
Contraseña: vazquez
Procedemos a configurar iReport para establecer la conexión con la base de datos, para ello debe ir a menú->Fuente de datos->Conexiones/Fuente de datos. En la pantalla Connections/Datasources oprima el botón new para agregar una conexión.
La pantalla de conexión debe llenarse tal como se muestra a continuación:
A continuación oprima el botón Test para probar la conexión. Si la conexión fue exitosa, oprima finalmente el botón Save para guardar esta conexión.
Creación del Reporte. En iReport, se tiene la opción para trabajar por proyecto, el cual puede contener varios reportes, en nuestro caso no se creará un proyecto, se creará solo un reporte de la siguiente manera:
Seleccione nuevo documento del menú Fichero o bien oprima el botón new report de la barra de herramientas, aparecerá una pantalla de propiedades del nuevo reporte que queremos crear:
En esta pantalla podemos configurar las propiedades del reporte, en nuestro caso, le llamaremos Reporte1, oprimir el botón OK para crearlo.
Seleccionar la opción Guardar como… del menú fichero o bien el botón Save report de la barra de herramientas, debe seleccionar el nombre y el directorio en que se guardara el reporte. El reporte se guardará con la extensión .xml. Por defecto los archivos de salida de la compilación se crearán en el directorio de instalación de iReport si no especificó uno.
Secciones de un Reporte en iReport. A continuación se explicará de manera breve, las secciones que componen a un reporte en iReport
·
title. El título de nuestro reporte debe escribirse en está sección. Solo se mostrará en la primera página del reporte.
·
pageHeader. Aparece en la parte superior de cada página. Puede contener información adicional del reporte, descripciones, etc.
·
columnHeader. En esta sección se muestran los nombres de los campos que se van a presentar
·
detail. En esta sección se despliegan los valores correspondientes a los nombres de los campos definidos en la sección anterior. Estos datos pueden obtenerse mediante consultas SQL a una base de datos por ejemplo.
·
columnFooter. Puede presentar información de totales para algunos de los campos de la sección detail. Por ejemplo “Total de Empleados: 220”
·
pageFooter. Aparece en la parte inferior de cada página. Este parte puede presentar, la fecha, número de página del reporte.
·
summary. Esta sección puede presentar totales de campos de la sección detail. Si se desea incluir algún gráfico en el reporte, debe hacerse en esta sección.
En el diseño de su reporte pueden omitirse algunas de las secciones o bandas mencionadas, en nuestro caso solo usaremos las secciones title, PageHeader, ColumHeader, detail, y Pagefooter. Para omitir las secciones del reporte que no se usaran, debe oprimir el botón bands de la barra de herramientas, o bien haciendo click con el botón secundario del ratón sobre el diseño del reporte y seleccionando la opción band properties del menú contextual. En la pantalla de propiedades de las bandas, debe seleccionar las bandas no deseadas y colocar su propiedad band height igual a cero como se muestra en la siguiente figura.
Diseño del Reporte. Se muestran a continuación los botones principales para el diseño del reporte de la barra de herramientas:
Agreguemos en primer lugar el título de nuestro reporte, para ello seleccione de la barra de herramientas el objeto Static text tool y dibuje una caja sobre la banda title. Haciendo doble click sobre la caja dibujada se mostrará la pantalla de propiedades de la caja de texto estático. Aquí puede configurar el tamaño, ubicación de la caja de texto, tipo de letra para el texto, entre otros; seleccionando la pestaña Static Text puede ingresar el título que desee para el reporte, el resultado debe ser parecido al de la siguiente figura:
En el encabezado de página, pageHeader, podemos colocar una descripción del reporte utilizando también el objeto Static Text tool.
Ahora se agregarán los nombres de los campos que pretendemos mostrar en el reporte, en este caso se recuerda que se configuró una conexión con una base de datos Access a través de un driver u origen de datos con nombre DSN.
Para cuestiones de prueba he agregado las siguientes tablas con los siguientes campos a la base de datos:
La relación de las tablas como se observa es “uno a muchos”. En este contexto, un empleado puede pertenecer a solo una área de trabajo y una área puede relacionarse con uno o muchos empleados.
Se realiza por ahora una consulta sencilla para el reporte a la tabla de empleados de la siguiente manera:
SELECT Clv_emp, Nombre, ApPaterno, ApMaterno, Puesto FROM EMPLEADOS
Antes, de agregar los nombres y campos a nuestro reporte, se establecerá la consulta anterior para el reporte. Vaya a la barra de herramientas y seleccione el botón Database, en la pantalla Report Query y pestaña Report SQL query, puede escribirse la sentencia SQL. Si se encuentra seleccionado el check box Automatically Retrieve Fields, nos mostrará automáticamente los campos que se obtienen de la consulta, el tipo y una descripción de estos si es que cuentan con ella. Si la consulta es incorrecta mostrará un mensaje de error. La pantalla debe lucir como sigue:
Debe oprimir el botón OK para guardar esta consulta.
De la misma manera en que se agregó el título al reporte, deberá agregar los nombres de los campos en la banda columHeader utilizando objetos Static Text tool. El reporte debe lucir hasta ahora como se muestra a continuación:
Ahora solo resta colocar en la sección detail, los campos que se mostrarán en el reporte. Para esto se usará el objeto Text Field, las cajas se pintarán de manera similar a las cajas de texto estático realizadas en la banda columHeader, sin embargo cada campo debe configurarse de acuerdo al tipo de dato que se quiere mostrar.
A continuación se mostrará la manera de configurar un Text Field. Una vez colocado un campo en la sección detail, haga doble click sobre este para abrir su ventana de propiedades y sitúese en la pestaña Text Field.
Vaya enseguida al menú Ver y seleccione el item Campos de informe, esto desplegará la pantalla values con los campos de nuestro reporte, los cuales se generaron al establecer la consulta SQL. Esta pantalla muestra adicionalmente los parámetros y variables del reporte, cada uno se distinguirá con la siguiente notación:
Campos: $F{Campo}
Variables: $V{valor}
Parámetros: $P{Parámetro}
Utilice esta pantalla para auxiliarse al configurar un Text Field.
La figura anterior muestra como debe configurarse el campo “clave de empleado”.
En la ventana de propiedades ponga especial atención en seleccionar el tipo correcto del campo en el combo Textfield ExpressionClass (Integer en este caso). En la sección Textfield expression de la misma ventana, cambie la expresión $F{Field} por el nombre correcto del campo $F{Clv_emp}. Configure así cada uno de los campos restantes.
Adicionalmente, se agregará una línea al inicio de la sección detail para separar los registros con el objeto line tool de la barra de herramientas.
Debe reducir el tamaño de la banda detail al alto de las cajas de los campos para evitar demasiado espacio entre los registros y listo, con ligeras adecuaciones a los campos, el reporte final debería lucir de la siguiente manera:
Compilación y Ejecución del Reporte. Las siguientes figuras muestran los botones de la barra de herramientas necesarios para compilar, y ejecutar el reporte con o sin conexión.
Antes que nada, seleccione la vista para el Reporte, vaya al menú Construir y seleccione el item vista previa en JRViewer (Vista previa en el Viewer de Jasper). En este menú, puede seleccionar la vista previa para distintos formatos de archivo, siempre y cuando haya configurado los programas externos como se explicó en la primera parte del artículo.
Compile el reporte, el resultado de la compilación aparecerá en la parte inferior de la pantalla. Los errores más frecuentes de compilación se relacionan con los tipos de los campos que pretenden mostrarse. Si la compilación resultó sin errores, esta listo para ver su reporte, es recomendable probarlo primero sin usar una conexión a una base de datos. Finalmente, ejecute el reporte ocupando la conexión a la base de datos que se configuró. El resultado dependiendo de sus datos en las tablas debe ser parecido al siguiente:
El Viewer de JasperReports, muestra en su barra de herramientas la posibilidad de enviar el reporte directamente a la impresora o bien de guardar el reporte en algún formato de archivo específico: PDF, HTML, XLS, RTF entre otros. La funcionalidad de iReport en este caso es de oficina, obteniendo los datos almacenados en una base de datos y mostrándolos sin pasar a través de ninguna otra aplicación.
Llenar el reporte dinámicamente desde una aplicación Swing. Algo que resultaría más interesante, es llenar el reporte dinámicamente desde alguna aplicación Java. En este caso, debe hacerse uso del archivo *.jasper generado de la compilación del arhivo xml.
Oprima el botón Database de la barra de herramientas. En la ventana Report Query, modifique el Query que se muestra en la pestaña Report SQL query, como se muestra a continuación:
Se ha modificado el query para que se muestre en el reporte, solo a aquellos empleados que pertenezcan a determinada área, dicha área se pasará como parámetro desde una aplicación Swing para llenar el reporte.
Debe agregarse este parámetro al reporte, para esto, oprima el botón Parameters de la barra de herramientas o bien, desde el menú ver, seleccione Parámetros de informe. En la pantalla values, asegúrese de estar ubicado en la pestaña Parameters y oprima el botón Nuevo. Agregue el nuevo parámetro del reporte, como se muestra en la siguiente figura.
El tipo de parámetro se estableció como String aún cuando se sabe de las tablas que debería ser entero, en realidad esto funciona bien, pasando desde la aplicación java al reporte un String. El tipo de parámetro del reporte debe ser del mismo tipo al que se vaya a pasar desde sus aplicaciones en Java, de lo contrario obtendrá errores que le darán muchos dolores de cabeza.
Recompile el proyecto, si se muestra un mensaje de error de compilación mencionando la ausencia del parámetro, vuelva a agregarlo y abra la ventana Report query para asegurarse que se muestran los campos de la consulta. Por alguna razón, la aplicación algunas veces no detecta el nuevo parámetro.
El siguiente hilo es capaz de llenar y exportar el reporte realizado, solo ha de proporcionarse una conexión a la base de datos y la ruta del archivo jasper.
import java.util.*;
import java.sql.Connection;
import java.awt.event.*;
/*Librerías necesarias para Jasper Reports*/
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;
public class cExport_thread extends Thread {
cConnection conexion;
public cExport_thread(String Clv_area) {
}
/**
* Método del hilo
*/
public void run()
{
try
{
//Ruta de Archivo Jasper
String fileName="C:proyectoReporte1.jasper";
//Obtener una conexión a la base de datos
conexion = new cConnection();
Connection con = conexion.mkConection();
//Pasamos parametros al reporte Jasper.
Map parameters = new HashMap();
parameters.put("P_Clv_Area_ads",Clv_area);
//Preparacion del reporte (en esta etapa llena el diseño de reporte)
//Reporte diseñado y compilado con iReport
JasperPrint jasperPrint = JasperFillManager.fillReport(fileName,parameters,con);
//Se lanza el Viewer de Jasper, no termina aplicación al salir
JasperViewer jviewer = new JasperViewer(jasperPrint,false);
jviewer.show();
}
catch (Exception j)
{
System.out.println("Mensaje de Error:"+j.getMessage())
}
finally{
conexion.closeConecction();
}
}
}
La finalidad del hilo, en mi caso particular, fue para liberar de carga al evento de un botón en una aplicación Swing, dado que la obtención de la conexión y el llenado del reporte puede ser tardado. El hilo debe lanzarse de la siguiente manera:
cExport_thread thread_exp = new cExport_thread();
thread_exp.start();
Hasta esta fecha, han salido bastantes versiones de JasperReports e iReport, si utiliza versiones diferentes a las aquí utilizadas, asegúrese que coincidan las librerías de Jasper tanto en iReport como en su proyecto java con el que pretende llenar el reporte.
referencia de herramientas utilizadas:
IDE: JBuilder 2005, iReport 0.5.1
JDK(SDK): j2sdk1.4.2_08
JasperReports 1.0.1
Vr Access: Access 2002