Trabajar con tablas en JasperReport

8
31115

Trabajar con tablas en JasperReport

0. Índice de
contenidos.

1. Entorno

Este tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil Mac Book Pro 17″ (2,6 Ghz Intel Core i7, 8 GB DDR3)
  • Sistema Operativo: Mac OS X Snow Leopard 10.6.4
  • Jaspersoft Studio 2.0

2. Introducción

La mayoría de nosotros ya conocemos y hemos hecho algún informe con JasperReport de hecho se ha convertido en la herramienta de referencia en cuanto una historia habla de realizar un informe del tipo que sea. En el 90% de los casos solo necesitaremos un único dataset que nos proporcione los datos. Para lo cual las columnas las ponemos en la banda «Column Header» y los datos en la banda «Detail».

En este tutorial vamos a ver como podemos mostrar datos de distintos dataset dentro de un mismo informe gracias al componente tabla que podemos encontrar en la paleta de componentes de la herramienta y que permite definir un dataset independiente. También veremos como podemos hacer que los valores de la tabla dependan de una variable de entrada a nivel de informe.

3. Creación del informe con una tabla

Para ponerlo en práctica vamos a partir del siguiente esquema de base de datos.

Cargamos la tabla TEST con los siguientes datos:

Lo primero que tenemos que hacer es abrir una instancia de Jaspersoft Studio, aseguraos de que es al menos la versión 2.0 porque las anteriores dan muchos problemas de estabilidad y podríais llegar a perder todos los cambios.

Ahora creamos un informe en blanco. Para ello seleccionamos File –> New –> Jasper Report con lo que se muestra el primer paso del asistente. En este paso seleccionamos que queremos un informe en blanco (Blank A4) y pulsamos en «Next».

En el siguiente paso establecemos el nombre del fichero del informe, la localización dentro de la estructura de proyectos y pulsamos «Next».

Ahora tenemos que definir la fuente de datos que vamos a utilizar en los informes.

Al pulsar en «New» se muestra un segundo asistente que nos permite definir la fuente de datos.

Seleccionamos la opción de fuente de datos a partir de conexión JDBC (Database JDBC Connection) y pulsamos en «Next». En esta pantalla establecemos el nombre del adaptador y los datos de conexión con la base de datos.

No hay que olvidar incluir el Driver específico para la base de datos deseada. Para ello pulsamos en la pestaña «Driver Classpath» y seleccionamos mediante «Load» el driver requerido.

Para comprobar que la conexión es correcta, pulsamos en «Test» y debemos ver el mensaje «Successful». Pulsamos «Finish» para volver al asistente principal donde al pulsar en «Next» nos muestra una advertencia diciendo que no puede descubrir campos a nivel de informe, le damos a «OK», ya que no nos interesa este descubrimiento.

Por último en la pantalla de felicitaciones pulsamos en «Finish».

El objetivo de este tutorial es crear un informe con una tabla de datos. Para ello lo que hacemos es arrastrar a la banda «Detail» un componente de tipo tabla desde la paleta de componentes, lo que hace que se muestre un asistente donde nos indica la creación de un nuevo Dataset.

En el siguiente paso vamos a establecer el nombre al nuevo dataset (TestDatasetTipo1) e indicamos que lo queremos crear a partir de una fuente de datos (Create new dataset from a connection or datasource). En la siguiente pantalla seleccionamos el adaptador creado anteriormente e introducimos la sentencia SQL que nos devuelva los datos que queramos mostrar en forma de tabla. En nuestro caso queremos que esta tabla muestre los elementos que sean de tipo 1.

Pulsando en «Next» el asistente nos descubre los campos del dataset en función de la consulta introducida. Seleccionamos los campos que vamos a querer que estén disponibles para creación de la tabla, en mi caso, selecciono todos.

Después podemos seleccionar de que campos queremos hacer «group by», en mi caso, no selecciono nada.

Ahora seleccionamos el tipo de conexión, para nuestro caso, seleccionamos la misma que la del informe.

Ahora seleccionamos las columnas que queremos mostrar en la tabla, en mi caso, selecciono todos.

Es momento de seleccionar el layout de la tabla, en este caso basta con mostrar el header de las columnas.

Pulsando en «Finish» ya podemos ver la tabla en el informe. Para probar el resultado podemos pulsar en la pestaña «Preview» donde nos vamos a llevar la sorpresa de que solo aparece el mensaje «Document is Empty». Esto es así porque si el dataset del informe no tiene datos no se muestra ninguna sección del informe. La forma más rápida de resolver esto es ir a la pestaña «Source» e introducir a mano una sentencia SQL que devuelva datos dentro de la etiqueta <queryString> que esta fuera de la etiqueta <subDataset>, como se muestra en la imagen:

Hecho esto si volvemos a ir a la pestaña «Preview» debemos ver un resultado parecido a este.

4. Paso de parámetros a la tabla desde el informe principal

Ahora lo que queremos conseguir es que el parámetro tipo de la sentencia SQL dependa de un parámetro externo que se defina a nivel del informe principal. Para hacer esto nos podemos apoyar en la herramienta aunque lo más rápido es editar directamente el código dentro de la pestaña «Source». No tengáis miedo porque el compilador de Jasper Reports nos indicará si lo estamos editando correctamente.

Primero definimos un parámetro de entrada a nivel de informe de tipo Integer con el nombre tipo.

Luego dentro del subDataset vamos a definir un parámetro también de tipo Integer con el nombre tipo_tabla el cual vamos a referenciar en la propia consulta SQL con la sintaxis $P{variable}

Por último para que la tabla pueda tener acceso al parámetro del informe necesitamos realizar el mapeo a nivel de tabla.

De esta forma cuando volvamos a pulsar en «Preview» la herramienta nos solicita que introduzcamos un valor para la variable «tipo».

Ahora el resultado de la tabla tendrá en cuenta el valor de la variable «tipo» de entrada.

Cualquier duda o sugerencia en la zona de comentarios.

Saludos.

8 Comentarios

  1. Buenas tardes, tengo un reporte con una tabla de 20 columnas, mi pregunta, es ¿existe alguna forma de autoajustar el ancho de las columnas de la tabla, de acuerdo al contenido de las celdas ? Gracias.

  2. Hola, he realizado un reporte con base de datos postgresql y al momento de darle clic al preview me genera los registros duplicados y en la base de datos no lo están… la verdad no se cual error pueda estar ocurriendo alguna vez le a pasado?

  3. Hola, tengo varios informes (iReport 5.6.0) que, en algunos casos algunas columnas de la tabla van a aparecer y en otros casos no van a aparecer (depende de si son parte del filtro del informe o no), incluso su cabecera tampoco aparece según cada caso.
    La pregunta va relacionada con el centrado del cuerpo/detalle del informe (la tabla) resultante respecto a la página, ya que no soy capaz de centrar el cuerpo/detalle (la tabla) del informe según estas columnas de aparición variable estén o no estén en el informe.

    La única solución que encuentro son informes independientes, pero claro, no parece muy «elegante» esta solución, además. si tengo muchos filtros, sería un informe por cada combinación de filtros, y esto me resultan muchos informes.

    Muchas gracias anticipadas.

  4. Utilizo python con pyqt5.
    Ya he confeccionado algunos reportes en jasper, pero no tengo forma o no consigo un ejemplo de como poder conectar jasper con python y lograr que el reporte se ejecute.

    Mi aplicación es de escritorio. Logré en un principio levantar el reporte, pero solo me imprime los encabezados y no los datos.

    Alguna idea, será de mucha ayuda.

    Ro0berto.

Dejar respuesta

Please enter your comment!
Please enter your name here