openxava / documentación / Generación de informes - Lección 2: Trabajando con parámetros

Video

En este video veremos cómo enviar parámetros a nuestro reporte desde nuestra aplicación OpenXava.

¿Problemas con la lección? Pregunta en el foro

Código

Puedes descargar el proyecto de esta lección. También puedes copiar el código que se usa en el video por aquí:

En el archivo controllers.xml:
<controller name="Product">
    <extends controller="Invoicing"/>
    <action name="printProductDetail"
        class="com.yourcompany.invoicing.actions.PrintProductAction"
mode="detail"
icon="printer"/> </controller>
En el archivo PrintProductAction.java:
public class PrintProductAction extends JasperReportBaseAction {

	private Product product;
	
	@Override
	protected JRDataSource getDataSource() throws Exception {
		return new JREmptyDataSource();
	}

	@Override
	protected String getJRXML() throws Exception {
		return "ProductDetail.jrxml"; 
	}

	@Override
	protected Map getParameters() throws Exception {
		Messages errors = MapFacade.validate("Product", getView().getValues());
		if (errors.contains()) throw new ValidationException(errors);
		
		Map parameters = new HashMap();	
		parameters.put("id", (getProduct().getNumber()));
		parameters.put("description", getProduct().getDescription());
		parameters.put("author", getProduct().getAuthor().getName());
		parameters.put("isbn", getProduct().getIsbn());
		parameters.put("category", getProduct().getCategory().getDescription());
		parameters.put("price", getProduct().getPrice());
		
		return parameters;
	}

	private Product getProduct() throws Exception {
		if (product == null) {
			int number = getView().getValueInt("number");
			product = XPersistence.getManager().find(Product.class, Integer.valueOf(number));
		}
		return product;
	}

}


Transcripción

Hola, soy Mónica. En esta lección veremos un ejemplo simple de cómo enviar parámetros desde OpenXava y usarlos en el reporte. Para esto, utilizaremos la última lección del curso de OpenXava.

Primero vamos a importar el proyecto de la lección 26 del curso de OpenXava en el repositorio github.com/openxava/openxava-course_en. En Code descargamos el proyecto con download ZIP.
Vamos a OpenXava Studio, en el panel package explorer hacemos click derecho y hacemos click en Import. Seleccionamos Project from Folder or Archive de General. Apretamos Next. Aquí en Archive abrimos el explorador y seleccionamos el archivo que acabamos de descargar. Nos mostrará los proyectos o carpetas disponibles para importar. Dejamos seleccionado únicamente la opción que tenga Eclipse project en Import as. Apretamos Finish.
Listo, ya tenemos el proyecto, pero aún hacen falta unos pasos para iniciarlo. Click derecho en el proyecto, Run As, Maven install. Una vez que diga Success, hacemos de nuevo click derecho en el proyecto, Maven, Update project.
Ahora sí, vamos al paquete com.yourcompany.invoicing.run e iniciamos el proyecto. Click derecho en invoicing, Run As, Java Application. Copiamos el enlace y lo abrimos en el navegador. Ingresamos con Admin, admin. Podemos visualizar que ya hay registros para poder aprovechar de ello.

Vamos a Jaspersoft Studio y creamos un nuevo reporte llamado Product detail. Eliminamos las secciones que no vamos a necesitar. Nuestro objetivo sería mostrar algunas de las propiedades que tiene producto a partir de los parámetros que recibimos.
En la lección pasada vimos cómo usar static text, lo usaremos para ID. Luego arrastra un TextField y le damos doble click. Podemos ver que este elemento ofrece mucho más que un static text, se puede usar para algo tan simple como un texto, como también dejar código con una lógica simple, que en nuestro caso sería código Java. Por el momento vamos a dejar solo texto, recuerda que debe ser entre comillas dobles. Así, creamos varios TextField y le incluimos los labels de cada propiedad que queremos mostrar. Nombre, Precio, Categoría, Autor, ISBN.

