jueves, 13 de octubre de 2016

060.- Conexión Con Informes Desde Java - Java Y NetBeans

Conexión con Informes desde Java:

Una vez creados los informes con iReport, tendremos que acceder a ellos desde nuestra aplicación Java para poder mostrarlos al usuario.

En esta entrada veremos los pasos básicos necesarios para mostrar un informe desde una aplicación Java.

Nota: En este post se usará el informe creado en el post anterior, llamado serviciosAgrupados.



EJERCICIO GUIADO Nº 1. CREACIÓN DEL INFORME COMPILADO:

  1. Entra en NetBeans y abra el informe haciendo clic derecho en el archivo serviciosAgrupados.jrxml y luego escoger la opción Abrir. (el informe serviciosAgrupados estará en el paquete en el que lo creó).

Los ficheros que contienen un informe son ficheros del tipo .jrxml.



  1. Vamos a ver el aspecto del informe. Pulse en Preview:


Ya sabe que en esta pestaña Preview se usa la conexión activa y permite visualizar el informe relleno con los datos de la base de datos, según la consulta SQL que haya usado:



  1. Sin embargo, este botón no solo sirve para visualizar el informe final, sino que además actúa como compilador, generando un fichero del tipo .jasper.

Los ficheros .jasper son informes compilados, de forma que puedan ser usados en aplicaciones java.

Cada vez que ha visualizado un informe, ha generado sin darse cuenta un fichero .jasper, con el nombre del informe que estaba visualizando. En nuestro ejemplo, acabamos de generar un fichero serviciosAgrupados.jasper.

  1. Los ficheros .jasper generados se almacenan dentro de la carpeta del paquete del proyecto NetBeans en el que se creó; sin embargo, se puede configurar el programa iReport para que los ficheros compilados se almacenen en otra carpeta, de forma que estén más accesibles.

Para ello en NetBeans hacer clic en Herramientas y luego en Opciones:



  1. En el cuadro de Opciones que aparece active la pestaña iReport:



  1. Luego hacer clic en la pestaña Compilation and execution, desactivar la casilla Use Report Directory to compile, luego dar clic en Browse:



7.    Explorar y seleccionar la carpeta donde deseas guardar los archivos de informes compilados, es decir los archivos con extensión .jasper. Acepta los cambios.

8.    A partir de ahora cada vez que visualice un informe el fichero compilado se guardará en la carpeta que has configurado previamente. Lo vamos a comprobar. Vuelva a visualizar su informe:



9.    Acuda a la carpeta configurada previamente  y compruebe que en ella hay ahora un fichero serviciosAgrupados.jasper. Este es el fichero del informe compilado. Este fichero será el que usará para visualizar informes desde java.



EJERCICIO GUIADO Nº 2. CONEXIÓN CON UN INFORME DESDE JAVA:

  1. Entra en NetBeans y crea un nuevo proyecto Java. El proyecto se llamará PruebaInformes y contendrá un paquetePrincipal. Este paquete a su vez contendrá una VentanaPrincipal:



  1. Prepara tu proyecto para que pueda acceder a la base de datos AMANUVA (ya sabes, crear el objeto conexion, sentencia, etc.).

  1. Para que nuestro programa sea capaz de presentar informes, crearemos una carpeta llamada informes dentro de la carpeta del proyecto. Y dentro de dicha carpeta copiaremos los ficheros .jasper de los informes que queremos utilizar. En nuestro caso, copiaremos el fichero serviciosAgrupados.jasper que creamos en el apartado anterior, dado que el informe en cuestión tiene una imagen también tendremos que pegar dicho archivo (leaf_banner_green.png).
Así pues crea la carpeta informes dentro de la carpeta de proyecto y pega los ficheros serviciosAgrupados.jasper y leaf_banner_green.png dentro de ella.

  1. Crea un botón en la ventana de tu proyecto. El botón contendrá el texto “Informe Agrupado” y su nombre será btnInformeAgrupado:




  1. El objetivo es hacer que aparezca el informe serviciosAgrupados cuando se pulse este botón. Para ello, programe lo siguiente en el evento actionPerformed del botón:


Este código le muestra muchos errores, no se preocupe ahora de ellos. En los siguientes pasos se corregirán. De momento lo que se va a hacer es explicar el código de este evento:

·       Lo primero que observará es como se usa una variable rutaInforme para almacenar el camino del informe que queremos mostrar. Observa que dicho informe se especifica con el fichero .jasper generado con iReport, y que este fichero se encuentra dentro de la subcarpeta informes.

