Oracle Forms 12c – Integración con Oracle BI Publisher
18/05/2016 -
Una de las nuevas funcionalidades de Oracle Forms 12c es la integración nativa con Oracle BI Publisher.
Antes de la versión 12c, solamente se podía utilizar Oracle Forms con BI Publisher de estas 4 formas:
- Llamando a la aplicación BI Publisher via URL
- Integrando las clases de BI Publisher dentro de Forms y usando las funciones de la API
- Programando un servlet y usando las funciones de la API
- Llamando a sus Web Services desde Forms
Gracias a esta nueva funcionalidad podemos combinar en nuestra aplicación el uso de Oracle Reports y de Oracle BI Publisher.
Esta integración se ha diseñado para que sea muy parecida a la que nos ofrece Oracle Reports con RUN_REPORT_OBJECT. Por tanto, para poder diferenciar entre que tipo de informe vamos a ejecutar, Oracle ha creado la nueva propiedad REPORT_OBJECT_TYPE, que podemos encontrar en las propiedades del objeto “Informe“ en el navegador de objetos de Oracle Forms. Esta propiedad puede tener uno de los siguientes valores:
- OraReports: Oracle Reports
- OraBIP: Oracle BI Publisher
Debemos tener en cuenta que la llamada a BI Publisher, a través de la integración nativa con Forms, siempre es asíncrona.
En nuestro laboratorio hemos podido probar la integración con llamando al listado Salary Report ya existente en Bi Publisher:
Como primer paso, dentro del formulario le hemos añadido un nuevo Informe/Report de tipo OraBIP vacío. Los parámetros de la integración los estableceremos en la unidad de programa mas adelante.
A continuación enumeramos los parámetros que vamos a utilizar en la integración:
- BIP_SSL_CONNECTION: Indica si SSL es obligatorio u opcional.
- BIP_SERVICE_LOCATION: La URL del Web Service – WSDL (ScheduleServices) del servidor Oracle BI_Publisher.
- BIP_REPORT_PATH: Path absoluto del report a ejecutar (en el servidor BI Publisher ).
- BIP_REPORT_LOCALE: Report Locale.
- BIP_REPORT_FORMAT: Formato de salida deseado. Para la lista de formatos completa, podemos consultar la documentación de BI Publisher. Los mas usados serían:
- html
- rtf
- xslx
- csv
- BIP_USER: Usuario necesario para acceder al servicio Web.
- BIP_PASSWORD: Password necesario para acceder al servicio web.
El resto de parámetros y sus posibles valores los podemos encontrar en la ayuda.
Ejecución del informe
Con la siguiente unidad de programa en nuestro formulario, podemos ejecutar el informe:
–Servidor BI Publisher
v_xmlpserver := ‘http://servidor:puerto/xmlpserver’;–Identificar el report
repid := find_report_object (p_bi_name_rep);— Username & Password.
SET_REPORT_OBJECT_PROPERTY (repid, BIP_USER, bi_username);
SET_REPORT_OBJECT_PROPERTY (repid, BIP_PASSWORD, bi_password);—
SET_REPORT_OBJECT_PROPERTY (repid, BIP_SSL_CONNECTION, OPTIONAL);
SET_REPORT_OBJECT_PROPERTY (repid, BIP_SERVICE_LOCATION, v_xmlpserver||’/services/v2/ScheduleService?wsdl’);
SET_REPORT_OBJECT_PROPERTY (repid, BIP_REPORT_PATH, ‘/Samples/1. Overview/Salary Report.xdo’);
SET_REPORT_OBJECT_PROPERTY (repid, BIP_REPORT_LOCALE, ‘ES-es’);
–Tipo de formato de salida, p.e.: html,pdf,rtf,xslx,csv
SET_REPORT_OBJECT_PROPERTY (repid, BIP_REPORT_FORMAT, ‘pdf’);— Llamada a Run Report Object
v_rep := RUN_REPORT_OBJECT(repid);
Después de ejecutar nuestra pantalla, podemos ver en la consola de BI Publisher la correcta ejecución del listado y verificar el fichero generado siguiendo el enlace:
Si queremos avisar al usuario una vez finalice el job planificado, podemos consultar el estado de la siguiente manera:
rep_status := report_object_status(v_rep)
Oracle recomienda usar un timer para hacer este check y desaconseja hacerlo con un bucle.
Entrega/Distribución del Informe
De la entrega del Informe se encargará BI Publisher según le hayamos indicado en la unidad de programa en Oracle Forms, o bien en las propiedades del informe. Para distribuirlo tenemos disponibles los siguientes “Delivery Channels“:
- FTP Delivery Channel
- Fax Delivery Channel
- Mail Delivery Channel
- Local File Delivery Channel
- Print Delivery Channel
- WebDav Delivery Channel
A continuación os mostramos un par de ejemplos de la entrega:
- Cómo distribuir el informe vía e-mail:
Podemos distribuir el informe adjunto en un e-mail, siempre que lo tengamos configurado en BI Publisher, como se puede ver en la imagen:
Podemos establecer los siguientes parámetros antes de ejecutar el informe:
SET_REPORT_OBJECT_PROPERTY (repid, MAIL_TO, ‘mailto@dominio.com‘);
SET_REPORT_OBJECT_PROPERTY (repid, MAIL_FROM, ‘mailfrom@dominio.com’);
SET_REPORT_OBJECT_PROPERTY (repid, MAIL_CC, ‘mailcc@dominio.com’);
SET_REPORT_OBJECT_PROPERTY (repid, MAIL_BCC, ‘mailbcc@dominio.com’);.
SET_REPORT_OBJECT_PROPERTY (repid, MAIL_REPLYTO, ‘mailreplyto@dominio.com’);
SET_REPORT_OBJECT_PROPERTY (repid, MAIL_SUBJECT, ‘Subject’);
SET_REPORT_OBJECT_PROPERTY (repid, MAIL_BODY, ‘Mail body …’);
SET_REPORT_OBJECT_PROPERTY (repid, MAIL_SERVER, ‘server’);
Una vez ejecutado el informe, se envía automáticamente con el fichero adjunto en el e-mail.
- Cómo generar el informe en fichero:
Si queremos generar el informe en un fichero localizado en el servidor de BI Publisher, podemos usar la siguiente propiedad:
SET_REPORT_OBJECT_PROPERTY (repid, LOCAL_FILE_NAME, ‘/directorio/nombre_fichero.ext‘ );
Si publicamos el directorio donde estamos generando el fichero y construimos la url con el nombre del fichero, podríamos llegar a mostrarlo usando “web.show_document” desde el mismo formulario, una vez finalice la ejecución.
Entendiendo el Job ID de RUN_REPORT_OBJECT / scheduleReport
Cuando recuperamos el Job ID de la llamada a RUN_REPORT_OBJECT, nos llamó enseguida la atención que el valor recuperado no se correspondía con el valor mostrado en la consola de BI Publisher, ni con el valor de la salida que muestra el informe (outputId). En el ejemplo que hemos usado Oracle Forms nos devolvía el valor 1007, mientras que en la consola veíamos el job 1008 y, al visualizar el documento desde la consola, el id de la salida era el 1004:
http://servidor:puerto/xmlpserver/servlet/outputDocument?outputid=1004&content_type=pdf
Este comportamiento se debe a que Oracle Forms realiza una llamada al ScheduleService programando un Job que nos devuelve el valor del parentJobId y a su vez nos crea un child jobId. Si queremos recuperar el id del hijo, y a su vez la salida, lo podemos hacer vía Web Services, llamando a ScheduleService.getAllScheduledReportHistory() para listar todos los hijos y luego recuperando la salida con ScheduleReport.getScheduledReportOutputInfo(). Podemos ver mas detalles en la siguiente nota: Doc ID 1344535.1