En OpenXava Studio, debemos crear una acción para imprimir el reporte, así que primero vamos a definirlo en su controlador. Como el módulo Producto aún no tiene controlador, creamos uno. Extendemos del controlador Invoicing. Para la acción, en nombre ponemos Print Product Detail, dejamos a class vacío y en modo ponemos detail para que la acción aparezca allí. Por último, ponemos algún ícono para la acción, por ejemplo, printer.
Ya casi está listo, faltaría crear la clase de la acción y luego ubicar su ruta en el class que dejamos vacío. En el paquete com.yourcompany.invoicing.actions creamos una nueva clase llamada Print Product Action. Una vez creado, extendemos de JasperReportBaseAction y añadimos los métodos que nos pide. En getDataSource devolvemos new JREmptyDataSource. En getJRXML ponemos el nombre del reporte. Aquí en getParameters, es donde vamos a definir los parámetros a enviar. Añadimos un mensaje de error, que lo muestra si no se encuentran los valores de Product en la vista donde llamamos la acción.
Importamos de openxava.validators. Creamos un map para guardar los parámetros. Hay distintas formas de obtener la información, por ejemplo, desde la base de datos o también obtenerlo directamente de la vista donde se llama la acción. Nosotros iremos por la primera opción, vamos a hacer una consulta JPA a partir del número del producto, que en este caso es su ID, obtener toda la información del producto y añadir lo necesario en el mapa. Por ejemplo, queremos añadirle al key ID, el valor de producto número. Para esto vamos a definir un Producto, y hacemos un método get para ese producto.
En caso de que producto sea nulo cuando queremos obtenerlo, tomamos el número de la vista actual y lo usaremos para buscar el producto en nuestra base de datos por JPA. Con el getView obtenemos la vista actual y de esa vista obtenemos un valor int con el parámetro number. En este caso, lo estamos obteniendo desde aquí. Este parámetro se debe llamar igual a la propiedad como está declarado en la clase. Ahora hacemos la consulta JPA usando el número que obtuvimos y por último retornamos el producto.
Ahora en los parámetros pondremos como clave a "id" y getProduct().getNumber() como su valor. Así, con toda la información que queremos enviar. Aquí hay dos cosas para recalcar, el número del producto es un tipo int, así que estamos enviando un tipo int en el mapa. Por otra parte, si te fijas, en el caso del autor y categoría, no estoy enviando su id, sino directamente una información más relevante. Retornamos el mapa y guardamos. Volvemos al controlador y en class ponemos la ruta completa de la acción.

Ya tenemos la acción que envía parámetros al reporte. Ahora en el reporte, también debemos crear parámetros. Lo hacemos desde el panel Outline. Click derecho en Parameters. Create Parameter. Seleccionamos el elemento Parameter1 que se creó, en este caso ya está seleccionado. En el panel de properties del elemento, le damos el nombre id y en class seleccionamos Integer. Cada parámetro que enviamos desde la acción, debe haber uno igual en el reporte para poder recibirlo. Por ejemplo, si habíamos enviado un parámetro ID de tipo int, entonces en el reporte debemos tener también un parámetro con nombre ID y como class Integer. Y así creamos los otros 6 parámetros en el reporte.
El texto id del reporte como era un static text, debemos usar un TextField para mostrar el valor del parámetro. Dentro del TextField usamos el signo de Dinero. P de parámetro. Y entre llaves el nombre del parámetro. En los otros casos, como ya teníamos un TextField, debemos agregar antes del parámetro un signo de suma, como si estuviéramos armando un String en Java. También podemos arrastrar directamente el elemento parámetro desde el panel Outline y luego le agregamos el texto. Una vez que tengamos todo listo, guardamos y copiamos el reporte a la carpeta reports que debemos crear en el proyecto. Y ya podemos iniciar la aplicación. Probamos con alguno de los registros y podemos ver los resultados.

Trabajar con parámetros es interesante, puedes enviar lo que quieras como parámetro, listas, colecciones, entre otros. Luego en el reporte lo recibes con ese tipo de dato para trabajar con ello. Si tienes alguna duda sobre esta lección, puedes preguntarnos por el foro, también puedes descargar el código de esta lección por el link del repositorio, ambos enlaces se encuentran en la descripción del video. Nos vemos en la próxima lección donde vamos a ver cómo trabajar con imágenes en el reporte. Chao