·       A continuación viene una línea donde se crea un objeto informe del tipo JasperPrint:

JasperPrint informe = JasperFillManager.fillReport(rutaInforme, null, conexion);


·       Esta línea es la que genera el informe que se va a mostrar. El informe en java es un objeto del tipo JasperPrint y es creado a través de otro objeto del tipo JasperFillManager.

·       Es interesante que observes el uso de un método llamado fillReport (llenar informe) que se encarga de llenar el informe con datos.

·       Este método necesita tres parámetros:

-       El sitio donde se encuentra el fichero del informe.
-       Los parámetros (null en nuestro ejemplo. Los parámetros se estudiarán en próximas entradas de este blog).
-       Y el objeto conexion, que le permite a java acceder a la base de datos para recoger los datos que se presentarán en el informe.

·       Una vez creado el objeto informe, solo tenemos que presentarlo en pantalla. Los informes se presentan a través de un objeto del tipo JasperViewer. Los objetos JasperViewer son ventanas donde se muestran los informes.

JasperViewer ventanaVisor = new JasperViewer(informe, false);


·       Esta línea de código crea una ventana llamada ventanaVisor donde se muestra el informe informe. El parámetro false indica que al cerrarse la ventana del informe no debe acabar el programa. Si este parámetro fuera true, al cerrar la ventana del informe se cerraría el programa entero (esto no interesa para lo que tratamos de enseñar).

·       El objeto ventanaVisor es una ventana normal y corriente y puede ser visualizada con setVisible. Por otro lado, se le asigna el título “INFORME DE SERVICIOS:” con el método setTitle.

·       Todo este código debe estar rodeado de un try...catch para capturar errores inesperados.


  1. Todos los errores del código se producen debido a que es necesario indicar los imports correspondientes a las clases JasperPrint, JasperFillManager, JasperViewer que participan en el código.

Un import es una línea de código que le dice a java en qué librería debe encontrar la clase correspondiente.

Normalmente, al hacer clic sobre la línea que da el error, aparece el icono de una bombilla pequeña en la parte izquierda de la ventana. Al hacer clic sobre esta bombilla se nos informa de la biblioteca que hace falta importar. Ya sabe que basta hacer clic sobre esta biblioteca para que se añada la instrucción import correspondiente de forma automática.

Sin embargo, si prueba esto mismo con las líneas erróneas del código anterior, verá que no aparece ninguna bombilla. Esto es debido a que las bibliotecas donde se encuentran las clases JasperPrint, JasperFillManager y JasperViewer no vienen incluidas en NetBeans, ya que son clases pertenecientes al programa iReport. Así pues, NetBeans no sabe dónde encontrar estas clases.


7.    Para evitar este error, es necesario incluir en el proyecto una serie de bibliotecas propias del programa iReport. Esto se hace de la siguiente forma:

8.    Haga clic con el botón derecho del ratón sobre el apartado Bibliotecas de tu proyecto y luego active la opción Agregar archivo JAR/Carpeta:



9.    Debe acudir al siguiente directorio C:\Users\EdwinAmado\AppData\Roaming\NetBeans\8.1\modules\ext (el texto que está en color púrpura debe ser el usuario actual de su sistema operativo) para buscar en él las bibliotecas necesarias:



10. Los ficheros que contienen las bibliotecas necesarias para que este programa funcione correctamente son los siguientes:
·       sqljdbc42.jar
·       servlet-api-2.4.jar
·       joda-time-2.1.jar
·       jcommon-1.0.15.jar
·       groovy-all-2.0.1.jar
·       jfreechart-1.0.12.jar
·       commons-digester-2.1.jar
·       commons-collections-3.2.1.jar
·       commons-javaflow-20060411.jar
·       commons-logging-1.1.jar
·       jasperreports-javaflow-6.3.1.jar

De la lista anterior el primer archivo (sqljdbc42.jar) se descarga de la página de Microsoft.

De la lista anterior el último archivo (jasperreports-javaflow-6.3.1.jar) se descarga de la siguiente url: http://community.jaspersoft.com/project/jasperreports-library/releases

Todos los demás archivos ya estarán en el disco duro de tu máquina después de haber instalado el IDE NetBeans en la siguiente ruta: C:\Users\EdwinAmado\AppData\Roaming\NetBeans\8.1\modules\ext (el texto que está en color púrpura debe ser el usuario actual de su sistema operativo).


Empezaremos añadiendo el fichero servlet-api-2.4.jar selecciónelo y active Abrir:



