En este día tan especial de agradecimientos y antes de empezar con este artículo tan interesante sobre el paquete PL/SQL llamado jrxml2pdf, quiero decir a toda la comunidad fanática de Oracle APEX un muy grande GRACIAS! ¡Porque seguimos creciendo y seguimos evangelizando esta poderosa herramienta en cada rincón del mundo de habla Hispana!
Invito a todos los que se iniciaron con APEX tanto con mis cursos como con mis libros en español que compartan lo que han aprendido desde su experiencia así cada vez somos mas los que llevamos la camiseta de Application Express en español con gran orgullo!
Cómo Imprimir Informes Personalizados en formato PDF desde Código PL/SQL en Oracle Apex 18.1
Todos los que hemos trabajado en desarrollar aplicaciones ya sean para escritorio como web, se nos presenta un requerimiento determinante que es el de poder imprimir los reportes que se crean en la aplicación.
Es por ello que al trabajar con Oracle APEX siendo una herramienta sin costo embebida en la base de datos Oracle, siempre he investigado diferentes formas de poder imprimir los reportes y que sean sin costo.
Es por ello que en esta oportunidad les traigo una actualizacion que ya había publicado anteriormente sobre este paquete construido en puro PL/SQL llamado jrxml2pdf que nos permite mostrar reportes PDF listos para imprimir desde nuestra aplicación en APEX 18.1.
Como veremos a continuación para construir el reporte que queremos imprimir en formato PDF vamos a trabajar con una herramienta gráfica gratuita y Open Source llamada JasperSoft Studio.
Paquete PL/SQL jrxml2pdf
El paquete PL/SQL jrxml2pdf es una solución escrita en código PL/SQL puro y que genera archivos PDF tomando la información desde la tabla jrxml-report-definition el cual nos permite ingresar el código XML del reporte creado y lo mejor de todo es que no se necesita ningún middleware J
Podemos diseñar nuestros reportes gráficamente y muy sencillamente usando JasperSoft Studio, como lo veremos en un momento, y con unos simples pasos mostrar dichos reportes en nuestras aplicaciones en APEX.
Este paquete fue escrito por Andreas Weiden basándose en el paquete AS_PDF3 escrito por Anton Scheffer y el tipo de licencia que maneja es la GLP y MIT las cuales se encuentran descriptas en el paquete.
Descargar Paquete
Descargamos el Paquete jrxml2pdf en nuestra PC desde el siguiente link: https://sourceforge.net/projects/pljrxml2pdf/ (en mi caso lo descargaré en el escritorio) y lo descomprimimos.
Instalar el paquete jrxml2pdf
Siguiendo el procedimiento de instalación del paquete necesitamos realizar los siguientes pasos:
- Conceder permisos a UTL_FILE al usuario donde se instalará el paquete:
GRANT EXECUTE ON UTL_FILE TO <esquema donde vamos a instalar el paquete jrxml2pdf> - Abrimos una ventana de comandos CMD (si estamos en Windows) y nos ubicamos en el directorio de instalación del paquete: en mi caso à C:UsersClarisaDesktopjrxml2pdf-releaseinstall y abrimos el SQLPlus.
- Ejecutamos el Script de Instalación: @install.sql
Después de instalar el paquete podemos ver los objetos instalados desde el Explorador de Objetos del Taller de SQL de APEX o desde el Toad for Orqacle o el SQL Developer si usamos estas herramientas para trabajar con los objetos de la base de datos, si expandimos los Paquetes, vemos que se agregaron los que corresponden al paquete jrxml2pdf:
Descargar e Instalar JasperSoft Studio
JasperSoft Studio es una poderosa herramienta de diseño visual para JasperReports, con esta herramienta gráfica podemos crear informes que cumplan con los más complejos requerimientos de información, además que es intuitivo, poderoso y muy fácil de usar.
Descargar JasperSoft Studio
El link de descarga es:
Seleccionamos el enlace que corresponde a nuestro sistema operativo, en mi caso es:
TIB_js-studiocomm_6.6.0_windows_x86_64.zip
Guardamos la carpeta comprimida en nuestra PC y luego la descomprimimos y creamos un acceso directo al escritorio del ejecutable del programa que se encuentra dentro de la carpeta Jaspersoftstudio/JaspersoftStudio.exe.
Ahora podemos ejecutar el programa y nos mostrará la página de inicio.
Cerramos la ventana Welcome y visualizamos el Jaspersoft Studio.
Crear Conexión a la Base de Datos desde Jaspersoft Studio
Desde la Página de Inicio del Jaspersoft Studio, seleccionamos Data Adapter y con el botón derecho del mouse seleccionamos Create Data Adapter y se abre una ventana emergente. Seleccionamos la opción Database JDBC Connection.
Hacemos clic en el botón Next >
Data Adapter: Database JDBC connection:
· Name: devcmo
· JDBC Driver: oracle.jdbc.driver.OracleDriver
· JDBC URL: jdbc:oracle:thin:@localhost:1521:XE
· Username: mi_username
· Password: mi_password
Hacemos clic en el tab inferior “Driver Classpath”.
Hacemos clic en el botón Add.
Y buscamos el driver jrxml2pdf.jar dentro de la carpeta donde hayamos descargado el paquete en mi caso lo descargué en el escritorio: C:UsersClarisaDesktopjrxml2pdf-releasejava_for_ireportjrxml2pdf.jar y hacemos clic en el botón Open.
Además, necesitamos agregar el jar ojdbc6.jar dentro del Classpath.
Hacemos clic en el botón Finish.
Volvemos a abrir la conexión que la llamamos devcmo y probamos la conexión.
Crear el Reporte en JasperSoft Studio
En esta sección vamos a aprender a crear un reporte básico usando JasperSoft Studio, para que pueda ser invocado más adelante en nuestra aplicación en APEX.
Nos conectamos a la base de datos con la conexión creada anteriormente, que la habíamos denominado devcmo.
Hacemos clic en el menú File à New à Jasper Report y de esa forma se inicia el asistente.
1. Report Templates
Se abre el asistente y seleccionamos el template Coffee Landscape, y hacemos clic en el botón Next.
2. Report File
- Ingresar el directorio padre: MyReports
- File name: listado-empleados.jrxml
3. Data Source
- Data Adapter: devcmo
- Hacemos doble clic sobre la tabla EMP del esquema DEVCMO para crear la consulta SQL. (Destildamos los campos HIREDATE y DEPTNO)
Hacemos clic en el botón Next >
4. Fields: Mostrar todos los campos de la Tabla
Hacemos clic en el botón Next >
5. Agrupar por (Group By…)
No seleccionamos nada.
Hacemos clic en el botón Next >
Finalmente hacemos clic en el botón Finish.
Se abre el IDE del Jaspersoft Studio donde visualizamos el reporte y podemos editar cada sección (band) del mismo y colocar las imágenes que deseamos en nuestro reporte.
No es objetivo de este artículo aprender a editar un reporte en Jaspersoft Studio.
Para información sobre esta herramienta por favor visitar la comunidad de JasperSoft Studio.
Simplemente para este demo hemos ingresado nuevas imágenes desde el workspace de Jaspersoft Studio en:
C:UsersClarisaJaspersoftWorkspaceMyReports y cambiamos los títulos.
Para pre-visualizar el reporte hacemos clic en el tab Preview que se encuentra en la parte inferior del panel central del diseñador. Ejecutamos el reporte haciendo clic en la flechita verde de play.
De esta forma podemos visualizar el reporte recién creado en Jaspersoft Studio:
Expresiones no soportadas en el paquete PL/SQL
No todas las expresiones usadas en el reporte que hemos diseñado en JasperSoft Studio están soportadas por el paquete jrxml2pdf, es por eso que es muy importante revisar la documentación del paquete para evitar errores en la visualización del reporte cuando lo mostremos desde la aplicación en APEX.
En el panel de la izquierda del IDE de JasperSoft referente al “Outline” expandimos Styles y luego expandimos Row, esta expresión es la que coloca el color de fondo en las filas de la tabla en forma alternada y que es parte del template que seleccionamos como base para crear nuestro reporte.
$V{REPORT_COUNT}%2 == 0
Este tipo de expresión no está soportada en el paquete jrxml2pdf, para ello vamos a eliminar la expresión y utilizar la herramienta de apariencia de la fila para darle color a todas las filas.
Para ver expresiones equivalentes que sí estan soportadas por el paquete, es importante revisar la documentación del paquete en el mismo sitio de su descarga.
Una vez modificado el reporte, necesitamos compilar el mismo para que se genere el archivo de compilación, para ello hacemos clic en el icono Build All.
Podemos observar que todas las filas tienen un color de fondo, según los estilos aplicados.
Podemos visualizar los dos archivos dentro del directorio MyReports:
C:UsersClarisaJaspersoftWorkspaceMyReports
listado-empleados.jrxml y listado-empleados.jasper
Nosotros vamos a usar el XML generado en el archivo “listado-empleados.jrxml” para que sea importado en la aplicación en APEX.
Importar Imágenes en la tabla JRXML_REPORT_IMAGES
Todas las imágenes que usemos en los reportes que creamos con JasperSoft Studio necesitamos ingresarlas en la tabla correspondiente de almacenamiento de imágenes que viene con el paquete jrxml2pdf.
Ingresamos al SQL Developer e insertamos un nuevo registro por cada imagen usada.
Tener en cuenta que necesitamos cargar las imágenes como BLOB y con el mismo nombre que tienen en las imágenes que usamos en JasperSoft Studio.
No olvidemos de hacer el commit de los registros cargados.
Importar el Reporte a nuestra base de datos
Vamos a cargar el reporte creado en JaspersSoft a nuestra base de datos:
1. Desde el Reporte creado (listado-empleados.jrxml) verificamos que al presionar el tab Preview se vea bien el PDF, el cual muestra todo el listado de Empleados.
2. Hacemos clic en el tab Source (que está al costado izquierdo del tab Preview) y copiamos todo el código XML en memoria con Ctrl + a
Abrimos el SQL Developer, posteriormente seleccionamos la tabla JRXML_REPORT_DEFINITIONS, y luego hacemos clic en la ficha Data para ingresar un nuevo registro:
- Hacemos clic en el icono Insertar Fila
- JRD_ID: añadimos un nuevo número según la secuencia que exista.
- JRD_NAME: Colocamos aquí el nombre del reporte (es muy importante esta columna y además debemos tener en cuenta de no colocar caracteres especiales ni espacios) en mi caso lo llamaré Empleados.
- JRD_DESCRIPTION: podemos dejar este campo en blanco o colocar una descripción del reporte.
- JRD_XML: aquí es donde debemos colocar todo el código XML que habíamos copiado del reporte en JasperSoft Studio.
- Hacemos clic en el icono Commit para que el registro sea creado.
Abrir Oracle APEX 18.1
Ya tenemos en una tabla todo el código XML del reporte que creamos en JasperSoft Studio.
Ahora vamos a crear una aplicación en APEX y una página con el reporte de Empleados y un botón que diga Imprimir Reporte.
La consulta de origen del Informe Interactivo es:
select EMPNO as “ID”,
ENAME as “NOMBRE”,
JOB as “JOB”,
MGR as “MANAGER”,
SAL as “SALARY”,
COMM as “COMMISSION”
from EMP EMP
Crear Proceso para Impresión del Reporte
Desde el Diseñador de Página hacemos clic en la ficha Procesamiento del panel de la izquierda y creamos un nuevo proceso:
- En la sección Identificación
- Nombre: Imprimir Reporte
- Tipo: Código PL/SQL
- En la sección Origen
Código PL/SQL:
DECLARE
vcName VARCHAR2(200);
lParams SCHEMA.PK_JRXML2PDF_REPGEN.TPARAMLIST;
bl BLOB;
BEGIN
vcName := ‘nombre-reporte’;
bl := SCHEMA.PK_JRXML2PDF_REPGEN.FK_RUN(i_vcName=>vcName);
SCHEMA.PK_JRXML2PDF_REPGEN.PR_SHOW_REPORT(bl);
APEX_APPLICATION.STOP_APEX_ENGINE;
END;
- En la sección Condición
- Si Se Hace Clic en el Botón: IMPRIMIR
- Guardamos todos los cambios hacienda clic en el botón Guardar
Reemplazamos ‘nombre_reporte’ por el nombre que pusimos a nuestro reporte, en este caso Empleados.
Reemplazamos SCHEMA por el nombre de nuestro esquema.
Ejecutamos la Página y podemos ver que el reporte se visualiza correctamente en nuestra aplicación en APEX.
Nota: puede haber problemas con algunos tipos de formato imagen como el jpg.
Resumen
Como hemos visto a lo largo de todo este artículo, podemos crear reportes PDF listos para imprimir y sin costo asociado.
Hemos aprendido a:
Funcionó!
Excelente!!! Saludos
Hola. Muy buen tutorial. Sin embargo, me produce un error:
Error: SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data.
Uso Apex 18.2 y Oracle XE
Buen día, me sale el siguiente error Error: SyntaxError: Unexpected token % in JSON at position 0, si me puede ayudar, gracias.
Hola Gilberto, en la pagina de APEX en propiedades de la pagina verifica en la sección de Avanzado, seleccionar "Always" porque al crear una pagina siempre queda configurado como "Only for Success". Una nota es que si en la pagina se usa una grilla interactiva debes usar esa opción y no "Always"porque no funciona . Y ya deberías ver por otro lado el problema que tienes. Saludos
Hola Roberto mira la respuesta que le hice a Gilberto. Saludos
Buen dia, Me sale el siguiente error, Error: SyntaxError: Unexpected token % in JSON at position 0, uso Apex 19.1 y Oracle XE 18c
Excelente, me funciono muy bien, esto para versión 19, en la versión Apex 5 no me pasaba, creo que venia por defecto Always, tendré en cuenta que es únicamente para paginas que no tengan grilla interectiva. Muchas gracias.
Me funciono perfecto, gracias.