openxava / documentación / Generación de informes - Lección 9: Parámetros introducidos por el usuario

×Novedad: OpenXava con IA - Refinar la UI (Parte 2) - 1 de diciembre · Leer más

Video

En este video veremos cómo crear un diálogo donde el usuario podrá introducir un rango de fecha, las mismas se usarán en la consulta SQL del reporte.

¿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 CustomDateRange.java:

@Getter @Setter
public class CustomDateRange {

	int customerNumber;
	
	LocalDate startDate;
	
	LocalDate endDate;
	
}

En el archivo ShowCustomDateRangeDialogAction.java:

public class ShowCustomDateRangeDialogAction extends ViewBaseAction {

	@Override
	public void execute() throws Exception {
		int number = getView().getValueInt("number");
		showDialog();
		getView().setModelName("CustomDateRange");
		getView().setValue("customerNumber", number);
		addActions("CustomDateRange.print");
	}

}

En el archivo PrintCustomerInvoicesByDateRangeAction.java:

public class PrintCustomerInvoicesByDateRangeAction extends JasperReportBaseAction {

	@Override
	protected JRDataSource getDataSource() throws Exception {
		return null;
	}

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

	@Override
	protected Map getParameters() throws Exception {
		Messages errors = MapFacade.validate("CustomDateRange", getView().getValues());
		if (errors.contains()) throw new ValidationException(errors);
		Map parameters = new HashMap();
		parameters.put("name", getPreviousView().getValue("name"));
		parameters.put("number", getView().getValueInt("customerNumber"));
		parameters.put("startDate", getView().getValue("startDate").toString());
		parameters.put("endDate", getView().getValue("endDate").toString());
		return parameters;
	}

}
En el archivo controllers.xml:
<controller name="Customer">
	...
	<action name="printInvoicesByDateRange"
		class="com.yourcompany.invoicing.actions.ShowCustomDateRangeDialogAction"
		mode="detail"
		icon="printer"/>
</controller>
	
<controller name="CustomDateRange">
	<extends controller="Invoicing"/>
	<action name="print"
		class="com.yourcompany.invoicing.actions.PrintCustomerInvoicesByDateRangeAction"
		mode="detail"
		icon="printer"/>
</controller>

Transcripción

Hola, soy Mónica. En esta lección aprenderás a visualizar un diálogo donde el usuario podrá introducir un rango de fechas, que se usarán para filtrar los datos que aparecerán en el reporte.

Primero creamos la clase transitoria Custom Date Range, con la propiedad customerNumber para dejar el valor del número de cliente. Como usamos LocalDate en fecha, usaremos el mismo tipo de dato para el inicio y fin de fecha. Listo. Vamos a crear la acción para sacar el diálogo. Esta acción va a extender de ViewBaseAction, así podemos trabajar con la vista. Con showDialog mostraremos un diálogo vacío. Al mostrar el diálogo, el método getView pasará a apuntar al diálogo. Le diremos que el nombre del modelo del diálogo es CustomDateRange, este es igual al nombre de la clase transitoria. Vamos a probarlo. Perfecto. Lo ideal es que cargue automáticamente el número del cliente, también se debe agregar una acción para imprimir el reporte. Primero vamos a obtener el valor del número de cliente. Y debemos hacerlo antes de showDialog, así la vista que devuelve getView, es la vista de detalles del cliente. Luego setteamos el valor. Por último, con addActions vamos a añadir la acción de imprimir. Esta acción lo vamos a crear en un controlador aparte. El nombre del controlador puede ser cualquiera, en mi caso voy a usar el nombre de la clase transitoria. Antes de seguir con la acción del reporte, agregamos la acción al diálogo. Usamos el nombre del controlador y el nombre de la acción para agregarlo, esto significa que podemos agregar cualquier acción de cualquier controlador. Similar al reporte de la lección pasada, enviamos un dataSource nulo y en parámetros enviamos los valores obteniéndolos de la vista. Iniciamos el proyecto para tener disponible la base de datos.

Creamos un nuevo reporte llamado Customer Invoice By Date Range. Definimos los parámetros a recibir. Seleccionamos la base de datos Invoicing que creamos en la lección pasada. También tipeamos un query similar, pero agregando una línea donde indica que la fecha de la factura debe estar entre startDate y endDate. Perfecto. Agregamos los elementos al reporte. Y lo probamos. El formato de fecha que obtenemos de la vista es como lo estoy ingresando. Funciona bien. Agregamos otro parámetro para recibir el nombre del cliente. En la acción del reporte, ya estamos en la vista del diálogo, por lo que si queremos obtener el nombre del cliente debemos hacer getPreviousView. Listo, luego de hacer unos cambios en el reporte, lo copiamos al proyecto e iniciamos la aplicación. Voy a cambiar la fecha de una factura para que sea distinta a las otras. Nos dice un error de expresión, se debe referir a los parámetros. Debe ser que estamos recibiéndolo como String, pero lo estamos enviando como Object y si te acuerdas, ellos son de tipo LocalDate. Listo, probamos de nuevo. Perfecto, ahí nos está mostrando las facturas entre las fechas que seleccionamos.

Con esto que el usuario pueda personalizar parámetros para el reporte, puedes aprovechar y crear reportes más complejos, sin necesidad de agregar mucho código. Si tienes alguna duda o problema 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.
Chao.