11.  Observará que se ha agregado el fichero a la zona de bibliotecas:



12. Repita el proceso para agregar los otros 10 (diez) ficheros necesarios. Al final, su zona de Bibliotecas debe quedar así (observe los 11 ficheros añadidos):



13. Gracias a la inclusión de estos ficheros, nuestro proyecto ya dispone de las bibliotecas que contienen a las clases que necesitamos, que recuerda que son: JasperPrint, JasperFillManager, JasperViewer.

Si ahora haces clic sobre la primera línea que da error, verá como ahora NetBeans ya sabe el import que debe añadirse, y por tanto aparecerá la bombilla. Pulse sobre la bombilla:



14. La línea de código para importar la clase JasperFillManager es:

import net.sf.jasperreports.engine.JasperFillManager;


15. La línea de código para importar la clase JasperPrint es:

import net.sf.jasperreports.engine.JasperPrint;


16. Y finalmente la línea de código para importar la clase JasperViewer es:

import net.sf.jasperreports.view.JasperViewer;



17. Los errores han desaparecido. Ya puede ejecutar el programa.

18. Si pulsa sobre el botón Informe Agrupado aparecerá el informe.

El informe aparece en una ventana (el visor de informes – objeto JasperViewer) que tiene una pequeña barra de herramientas. En esta barra podrá por ejemplo imprimir el informe, o cambiar su zoom, entre otras cosas:



19. Tal como se ha programado este botón, al pulsarse se visualiza el informe antes de que el usuario decida imprimirlo o no. En algunos casos, puede ser interesante que el informe se imprima directamente sin que se visualice antes.

Veamos cómo hacer esto. Primero añada otro botón btnImprimirDirectamente a su ventana:



20.Ahora programe dentro de su evento actionPerformed lo siguiente:



El código es similar al anterior, solo que se elimina todo uso del objeto JasperViewer (ventana visualizadora) ya que el informe ya no debe salir en pantalla.

Además se añade una nueva línea:

JasperPrintManager.printReport(informe, true);


Esta línea usa una clase llamada JasperPrintManager que se encarga de imprimir el informe informe usando el método printReport.

Si el segundo parámetro tiene el valor true, entonces significa que aparecerá el cuadro de diálogo de impresión:


Si estuviera a false, este cuadro de diálogo no aparecería y el informe se enviaría directamente a la impresora configurada por defecto en el ordenador.

En nuestro caso, al tener el valor true, este cuadro sí aparecerá.

21. Ejecute el programa y pruebe el nuevo botón. No hace falta que imprima el informe.




CONCLUSIONES:

Para poder imprimir un informe creado con iReport desde una aplicación Java es necesario agregar ciertas bibliotecas que utiliza el programa iReport:

sqljdbc42.jar
servlet-api-2.4.jar
joda-time-2.1.jar
jcommon-1.0.15.jar
groovy-all-2.0.1.jar
jfreechart-1.0.12.jar
commons-digester-2.1.jar
commons-collections-3.2.1.jar
commons-javaflow-20060411.jar
commons-logging-1.1.jar
jasperreports-javaflow-6.3.1.jar


Una vez agregadas estas bibliotecas, el proceso para imprimir un informe es el siguiente:
-       Crear un objeto del tipo JasperPrint (el informe).
-       Crear un objeto visor (JasperViewer) que permita visualizar el informe.
-       O bien imprimir directamente el informe con un objeto JasperPrintManager.

6 comentarios:

  1. Hola, tengo un problema con la ruta de mi reporte, al copiar la aplicación o el jar en otra computadora y al dar click al botón para que lo generé me manda el error al cargar el reporte, he leído que el problema es la ruta, he hecho lo que dicen los tutoriales, sin embargo sigue ocurriendome el error, ¿que puedo hacer, por favor?

    ResponderBorrar
    Respuestas
    1. Saludos Clau:
      Disculpa por la demora en la respuesta. Para solucionar lo que indicas tienes que crear en la otra computadora las carpetas exactamente como se indica en la ruta mostrada en el mensaje de error y pegar ahí el archivo .jasper de tu informe (reporte).

      Borrar
  2. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  3. Muchísimas gracias por tu aporte, fue bien recibido y sirvió de gran manera.

    ResponderBorrar
    Respuestas
    1. Que bien que te haya servido este post.

      Suerte y adelante con la programación.

      Borrar
  4. Siempre me faltaba una librería, con tu ayuda pude resolver gracias

    ResponderBorrar