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