Páginas

30/3/15

iReport con Oracle PL-SQL y Aplicación Java Web Primefaces. Parte 1.

iReport con Oracle PL-SQL y Aplicación Web.

Tutorial de Jaspersoft iReport 5.6.0 utilizando Oracle PL-SQL y ejecutando el Reporte desde aplicación Java web con Primefaces. Parte 1.




Jaspersoft iReport 5.6.0 utilizando Oracle PL-SQL y JavaPara este Tutorial vamos a utilizar Jaspersoft iReport Designer v5.6.0, Oracle PL-SQL para la base de datos y obviamente Java para ejecutar nuestro reporte en formato PDF, dicho reporte lo vamos a ejecutar desde una aplicación web con Primefaces, vamos a explicar cómo funciona este asunto primero.
Jaspersoft iReport es un diseñador para JasperReports, como sabemos JasperReports es una librería escrita totalmente en Java con la cual podemos crear informes de diferentes tipos, puedes crear/construir un archivo y exportarlo, puedes exportar archivos en varios formatos como por ejemplo: excel, word, xml, pdf, etc. En este Tutorial nos vamos a centrar en la creación de un archivo en .pdf.
Por que deberías usar Jaspersoft iReport?? Primero si eres un programador Java te comento que está hecho 100% en código Java, es de fácil manejo, no tienes que instalar nada, solo se descarga y comienzas a usarlo, aparte de eso es poderoso y fácil de usar, posee múltiples funciones para agregar cuadros de texto, párrafos, separadores, imágenes, sub-reportes, tablas, etc, todo lo que puedas imaginar que lleva un informe en PDF con iReport puedes hacerlo y aparte de eso puedes hacer tu conexión a la base de datos con JDBC y hacerle consultas a la misma ya sea con sql o llamando a un Stored Procedure y los registros que retorne puedes mostrarlos en el reporte, ya quedaron atrás esas librerías en las que uno redactaba todo el contenido del informe dentro del mismo código Java.
Imagina que haces un reporte con esa librería utilitaria en código Java y quieras cambiar una pequeña parte del informe después que el sistema ya paso a producción, bueno tampoco es que es muy difícil, buscar de nuevo dentro del código la parte que quieres editar, hacer el cambio, las pruebas y después coordinar otro pase a producción, un poco fastidioso no?? En fin con iReport solo buscas el archivo que exportaste y lo editas directamente ahí sin tener que tocar tu código Java lo que es una mejor practica de programación.

Ya que este Tutorial es un poco largo lo voy a dividir en 2 partes:
Creo que ya te di unas cuantas razones para que dejes esas viejas clases utilitarias y aprendas a usar Jaspersoft iReport, primero vamos a la página oficial de Jaspersoft iReport. y descargamos la versión iReport Designer v5.6.0 que es la ultima hasta este momento, depende de que sistema operativo estés utilizando, descargas el adecuado.
Una vez que tienes la carpeta descomprimida navegas hasta el archivo iReport.exe que esta en este directorio: iReport-5.6.0>bin>ireport.exe.
Si quieres creas tu acceso directo apuntando al .exe o simplemente ejecutas desde ahí mismo el iReport.

Al momento de iniciar iReport esta es la pantalla de bienvenida:
iReport Inicio
iReport Inicio
Si ya posees una versión anterior te recuerda que puedes importar la configuración del diseñador anterior. Lo que deberíamos hacer ahora es seguir los pasos, el primer paso habla de la conexión a la base de datos, como dije anteriormente vamos a utilizar una base de datos de Oracle PL-SQL, así que necesitamos hacer la conexión mediante JDBC, para eso nos descargamos el driver de PL-SQL de la página oficial de Oracle, este es el .jar que tenemos que descargarnos:
Driver Oracle
Driver Oracle
Una vez que ya descargamos el driver tenemos que importarlo en el iReport, para eso vamos a navegar hasta: Herramientas>Opciones
Agregar Driver Oracle
Agregar Driver Oracle
Se nos va a desplegar una pantalla así y vamos a seleccionar la pestaña Classpath:
Agregar Driver Oracle
Agregar Driver Oracle
Después vamos a presionar el botón Add JAR y vamos a buscar el driver que descargamos y lo agregamos y presionamos el botón Aceptar.
Agregar Driver Oracle
Agregar Driver Oracle
Una vez hecho eso, vamos a configurar la conexión a la base de datos presionando sobre el icono en el paso numero 1.
JDBC iReport
JDBC iReport
Como vemos en la imagen hay varias opciones, nosotros vamos a escoger la opción resaltada que es mediante JDBC y presionamos el botón Next. Y en JDBC Driver vamos a elegir la opción de Oracle.
Configuracion JDBC iReport
Configuración JDBC iReport
Para rellenar los datos que se nos piden vamos a ingresar los siguientes:
  • Name: conexion-plsql.
  • JDBC URL: aquí vamos a copiar nuestra cadena de conexión a Oracle.
  • Username: el nombre de usuario para acceder a tu base de datos.
  • Password: la clave para tu nombre de usuario.
