JRBeanCollectionDataSource: trabajando con arrays multidimensionales en Jasper Report.

4
24195

JRBeanCollectionDataSource: trabajando con arrays multidimensionales en Jasper Report.

0. Índice de contenidos.


1. Introducción

Despúes de exponer como trabajar
con colecciones de tipos básicos en iReport
sin una fuente de datos definida, en este tutorial vamos a dar una vuelta de tuerca añadiendo
la complejidad de tener como parámetro en el informe un array multidimensional de tipos básicos, una nube de puntos.

Sin más, y tomando como referencia el tutorial anterior vamos a pintar la información anidada en listas dentro del informe.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 15′ (2.4 GHz Intel Core i7, 8GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS X Lion 10.7.4
  • iReport 4.7.1
  • Jasper Report 4.7.1


3. Creación de la plantilla jrxml.

Con la plantilla vacía y sin asignar una fuente de datos «Empty Datasource»:

Creamos un parámetro, para ello «botón derecho» sobre «Parameters» > «Agregar Parameter»:

Le asignamos un nombre, en nuestro caso «nube_puntos»:

Y accediendo a la ventana de propiedades, le damos una tipología en «Parameter Class» > «java.util.Float[][]»,
un array multidimensional de floats,

además pulsando sobre «Default Value Expression» podemos asignar algo
como lo siguiente para añadir un juego de pruebas:

Con ello, ya tenemos preparado nuestro parámetro para el entorno de pruebas y ahora vamos a añadir un componente visual de tipo
lista para iterar por su contenido y mostrar la nube de puntos.

Pulsando sobre icono anterior y arrantrándolo al area de la plantilla lo tendremos disponible para su edición:

Una vez incluido en la sección correspondiente de la plantilla «botón derecho» > «Edit datasource» mostrará una ventana como la que sigue:

En este punto son importantes dos cuestiones:

  • «Sub dataset» definirá los parámetros de entrada, campos, variables,… que vivirán en el ámbito de la lista y que, no tienen por qué coincidir
    con los de la plantilla padre, ahí será donde definiremos un campo «ad hoc»,
  • Connection / Datasource Expression: indica la fuente de datos para la lista que puede ser la misma fiente de datos que el informe padre u otra,
    en nuestro caso definimos una expresión usando la clase net.sf.jasperreports.engine.data.JRBeanCollectionDataSource y pasando
    como argumento al constructor una referencia al parámetro anteriormente definido.

Lo siguiente será definir un campo que haga referencia a cada uno de los items de la colección, si tuviéramos un objeto tipado,
añadiríamos los campos a mostrar de la clase o el bean en cuestión, como trabajamos con tipos básicos añadiremos un campo con la
palabra reservada _THIS, que hará referencia a cada una de las cadenas dentro de la iteración interna de la lista.

Sobre el dataset2, el que usa la lista, pulsamos «botón derecho» en «Fields» > «Agregar Field»

El nombre para nuestro campo es la palabra reservada _THIS y el tipo es un array de floats:

Con ello estamos accediendo a la primera dimensión, si queremos acceder a los puntos debemos incluir un nuevo componente de lista anidado

que estará asociada a nuevo dataset y tendrá la siguiente fuente de datos:

Este dataset tendrá un campo también con el nombre _THIS, pero del tipo java.lang.Float.

Con ello ya podemos incluir un campo $F{_THIS} en la lista anidada para hacer referencia a cada punto a imprimir:

El informe tendría una salida como la siguiente:



4. Generación del informe desde java.

Si el informe anterior lo tuviéramos que generar desde código bastaría hacer uso del servicio que vimos en el tutorial anterior de la siguiente forma:

	private static Float[][] puntos = new Float[][]{
			new Float[]{1.2f, 1.3f},
			new Float[]{1.4f, 1.5f},
			new Float[]{1.6f, 1.7f},
			new Float[]{1.8f, 1.9f, 1.10f, 1.11f},
			new Float[]{2.8f, 2.9f, 2.10f, 2.11f}
	};
	
	public static void main(String[] args) throws JRException {
		final Map<String,Object> parameters = new HashMap<String,Object>();
		parameters.put("nube_puntos", puntos);
		final ReportExporter reportExporter = new ReportExporter();
		reportExporter.toPDF("fichaEmpresa.jrxml", parameters);
	}

El resultado será el mismo que el obtenido desde el entorno de iReport.


5. Conclusiones.

Que que comentábamos, lo ideal es trabajar con objetos tipados ;).

Un saludo.

Jose

jmsanchez@autentia.com

4 COMENTARIOS

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