Informes Crosstab con iReport
Introducción
iReport es una herramienta gratuita (http://jasperforge.org/sf/projects/ireport)
escrita en Java que nos permite diseñar informes (jrxml) para
posteriormente poder usuarlos con JasperReport.
Actualmente existe en Adictosaltrabajo.com
varios tutoriales relacionados con esta herramienta:
- Subinformes
con iReport - Gráficos
con iReport - Exportar
PDF multiidioma con iReport - Informes
con código HTML - Usar
un DataSource XML para crear informes con iReport - Informes
con fuente de datos ODBC
Con este tutorial vamos a ampliar el nivel de conocimiento sobre esta herramienta
enseñando como hacer un informe usando crosstab
o tablas dinámicas. Pero ¿qué es realmente
un informe crosstab? un informe crosstab no es nada más
que un informe en el cual tenemos una tabla sencilla en la que las filas, columnas
y valores son recuperados dinámicamente apartir de un
determinado datasource o conexión a base de datos.
Como suele pasar en la mayoría de las veces, donde mejor se ve es con
un ejemplo práctico paso a paso.
Entorno
-
iReport 3.0.0
-
JDK 1.6
-
Sistema Operativo Windows XP Pro.
Ejemplo práctico
Lo primero que vamos a hacer es plantear un determinado problema
que usaremos como base para el ejemplo práctico.
Una empresa llamada X vende determinados componentes informáticos
a varios países y desea tener un informe dinámico que le permita
saber al instante el número de unidades vendidas de cada componente
agrupados por países.
La solución más eficiente para solucionar este
problema es crear un informe con iReport usando una tabla dinámica
o crosstab en la que tendremos que hacer diferentes agrupaciones
(group by) de datos para conseguir el objetivo.
Lo primero que tenemos que hacer es diseñar un informe
básico.
Como se puede ver en la imagen anterior hemos eliminado (estableciendo para
cada banda un alto de 0 píxeles) todas las bandas del informe menos
«title» y «summary«.
Esto lo hemos hecho porque el objeto crosstab SOLO
funciona cuando se coloca en la banda de «summary«.
Después del diseño inicial del informe tenemos que establecer
una conexión con nuestra base de datos y definir una consulta SQL para
el informe. Hay que señalar que, como se puede ver en la imagen siguiente,
en la definición de la consulta SQL no tenemos ninguna agrupación
(group by) ya que ésta la definiremos posteriormente al configurar
el objeto crosstab. Aquí
os dejo un script SQL con las tablas y datos usandos en el ejemplo.
Luego tendremos que insertar un objeto crosstab en nuestro informe
(banda «summary«) pulsando sobre el icono correspondiente
(la traducción al castellano es «Tabla de ref. cruzadas»)
y seleccionando el área donde queremos colocarlo.
Al hacer esto nos aparecerá una ventana donde tendremos que configurar
nuestra tabla dinámica o crosstab. Pasos:
-
Elegimos un conjunto de datos, en nuestro caso ya lo tenemos
definido ya que hemos creado una consulta SQL para nuestro informe que nos
devuelve dicho conjunto de datos. -
En el siguiente paso tenemos que definir una agrupación
(group by) para las filas de la tabla, en nuestro ejemplo será
el campo «pais«. -
Para la columna elegimos el campo «componente«.
-
En la pantalla siguiente tenemos que establecer qué
datos se visualizarán en el interior de la tabla. En nuestro caso
como queremos ver el número de componentes vendidos tendremos que
seleccionar el campo «id» (identifica
un determinado componente) y la función (función de agregación
en SQL) «Count«. -
Para finalizar nos aparece una última pantalla donde
podremos decir si queremos filas/columnas exteriores con la suma total/parcial.
Tras pulsar sobre el botón de «Terminar» ya tendremos configurado
nuestro crosstab, ahora vamos a cambiar un poco el aspecto final
de la tabla pulsando en la pestaña que aparece al lado del informe
principal (pestaña crosstab-1…crosstab-N). En esa
pestaña podremos modificar los aspectos visuales de la tabla dinámica,
en nuestro ejemplo hemos puesto bordes, color de fondo, textos, etc.
Ahora solo nos queda compilar y ejecutar nuestro informe para ver el resultado…
Ejemplo práctico Extended
Ahora vamos a ver una versión extendida de ejemplo anterior…
La empresa X quiere modificar el informe para que le permita
saber al instante el número de unidades vendidas de cada componente
agrupados por países y CONTINENTES. Para ello tendremos
que establecer dos agrupaciones (group by) de datos en las filas
de nuestra tabla dinámica.
Al igual que el anterior ejemplo tenemos que seguir todos los
pasos hasta que llegemos a la configuración del crosstab.
En la pantalla donde se define la agrupación de las filas vamos a seleccionar
como primera agrupación el campo «continente»
y como segunda agrupación el campo «pais«.
Lo demás es igual que en el ejemplo básico.
Despúes de configurarlo le cambiamos un poco el aspecto, como con
el anterior ejemplo, para que quede bonito. Lo ejecutamos y vemos el resultado
final…
Aquí dejo el informe jrxml
usado en el ejemplo.
Conclusión
Antes de leer este tutorial o de conocer los componentes crosstab
de iReport es muy probable que ante el problema anteriormente expuesto pensásemos
que con iReport no lo podríamos resolver, pero efectivamente si.
En este tutorial hemos podido ver otra funcionalidad interesante
que nos aporta iReport a la hora de generar informes dinámicos. Si
bien tiene algunas limitaciones en cuanto al aspecto visual, sin duda esta
funcionalidad de tablas dinámicas o crosstab nos puede ayudar
a resolver determinados problemas en muy pocos minutos y sin mucho esfuerzo.
Un saludo, espero que os haya parecido útil este tutorial.
Alfonso Blanco Criado – ablanco@autentia.com
Hola muchas gracias por el tutorial, es una ayuda positiva, podrias indicarme como puedo hacer cuando en columnas requiero mostrar variables distintas, grupos distintos…uno en cada columna
hola muy bueno el tutorial, como hago para agregar otra fila ya que solo tiene fila grupo 1 y 2
Hola, como puedo hacer para que la cabecera de las columnas no se repitan en la segunda hoja?, espero que me puedan ayudar salu2
Hola buenos días, como puedo incluir filas y columnas y que totalicen al final de ellas, gracias
Hola, Primero que todo gracias por el tutorial de verdad me sacaste de un lio, una pregunta hay forma de ponerle titulo a la columna rowGroup en tu ejemplo seria ponerle titulo la columna pais
Gracias por el tutorial