Nota: para saber cuál es tu cadena de conexión ingresa a tu PL-SQL Developer y navega hasta: Help>Support Info>TNS names, buscas el tuyo y anotas el alias o descriptor, host o ip y el puerto. Así se escribe la cadena de conexión: jdbc:oracle:thin:host:puerto:alias, si la base de datos esta en tu maquina local puedes poner: @localhost.

Algo así tiene que quedar:
Nombre Conexión iReport
Nombre Conexión iReport
Después de eso presionamos el botón Test y si todo está bien nos saldrá un mensaje como este:
Test Connection iReport
Test Connection iReport
Ya tenemos la conexión a la base de datos, ahora podemos pasar el paso número 2, en el cual vamos a crear nuestro primer reporte, vamos a crear algo sencillo para comenzar, un reporte con un Titulo y la información de una tabla que obtendremos desde un Stored Procedure de PL-SQL. Así que antes vamos a crear un Stored Procedure en PL-SQL el cual nos retornara los datos que vamos a insertar en el reporte.
Para este Tutorial vamos a crear una tabla de alumnos que vamos a llamar DATO_JAVA_ALUMNOS con estos registros: id_alumno, dni y nombre. Asi creamos la tabla en PL-SQL:
   create table DATO_JAVA_ALUMNOS
   (
     id_alumno NUMBER,
     dni       INTEGER not null,
     nombre    VARCHAR2(20)
   )
  
Ahora vamos a insertar unos cuantos alumnos en esa tabla, 3 registros:
insert into DATO_JAVA_ALUMNOS DJA
  (DJA.ID_ALUMNO, DJA.DNI, DJA.NOMBRE)
values
  (1, 12345678, 'JOSE');

insert into DATO_JAVA_ALUMNOS DJA
  (DJA.ID_ALUMNO, DJA.DNI, DJA.NOMBRE)
values
  (2, 21158225, 'JULIANA');

insert into DATO_JAVA_ALUMNOS DJA
  (DJA.ID_ALUMNO, DJA.DNI, DJA.NOMBRE)
values
  (3, 85285269, 'MANUEL');
   
Una vez que tenemos 3 alumnos en la base de datos podemos hacer un Stored Procedure básico para traernos a todos los alumnos y así poder ejecutar el mismo desde iReport. Recuerda que una buena práctica de programación es crear el Stored Procedure dentro de un package y su especificación. El package lo vamos a llamar PKG_DJ_ALUMNOS. Así creamos el package body, su especificación y el Stored Procedure:
 
/*Creamos la especificacion*/
CREATE OR REPLACE PACKAGE PKG_DJ_ALUMNOS AS

/*Declaramos un cursor para devolver los datos*/
TYPE RESULT_SET IS REF CURSOR;

PROCEDURE BUSCAR_TODOS_ALUMNOS(o_result_set OUT RESULT_SET);

END PKG_DJ_ALUMNOS;

/*-----------------------------------------------*/

/*Creamos el body*/
CREATE OR REPLACE PACKAGE BODY PKG_DJ_ALUMNOS IS

PROCEDURE BUSCAR_TODOS_ALUMNOS(
  o_result_set OUT RESULT_SET
  )
  AS
  BEGIN
    OPEN o_result_set FOR SELECT * FROM
    DATO_JAVA_ALUMNOS ORDER BY NOMBRE;
  END BUSCAR_TODOS_ALUMNOS;

END PKG_DJ_ALUMNOS;  
Una vez que tenemos hecho todo esto en PL-SQL vamos crear el reporte, como dije anteriormente vamos hacer algo básico, un titulo y los datos de los alumnos que tenemos en la base de datos que acabamos de crear. Al momento de presionar el icono en el paso 2 nos aparece esta pantalla:
Reporte A4 iReport
Reporte A4 iReport
Elegimos el reporte A4 y presionamos el botón Open this Template y le vamos a poner de nombre al reporte reporteAlumnosDatoJava y vamos a elegir la ubicación del mismo, siempre es bueno crear una carpeta en donde tengamos nuestros reportes de iReport. Después de eso presionamos el botón Siguiente y luego el botón Terminar.
Nombre Reporte
Nombre Reporte
Ya tienes el reporte creado, ahora necesitamos cambiar el lenguaje del reporte a Java para evitar errores al ejecutarlo desde la aplicación, para cambiar el lenguaje desplegamos la ventana que está del lado superior izquierdo que tiene por nombre Report Inspector
Report Inspector
Report Inspector
Seleccionamos el reporte "reporteAlumnosDatoJava" presionamos clic derecho y vamos a las propiedades, cambiamos el lenguaje actual Groovy por Java.
Lenguaje Java
Lenguaje Java
Ahora vamos a comenzar a crear la estructura del mismo, hay una paleta del lado superior derecho en la cual podemos elegir varios componentes que con solo arrastrarlos al reporte ya se agregan. La pantalla que debería aparecerte es esta:
Inicio Reporte
Inicio Reporte
Ahora explicare un poco mas como funciona este diseñador, vamos a mostrar los registros del Stored Procedure en PL-SQL que devuelve un cursor con los datos de los 3 alumnos, tenemos que crear un parámetro en el iReport que sea del tipo ResultSet y así cuando hagamos la llamada al Stored Procedure podamos pasar este parámetro creado del mismo tipo. Para crear el parámetro en iReport vamos a la ventana Report Inspector en la opción de Parameters presionamos clic derecho y elegimos la opción Agregar Parameter, seleccionamos el parámetro creado y presionamos la opción Propiedades ubicada en el lado superior derecho, o desde el menú Ventana, ahí vamos a cambiar las propiedades del mismo por:
  • Name: P_CURSOR.
  • Parameter Class: java.sql.ResultSet.
  • Use as a prompt: desactivado.
