Saltar la navegación

6.1.- Creación de informe desde una aplicación

Antes de comenzar es preciso que instales y configures NetBeans para poder usar el complemento de JasperReport, si no lo has hecho ya, como veíamos al principio de la unidad y que inicies el servidor MySQL con la base de datos Fabrica que hemos venido utilizando en los ejemplos anteriores.

En el proyecto que crees debes añadir las librerías:

Driver MySql JDBC: para incluirla accede al panel proyectos, pulsas el botón derecho del ratón (menú contextual) y seleccionas la opción Agregar Biblioteca. Lo buscamos en la lista que nos aparece y pulsamos Añadir librería (Add Library).

Spring Framework 4.0.1: repetimos el proceso anterior y seleccionamos dicho valor en la lista.

JasperReport 6.11: repetimos el proceso de la misma forma que hicimos con el Driver de MySQL y Spring Framework.

Incluiremos los siguientes ficheros .jar a nuestra Biblioteca. Accedemos, de nuevo, al menú contextual sobre Bibliotecas y seleccionamos Añadir ficheros jar /carpeta. Debemos de incluir los siguientes ficheros jar: commons-beanutils-1.8.2.jar, commons-collections4-4.4.jar, commons-digester-2.1.jar, commons-logging-1.1.2.jar, itext-2.1.7.jar, joda-time-2.4.jar, jollyday-0.4.9.jar.

Todos estos ficheros los puedes descargar desde el siguiente enlace: Conjunto de ficheros jars necesarios para el ejemplo.

Lo que pretendemos con este ejemplo, es desde una aplicación Java, construir un informe en formato PDF. Es decir, al ejecutar la aplicación vamos a crear un nuevo fichero, en formato PDF, que contendrá el informe.

Vamos a utilizar el informe PedidosCiudad.jrxml, que creamos de ejemplo durante el desarrollo de esta unidad. Vamos a duplicarlo y le vamos a cambiar el nombre para que se llame PedidosCiudadParametro.jrxml. Este informe muestra los pedidos que se han recibido de cada ciudad. Lo vamos a modificar para que reciba un parámetro, que será el año del cual queremos consultar los pedidos. Por lo tanto, obtendremos un informe de los pedidos que se han recibido agrupados por ciudad durante el año indicado.

Utilizando este fichero, accederemos al panel Report Inspector para definir el parámetro año. Las propiedades asociadas a este parámetro son:

Name: año

Parameter Class: java.lang.Integer

Default Value Expression:0. (Lo inicializamos con el valor cero.)

A continuación, modificaremos la sentencia SQL asociada a este informe para que reciba por parámetro el año del cual queremos mostrar los pedidos. La sentencia SQL que vamos a utilizar es la siguiente:
SELECT ciudad, id_pedido, fecha_pedido FROM
                    clientes, pedidos where clientes.ID_Cliente = pedidos.ID_Cliente 
                    and year(fecha_pedido)=$P{año}
                    order by ciudad

A continuación, procedemos a modificar el diseño del informe para introducir las etiquetas (static text) para agregar los títulos Número de pedido, Fecha de pedido y Total pedidos. También agregaremos, en la banda Title, el texto AÑO, utilizando una etiqueta (static label) y el valor del parámetro año.

El diseño del informe tiene que quedar de la siguiente forma:

Ilustración de una captura de pantalla del diseño del informe con las modificaciones.
Montaña Martín Vergel (Elaboración propia)


Una vez creado correctamente el informe, procederemos a utilizarlo desde una aplicación en Java. Para ello, vamos agregar a nuestro proyecto un nuevo fichero java, denominado PedidosAnio.java, que contendrá las instrucciones necesarias para establecer una conexión con la base de datos, obtener los datos para crear el informe y crear el fichero PDF en donde se guardará el informe.

import java.awt.Desktop;
            import java.io.File;
            import java.sql.Connection;
            import java.sql.DriverManager;
            import java.sql.SQLException;
            import javax.swing.*;
            import java.util.HashMap;
            import java.util.Map;
            import net.sf.jasperreports.engine.*;
            public class PedidosAnio {
            public static Connection conexion = null;
            String baseDatos = "jdbc:mysql://localhost/fabrica";
            String usuario = "root";
            String clave = "";
            public PedidosAnio(){
            try{
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conexion = DriverManager.getConnection(baseDatos,usuario,clave);
            }
            catch (ClassNotFoundException cnfe){
            System.err.println("Fallo al cargar JDBC");
            System.exit(1);
            }
            catch (SQLException sqle){
            System.err.println("No se pudo conectar a BD");
            System.exit(1);
            }
            catch (java.lang.InstantiationException sqlex){
            System.err.println("Imposible Conectar");
            System.exit(1);
            }
            catch (Exception ex){
            System.err.println("Imposible Conectar");
            System.exit(1);
            }
            }
            //El método ejecutar recibe el parametro del informe
            public void ejecutar(int año) 
            {
            //Ruta del informe respecto del proyecto NetBeans
            String archivojasper="PedidosCiudadParametro.jasper";
            try
            {
            //Cargamos los parametros del informe en una tabla Hash
            Map parametros = new HashMap();
            parametros.put("año",año);
            //Generamos el informe en memoria
            JasperPrint print = JasperFillManager.fillReport(archivojasper, parametros, conexion);
            // Exporta el informe a PDF 
            JasperExportManager.exportReportToPdfFile(print, "informe.pdf");
            //Abre el archivo PDF generado
            File path = new File ("informe.pdf");
            Desktop.getDesktop().open(path);
            }
            catch(Exception e)
            {
            JOptionPane.showMessageDialog(null,e.toString(),"Error",JOptionPane.WARNING_MESSAGE);
            }
            }
            }
            

Con este código estamos utilizando el informe PedidosCiudadParametro.jasper para generar el informe. El fichero resultante de la ejecución del código se almacenará en un fichero llamado informe.pdf

A continuación, vamos a crear un nuevo fichero, llamado EjemploDI05.java, donde tendremos definido el método main con este código:

public static void main(String[] args) {
            PedidosAnio informe = new PedidosAnio();
            int anio=2019;//Valor que se va a pasar para que lo recoja el parámetro
            informe.ejecutar(anio);
            }

Si ejecutamos la aplicación, se nos generará el fichero informe.pdf, cuyo contenido es:

Ilustración de una captura de pantalla del informe que se crea cuando se ejecuta la aplicación.
Montaña Martín Vergel (Elaboración propia)


Si creamos un formulario para seleccionar el año mediante un campo de texto o lista desplegable y ejecutamos el formulario desde un botón tendremos una aplicación gráfica para generar nuestro informe parametrizado.