domingo, 12 de febrero de 2012

IReport – Creador de informes


iReport es una herramienta visual que sirve para generar ficheros XML (plantillas de informe) que se puedan utilizar con la herramienta de generación de informes JasperReports. Por ejemplo, cuando se esta programando una tienda online, se puede usar el iReport para poder generar las facturas. Vamos a ver los pasos a seguir para hacer este caso:
En primer lugar hay que bajarse las librerías de Jasper (jasperreports-4.5.0-project.tar.gz)aquí  y el propio editor de informe iReport aquí.
En nuestro ejemplo, queremos crear un informe a partir del resultado de una consulta en nuestra base de datos. La base de datos se llama tienda y tiene las tablas compra, pedidos, productos y usuarios.


Ejecutamos el iReport y creamos un archivo nuevo. Elegimos la plantilla y pulsamos Launch Report Wizard. Ahí seleccionamos el lugar donde se van a guardar los archivos y en el siguiente paso debemos darle a New en el apartado de Connections/Data Sources.  Seleccionamos Database JDBC connection, se configuran los parámetros de la base de datos  y luego escribes la consulta, por ejemplo:
SELECT idcompra,idusuarios,alias,idproductos,productos.`nombre`,unidades,precio,fecha
FROM `productos` productos INNER JOIN `pedidos` pedidos ON productos.`idproductos` = pedidos.`idProducto`,
`usuarios` usuarios INNER JOIN `compra` compra ON usuarios.`idusuarios` = compra.`idUsuario`
WHERE idcompra = idpedidos AND idcompra = 7
Puesto que la factura se generará según el id de la compra, en la consulta ponemos un valor cualquiera (7) pero después añadiremos ese parámetro como variable.
Le damos a siguiente, añadimos todos los parámetros y le damos a terminar. Se abrirá nuestro report. Ahora vamos a añadir ese parámetro que dije antes. Pulsamos con el botón derecho sobre nuestro report y seleccionamos Edit Query. Ahí aparecerá nuestra consulta, y donde ponía 7 ahora habría que cambiarlo por $P{idcompra}. Le damos a OK, y , estando otra vez en la pantalla principal, pulsamos el botón derecho sobre Parameters y añadimos uno llamado idcompra. Hecho esto podemos probar el resultado dándole a Preview.
Ya esta terminado nuestro informe. Ahora hay que usarlo en nuestro código. Al finalizar se ha generado un archivo .jrxml y otro .jasper.  Estos se deben copiar en nuestro proyecto, dentro de webpages. Ahora creamos un jsp en el proyecto llamado report.jsp, que contendrá el siguiente código:
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@ page language="java" import="net.sf.jasperreports.engine.*,net.sf.jasperreports.engine.export.*" %>
<%@ page import="java.sql.*,java.io.*" %>
<%
 String filename = request.getParameter("filename");
 String reporttype = request.getParameter("reporttype");
Class.forName("com.mysql.jdbc.Driver").newInstance();

 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/tienda", "root", "forman");

 System.out.println("Connection Established");
 String path = application.getRealPath("/");

 Map parameters = new HashMap();
 parameters.put("idcompra",request.getParameter("idcompra"));
 JasperPrint jasperPrint = JasperFillManager.fillReport(path + "/" + filename, parameters, conn);

 System.out.println("Report Created...");
OutputStream ouputStream = response.getOutputStream();
JRExporter exporter = null;
if ("pdf".equalsIgnoreCase(reporttype)) {
 response.setContentType("application/pdf");
 exporter = new JRPdfExporter();
 exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
 } else if ("rtf".equalsIgnoreCase(reporttype)) {
 response.setContentType("application/rtf");
 response.setHeader("Content-Disposition", "inline; filename=\"file.rtf\"");
exporter = new JRRtfExporter();
 exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
 } else if ("html".equalsIgnoreCase(reporttype)) {
 exporter = new JRHtmlExporter();
 exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
 } else if ("xls".equalsIgnoreCase(reporttype)) {
 response.setContentType("application/xls");
 response.setHeader("Content-Disposition", "inline; filename=\"file.xls\"");
exporter = new JRXlsExporter();
 exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
 } else if ("csv".equalsIgnoreCase(reporttype)) {
 response.setContentType("application/csv");
 response.setHeader("Content-Disposition", "inline; filename=\"file.csv\"");
exporter = new JRCsvExporter();
 exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
 }
try {
 exporter.exportReport();
 } catch (JRException e) {
 throw new ServletException(e);
 } finally {
 if (ouputStream != null) {
 try {
 ouputStream.close();
 } catch (IOException ex) {
 }
 }
 }
%>
En él habrá que cambiar la configuración de nuestra base de datos (color naranja) y el/los parametro/s que hayamos puesto en la consulta (color rojo), si no hay parámetros se pone null (color verde).
Ahora hay que descomprimir el archivo que descargamos anteriormente con todas las librerías. Se añade al proyecto el jasperreport-4.5.0.jar y después todas los .jar que hay en la carpeta lib.
Por último queda llamar a nuestro jasper. Imaginemos que en la tienda online, cuando el usuario confirma el pedido, le aparece un link donde mostrarle un pdf con la factura de su pedido. En el código de este link sería:
%>
 <p style="color:green">Pedido tramitado correctamente. Nos pondremos en contacto con usted para informarle de todo el proceso. Puede ver su factura <a href="report.jsp?filename=report2.jasper&reporttype=pdf&paramID=<%=request.getAttribute("idCompra").toString()%>">aquí</a>.</p>
 <%
En el verde hay que poner el report que creamos y en el rojo ponemos el parámetro que creamos y su valor.

No hay comentarios:

Publicar un comentario