Lo demás se deja por defecto.
Parameters Propiedades
Parameters Propiedades
Nota: por cada parámetro que reciba un Stored Procedure o un query normal tienes que crear un parámetro en el iReport del mismo tipo.

Ahora hay que crear los campos que están en el cursor, el cursor devuelve los campos ID_ALUMNO, DNI y NOMBRE, vamos a crear los campos en el iReport con el mismo nombre para poder mostrarlo en el reporte. Para agregar un campo vamos a la ventana Report Inspector, en la opción Fields presionamos el clic derecho y elegimos la opción Agregar Field, seleccionamos el campo creado y vamos a sus propiedades y le cambiamos el nombre, la clase no hace falta cambiarla en esta ocasión, tienes que crear 3 campos que se llamen igual que los campos que están en el cursor:
  • ID_ALUMNO.
  • DNI.
  • NOMBRE.
Una vez creado los campos vamos hacer la llamada al Stored Procedure desde el iReport y vamos a probar si devuelve los datos esperados.
Ahora en la misma ventana Report Inspector seleccionamos el reporte reporteAlumnosdatoJava y presionamos el clic derecho y seleccionamos la opción Edit Query
Edit Query Option
Edit Query Option
Aquí hay que agregar la llamada al Stored Procedure, elegir el lenguaje y ver los resultados esperados:
  • Query language: aquí vamos a elegir la opción plsql ya que es el lenguaje que estamos utilizando.
  • Llamada al SP: "{call usuario.pkg_dj_alumnos.buscar_todos_alumnos($P{P_CURSOR})}", usuario es tu nombre de usuario en Oracle PL-SQL, hacemos la llamada pasando el parámetro que creamos antes P_CURSOR.
  • Resultados Esperados: presionamos el botón Preview Data.
Edit Query iReport
Edit Query
Ahora vamos a poner el Titulo del reporte y los datos que vienen de la base de datos. Arrastramos un label de la paleta al reporte y lo situamos en el espacio que dice Title. Le ponemos este nombre Primer Reporte con iReport, ahora vamos arrastrar los campos que creamos al reporte para mostrar la información que devuelve el cursor, estos los vamos a situar en el espacio del reporte que se llama Detail 1. Así debería verse:

Nota: cuando agregamos los campos que devuelve el cursos automáticamente se agrega un label con el nombre del campo, ese label lo situamos en el espacio que dice Column Header, tenemos que acomodar el reporte para que queden bien situados los campos, al título le cambie el tamaño de la letra. El espacio Detail 1 lo puse más pequeño para que a la hora de imprimir el reporte se vea mejor.
Reporte Final
Reporte Final
Para ver un preview del reporte tienes que compilar el mismo y después presionar en Preview:
Compilar Reporte
Compilar Reporte
Preview Reporte
Preview Reporte

Cada vez que compilas el reporte de iReport se crean dos archivos, en el directorio que elegimos antes, si ya están creados se reemplazan. Con esto ya tenemos el reporte listo en iReport, ahora solo nos falta ejecutar dicho reporte desde Java que es lo que viene en la parte 2 de este Tutorial. Seguir con el Tutorial

6 comentarios :

  1. me sale error tipo de columna no valido

    ResponderEliminar
    Respuestas
    1. Amigo Jose, ese es un error de la base de datos. Si explica un poco mas el error podría ayudarlo mejor.

      Suerte.

      Eliminar
  2. es problema de la sentencia create en el procedimiento, yo no perdi tiempor en resolverlo, pero puedes selecionar SQL en lugar de plsql y armas tu query que al final lo que deseas ver es como te arma el reporte no?

    ya luego haces tu pl real y lo corres en la bd si te funciona alli ya lo manejas como este ejemplo plsql

    ResponderEliminar
    Respuestas
    1. Hola jmariom,

      Tienes razón, ese podría ser uno de los problemas, como no especifica como ocurre el error, que motor de BD utiliza, etc... Puede ser por varios motivos.

      Gracias por comentar,

      Suerte.

      Eliminar
  3. Muy buena explicación y excelente página, muchas gracias.

    ResponderEliminar