todo sobre forms 10g - Comunidad de Madrid
Transcription
todo sobre forms 10g - Comunidad de Madrid
Nombre del manual TODO SOBRE FORMS 1OG TODO SOBRE FORMS 10G Fecha 01/11/2007 Versión 1.0 Cambios Versión Inicial Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 1 Nombre del manual TODO SOBRE FORMS 1OG 1 TABLA DE CONTENIDO 1 TABLA DE CONTENIDO............................................................................ 2 2 FICHERO INI GENERAL ............................................................................ 4 3 INFRAESTRUCTURA PARA DESARROLLOS EN ICM BAJO FORMS 10G 5 3.1 Sentencias DDL ........................................................................................... 5 3.2 Estandar General de Fuentes y Colores .................................................... 5 3.3 Documentación ........................................................................................... 6 3.4 Nomenclatura estandar de Directorios y Ficheros ................................... 6 3.5 Librería de Objetos...................................................................................... 6 3.6 Librería de PL/SQL ...................................................................................... 8 3.7 Templates (plantillas) a partir de Librerías de Objetos............................. 9 3.7.1 3.7.2 3.7.3 3.7.4 3.7.5 3.8 4 MENU BASE.......................................................................................................... 10 APL_BASE ............................................................................................................ 11 FORM_BASE......................................................................................................... 12 F60_MANT1 .......................................................................................................... 14 F60_MANT2 .......................................................................................................... 15 Plantilla Lista de Valores .......................................................................... 18 EMPLEO DE LAS PLANTILLAS.............................................................. 19 4.1 Form de Gestión de Perfiles - F60_USU .................................................. 20 4.2 Form Calendario........................................................................................ 21 5 ADAPTACIÓN DE PROCEDIMIENTOO - MENSAJE – DE LIBRERÍA PL/SQL DE FORMS 10G - ICM_PLL.pll ......................................................... 23 6 CREACIÓN DE WEB PARA ALOJAR PÁGINA ESTÁTICA INICIAL DE LA APLICACIÓN ............................................................................................. 25 6.1 Creación del web....................................................................................... 26 6.2 Estructura del web que aloja la página estática inicial de la aplicación 26 7 CREACIÓN DE WEB PARA AYUDA ....................................................... 26 7.1 Creación del web....................................................................................... 26 7.2 Estructura de ayuda de la aplicación en el web...................................... 26 8 VISUALIZACIÓN DE AYUDA EN DEVELOPER 10G............................. 27 9 TRATAMIENTO DE IMÁGENES EN DEVELOPER 10G ......................... 28 10 EJECUCIÓN DE PROCESOS EN BATCH ........................................... 31 11 VISUALIZACIÓN DE TRABAJOS BATCH........................................... 36 12 VISUALIZACIÓN DE TRABAJOS BATCH EN MÁQUINAS UNIX....... 37 Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 2 Nombre del manual TODO SOBRE FORMS 1OG 13 FUSIÓN DE DOCUMENTOS DESDE FORMS 10G ............................. 38 14 TRATAMIENTO DE CAMPOS LOB ..................................................... 41 14.1 Carga de Archivos de Texto a campos CLOB -upload- .......................... 42 14.2 Carga de Archivo de Texto a campo CLOB y campo BLOB................... 44 14.3 DESCARGA y VISUALIZACION de campos CLOB .................................. 46 14.4 CARGA de cualquier tipo de Archivo a campos BLOB -upload- ........... 49 14.5 DESCARGA y VISUALIZACION de campos BLOB .................................. 51 14.6 CARGA DE BLOB DESDE URL................................................................. 53 15 CREACIÓN DE TABLA ORACLE CON CAMPOS BLOB.................... 60 16 ACCESO A ESTACIÓN DE ESCANER................................................ 61 17 ENVÍO DE CORREO DESDE FORMS.................................................. 62 17.1 Envío de correo desde Forms v4.5 (Unix) ............................................... 62 17.2 Envío de correo desde Forms6i -sin archivos adjuntos-........................ 63 17.3 Envío de correo desde Forms 6i -con archivos adjuntos....................... 64 18 Empleo de Frames en Aplicaciones Forms....................................... 67 19 UTILIZACIÓN DE FRAME OCULTO EN PÁGINA HTML CON FRAMES VERTICALES................................................................................................... 70 20 EJECUCIÓN DE INFORMES CRYSTAL REPORTS............................ 72 20.1 Obtener el token de business Objects..................................................... 72 20.2 Ejecución de Informe Crystal Report ....................................................... 72 Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 3 Nombre del manual TODO SOBRE FORMS 1OG 2 FICHERO INI GENERAL El fichero ini de aplicaciones en Forms 10g contiene las siguientes opciones: [General] BaseDatos=icm21_dexxxxx ; *** Tipo de Ejecución, posibles valores: -Web -Windows TipoEjecucion=Web ; *** Variable ejemplo para cargar en cuadro de información en menú inicial Entorno=Consejería de xxxxxxxx [Ayudas HTML] ; *** Ubicación de las páginas html de ayuda WebAyuda=http://icmaplicd01/xxxx/Forms/ [ReportBuilder] ; *** Parámetros válidos solamente para Reports bajo TipoEjecucion=Web Report_cache=d:\icm\web\web_reps\ Report_mapping=http://NTICMAPL11/web_reps/ Cola1=REPLIGERAD01 ;Cola2=REPMEDIANAD01 ; *** Para realizar impresión directa de Pdf's desde el módulo LIS_REP.fmx Impresion_pdf=http://nticmapl11.icm.es/impresionpdf/cgi-bin/ImpresionPDF.exe [GLIS] ; *** Parámetros válidos solamente para la ejecución del GLIS GlisHost=nticmdes01 GlisDir=d:\icm\web\web_reps\ GlisCola=NORMAL GlisMapping=http://nticmdes01/web_reps/ GlisExe=d:\icm\oas\general\etc\GlisBatchListado.exe GlisExe_Cubo=d:\icm\oas\general\etc\GlisBatchCubo.exe GlisExe_Sql=d:\icm\oas\general\etc\GlisBatchSql.exe GlisTemp=d:\temp\ GlisAyuda=http://nticmdes01/Glis_Ayuda/Forms/ [UPLOAD] ; *** Parámetros válidos solamente para le ejecución del Servlet Upload Upload_Exe= http://icmweb01.icm.es/util/upload/servlet/Servidor [DOCX] ; *** Parámetros válidos solamente para la ejecución de Fusión de documentos DocxHost=nticmdes01 DocxDir=d:\icm\web\web_reps\ DocxCola=NORMAL DocxMapping=http://nticmdes01/web_reps/ DocxExe=d:\icm\oas\general\etc\docx.exe Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 4 Nombre del manual TODO SOBRE FORMS 1OG DocxTemp=d:\temp\ [BUSINESS OBJECTS] ;*** Parámetros válidos solamente para obtener token de B.O bo_usuario=EJPL_Usu bo_clave=C7FFB972B34AB66E2C45124586507E4F 3 INFRAESTRUCTURA PARA DESARROLLOS EN ICM BAJO FORMS 10G La ubicación donde podemos encontrar todos los componentes que a continuación se detallan para su posterior localización es la siguiente: - \\nwicmofi01\Vol2\Formsv10g (para las empresas que van a realizar desarrollos para ICM se les faciltará un CDROM con idéntico contenido y con posteriores entregas en caso de actualizaciones posteriores) Por otro lado documentación y ejemplos se encuentran accesibles en la siguiente URL: http://icmweb01.icm.es/soporte/entornos_desarrollo.htm 3.1 Sentencias DDL No se podrán utilizar sentencias SQL- DDL desde el código. 3.2 Estandar General de Fuentes y Colores Normas a nivel General: Las propiedades de los Objetos en Forms relativas a los textos que se visualizan como pueden ser entre ellas (Nombre, Tamaño, Grosor, estilo, espaciado, color,..) deben ser: <No especificado> . Esto se consigue posicionandose en la Propiedad y pulsar el botón heredar . Ésta operación aplica los valores por defecto que normalmente dáran como resultado textos en color negro y color de fondo de objetos en blanco, si no es así se debe cambiar a éstos valores. Para los Tipos de Gráfico tipo Marco (Rectángulo con Texto) también se aplica ésta Norma excepto en las siguientes propiedades: Nombre de Fuente de Título del Marco : MS Sans Serif Tamaño de Fuente de Título de Marco : 9 En los Tipos de Gráfico como (Rectángulo, Marco,..) el bisel debe ser ‘Sin Relieve’ y como Color de Fondo ‘Ningún Relleno’. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 5 Nombre del manual TODO SOBRE FORMS 1OG Los Colores de Fondo de las ventanas ,Lienzos y botones deberán llevar el valor <No especificado> teniendo en cuenta que al realizar ésta operación nos aplica un Color de fondo por defecto que normalmente es el Gris, si nos aplica otro color por defecto lo cambiaremos a Gris Se puede aplicar en los Tipos de Objeto ‘Elemento Mostrado’ (Display Item) el atributo visual VIS_ATR_CAMPO_DISP siempre y cuando se visualicen en bloques con 1 solo registro de vsiualización En los bloques multiregistro para resaltar el registro sobre el que estamos posicionados durante la navegación se consigue aplicando el atributo visual REGISTRO_CURRENT (disponible en las plantillas) sobre la propiedad CURRENT_RECORD_ATTRIBUTE del bloque. Los botones Icónicos como norma general tienen una dimensión de 18x18 En la configuración del Forms Server hay que indicar que se va a trabajar con unas dimensiones del AppletViewer del modo siguiente, en los parámetros del fichero formsweb.cfg : widht=800 height=600 3.3 Documentación Además de la documentación específica de los diferentes unidades de programa, triggers, objetos, .. La Documentación a nivel general de la Pantalla (que función realiza el Form, a que tablas accede, en qué Modo (lectura, escritura), ….) así como Comentarios y Observaciones se indicará en la Propiedad Comentarios a nivel de Form 3.4 Nomenclatura estandar de Directorios y Ficheros Los Directorios deben ir en Minúscula El Nombre de Fichero debe ir en Mayúscula y la extensión en Minúscula 3.5 Librería de Objetos - ICM_OBJ, librería de Objetos que contiene los objetos comunes que componen los distintos módulos genéricos o plantillas a partir de las cuales iniciaremos nuestros programas. Esta librería ha de encontrarse almacenada en una ubicación que sea accesible en todo momento a través del contenido de la variable FORMS90_PATH, de este modo los módulos serán cargados correctamente a la hora de ser abiertos desde FormBuilder. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 6 Nombre del manual TODO SOBRE FORMS 1OG Contiene entre otros: - Grupo de objetos GRP_FORM_BASE compuesto de Trigger de carácter general que realizan los distintos controles de activación de perfiles, control de errores etc. ( Trigger When-new-form-instance, On-message, On-error, Canvas y Windows) Este grupo de objetos será referenciado por la plantilla FORM_BASE que se detalla en otro punto dentro de este documento. - Grupo de objetos GRP_APL_BASE compuesto de Trigger de carácter general para la interceptación de conexión a Oracle, perfiles para opciones de menú etc. (Trigger On-Log, When-new-form-instance, bloques, campos, Canvas y Windows) Este grupo de objetos será referenciado por la plantilla FORM_APL que se detalla en otro punto dentro de este documento. - Atributos visuales genéricos para campos de entrada, prompt, campos de display y de opciones de menú. - Alarma de carácter general. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 7 Nombre del manual TODO SOBRE FORMS 1OG NOTA: Están Prohibidas la utiización de referencias de objetos de un Form a otro Form, cuando se nececsiten realizar referencias a objetos se utilizará una librería de objteos (olb) 3.6 Librería de PL/SQL - ICM_PLL, librería de PL/SQL que contiene procedimientos de carácter general. Contiene entre otros: - APLICAR_PERFIL, para habilitar/deshabilitar objetos dentro de un form en función del perfil del usuario de entrada a la aplicación. - GENERAR_MENU, iden. a nivel de opciones del menú activo para la aplicación. - CIFRA, para realizar la encriptación de la password del usuario de entrada. - LEER_FICH_INI, utilidad para leer claves incluidas en el ficheros de .ini para la aplicación - y otras de carácter general. Es necesario a la hora de desarrollar un nuevo proyecto, lo primero, fijar la variable de entorno del regedit: \HKEY_LOCAL_MACHINE\Software\Oracle FORMS90_PATH a la carpeta donde se encuentre ubicada dicha librería ya que al abrir cualquiera de los módulos que contengan referencias a la misma nos obligará a que esté localizada, bien en el directorio en donde vamos a desarrollar nuestra aplicación, bien en la carpeta de red donde se encuentran los archivos generales de infraestructura, opción esta última la más aconsejada ya que así no nos tendremos que ocupar de actualizar los cambios que se realicen sobre la misma. (La correcta localización de esta librería será el primer paso que hagamos antes de crearnos alguno de los siguientes forms desde plantilla) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 8 Nombre del manual TODO SOBRE FORMS 1OG NOTA: Hay que tener encuenta que la librería ICM_PLL ya tiene incorporada la librería F6_PROCS_SIS.pll . Por lo tanto al atachar a nuestro form la librería ICM_PLL automáticamente tendremos también la librería F6_PROCS_SIS.pll . Posteriormente no se debe atachar la librería F6_PROCS_SIS.pll No deben atacharse las librerías generales a las Librerías de Aplicación . 3.7 Templates (plantillas) a partir de Librerías de Objetos Se han creado una serie de módulos genéricos o plantillas los cuales ya contienen objetos referenciados a la librería de objetos ICM_OBJ, también llevan incorporadas referencias a la librería de PL/SQL ICM_PLL (localizada en disco). Estos módulos se encuentran disponibles en la carpeta general de infraestructura y son los siguientes: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 9 Nombre del manual TODO SOBRE FORMS 1OG 3.7.1 MENU BASE Se utilizará para la creación del menú inicial de la aplicación. Contiene: - Unas opciones de menú de prueba simulando una llamada a un programa como estándar de llamada, vía CALL_FORM(‘XXX’,NO_HIDE, NO_REPLACE); - Incorporación de opciones de ayuda con acceso dinámico a páginas HTML - Opción de abandono de aplicación - Código de ejecución inicial ‘Startup Code’ para controlar la ejecución de las llamadas a programas (para evitar el actual bug de la actual versión cuando ejecutamos más de un Form a la vez desde el menú y se nos cuelga al realizar un acceso a base de datos). - Incorporación de la librería de utilidades generales ‘ICM_PLL.pll’ Este menu a la hora de salvarlo se realizará con la nomenclatura : (Por ejem: PRY1_MENU.mmb) ’nombre_de_aplicación’_MENU.mmb Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 10 Nombre del manual TODO SOBRE FORMS 1OG 3.7.2 APL_BASE Para la creación del form de entrada a la aplicación, en este form lo primero que se ha de hacer es modificar el Trigger When-New-Form-Instance personalizándolo para la nueva aplicación, se modificará: :GLOBAL.COD_APLICACION := 'XXXX'; -- con el valor de nuestra aplicación :GLOBAL.FICH_INI := 'XXXX.ini'; -- con el nombre del fich. de ini de la aplicación. Igualmente se modificará el nombre de menú asociado indicando el menú anteriormente generado: ‘nombre_de_aplicacion’_MENU Contiene los siguientes puntos de interés: - Se intercepta la conexión inicial a Oracle (ON-LOGON) para posteriormente realizar por programa el control de dicha conexión. - Lectura del fichero de .ini para la aplicación especificando entre otros datos la base de datos a la cual realizaremos la conexión. - Actualización de opciones de menú según el perfil del usuario de entrada (PROC. GENERAR_MENU). - Incorporación de la librería de utilidades generales ‘ICM_PLL.pll’ - Muchos de los objetos aquí creados se encuentran referenciados mediante un grupo de objetos de la librería de Objetos general ‘ICM_OBJ.olb’ Este módulo al salvarlo se realizará con la siguiente nomenclatura: ’nombre_de_aplicacion’_APL.fmb (Por ejem: PRY1_APL.fmb) - Los siguientes objetos no pueden cambiarse: Trigger ON-LOGON Procdure PROC_BACEPTAR Si fuera necesario introducir código adicional en la conexión se deberá meter en el Trigger WHEN-BUTTON-PRESSED del botón BACEPTAR - En el trigger WHEN-NEW-FORM-INSTANCE no debe tocarse el Bloque de código relativo a la conexión Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 11 Nombre del manual TODO SOBRE FORMS 1OG NOTA: - Se permite realizar conexiones con distintas aplicaciones – incluso entre distintas bases de datos- sin necesidad de autentificación por parte del usuario, no se mostraría la ventana inicial de autentificación. Esta funcionalidad requiere, por supuesto, que el usuario y la password de acceso para conectar con otra aplicación sea la misma con la que se autentificó inicialmente el usuario. La llamada a otra/s aplicaciones se realiza del siguiente modo: NEW_FORM(‘XXXX_APL’,FULL_ROLLBACK); 3.7.3 FORM_BASE Para la creación del resto de programas de nuestra aplicación, contiene: -Procedimiento para realizar la actualización de objetos del programa en base al perfil del usuario de entrada a la aplicación (PROC. APLICAR_PERFIL) - Procedimiento para la interceptar los mensajes no controlados por aplicación y obtenerlos mediante una ventana de diálogo en lugar de mostrarlos en la linea de estado, muchas veces inapreciable. - Incorporación de la librería de utilidades generales ‘ICM_PLL.pll’ - Contiene alarma general, atributos visuales etc.referenciados mediante un grupo de objetos de la librería de objetos generales ‘ICM_OBJ.olb’ Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 12 Nombre del manual TODO SOBRE FORMS 1OG Inicialmente no se ha incluido ningún bloque en el módulo de modo que para poder ejecutarlo lo primero que se requiere es la creación del al menos un bloque y un campo. Al guardar el modulo se realizará con la siguiente nomenclatura: ‘nombre_de_aplicacion’ + ‘letra_identif.’ + ‘cadena_numerica_dentro_de_la_aplicacion’.fmb (Por ejem: PRY1_M001.fmb) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 13 Nombre del manual TODO SOBRE FORMS 1OG 3.7.4 F60_MANT1 Se utilizará como plantilla para la creación de forms de mantenimiento de catálogos. Dentro del propio Form plantilla en la propiedad ‘Comentario’ se pueden consultar los pasos a seguir para obtener una form personalizado para la tabla a mantener. Pasos a seguir para la creación del Form de Mantenimiento 1: 1.- Crear un nuevo bloque asociado a la tabla a mantener 2.- Copiar los triggers del bloque 'BLOQUE_TRIGGERS_DE_TABLA' al nuevo bloque recien creado (posteriormente borrar el bloque 'BLOQUE_TRIGGERS_DE_TABLA'). 3.- En el Trigger WHEN-NEW-FORM-INSTANCE asignar el nombre del nuevo bloque a la variable: :BOPCION.BLOQUE_TABLA := 'NUEVO_BLOQUE'; 4.- Asociar a los campos del nuevo bloque el menu desplegable 'MENU_MANT' 5.- Incluir los filtros oportunos, si se necesitan, en pantalla y la programación de los mismos en el procedimiento 'PROC_FILTRO'. 6.- Incluir las validaciones necesarias para la actualización de los registros del nuevo bloque en el procedimiento 'PROC_VALIDACIONES'. Este form en concreto realiza el mantenimiento basandose en una única ventana, es decir mantenemos los datos en sobre el mismo bloque que se presenta para la consulta inicial. Contiene todos los controles a nivel de perfiles e incorporación de pll’s al igual que el form anterior Form_Base.fmb. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 14 Nombre del manual TODO SOBRE FORMS 1OG 3.7.5 F60_MANT2 Se utilizará como plantilla para la creación de forms de mantenimiento de catálogos. Dentro del propio Form plantilla en la propiedad ‘Comentario’ se pueden consultar los pasos a seguir para obtener una form personalizado para la tabla a mantener. Pasos a seguir para la creación del Form de Mantenimiento 2: 1.- Crear dos bloques asociados a la misma tabla a mantener: - Un nuevo bloque a visualizar en estilo 'multiregistro' - Otro bloque asociado a la misma tabla a visualizar en 'registro único'. 2.- Copiar los triggers de los bloques: 'BLOQUE_TRIGGERS_TABLA1'-'BLOQUE_TRIGGERS_TABLA2' a los bloques creados anteriormente 'multiregistro' y 'registro único' respectivamente (posteriormente borrar estos bloques). Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 15 Nombre del manual TODO SOBRE FORMS 1OG 3.- En el Trigger WHEN-NEW-FORM-INSTANCE asignar el nombre de los nuevos bloques a las variables: :BOPCION.BLOQUE_TABLA1 := 'NOMBRE_DEL_NUEVO_BLOQUE_MULTIREGISTRO'; :BOPCION.BLOQUE_TABLA2 := 'NOMBRE_DEL_NUEVO_BLOQUE_UNICO_REGISTRO'; 4.- Asociar a los campos del bloque multiregistro el menu desplegable 'MENU_MANT' ya existente en el modelo. 5.- Fijar en el bloque 'registro único', en el Trigger Pre-Query la igualdad de claves para realizar el acceso adecuado entre ambos bloques. 6.- Incluir los filtros oportunos, si se necesitan, en pantalla y la programación de los mismos en el procedimiento 'PROC_FILTRO'. 7.- Incluir las validaciones necesarias para la actualización de los registros del nuevo bloque en el procedimiento 'PROC_VALIDACIONES'. Es similar al form anterior tan solo que para el mantenimiento del catálogo se tienen dos ventanas en lugar de una como el anterior, de manera que cuando entramos por las opciones de actualización de información nos aparecerá una nueva ventana mostrándonos tan sólo la información del registro a procesar y cuando aceptamos o cancelamos los cambios regresamos a la ventana principal. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 16 Nombre del manual TODO SOBRE FORMS 1OG Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 17 Nombre del manual TODO SOBRE FORMS 1OG 3.8 Plantilla Lista de Valores Se han realizado pruebas con listas de valores(LOV) accediendo a tablas con un volumen importante de registros obteniendose tiempos de respuesta bastante lentos. Cuando ejecutamos una LOV lo que internamente realiza es una bajada de la totalidad de los registros que obtiene la consulta al cliente con el consecuente coste de la acción, es decir si accedemos a una tabla, por ejemplo, la de Interesados con un volumen aproximado de 100.000 registros la operación se lleva un tiempo más que considerable (aproximadamente tarda el minuto). Por lo tanto para este tipo de LOV sobre tablas de un volumen superior a los 2.000 registros se aconseja emplear un form para este fin tomando como base del mismo un Form (plantilla) que se ha realizado simulando el aspecto de la LOV estándar (de Web). Este form actúa con la lista de valores con un bloque asociado a tabla y la gestión del array de registros que forms nos ofrece, en este caso al realizar una búsqueda (ExecuteQuery) tan solo se bajará al cliente un array de registros igual al número de registros definidos para el multiregistro del bloque y posteriormente según bajamos por el grid nos va recuperando bloque a bloque de información pero nunca se baja la totalidad del query de una vez. El template se encuentra disponible en la carpeta: \plantillas con el siguiente nombre: LOV_GEN.fmb dentro de la infraestructura disponible para Forms. Modificaciones a realizar para personalizar el form ‘Lista de Valores’ : -En el objeto Ventana modificar la propiedad ‘Titulo’ indicando el correspondiente valor. -En el bloque ‘BTABLA’ modificar la propiedad ‘Nombre del Origen de datos de Consulta’ indicando la tabla de la cual deseamos obtener la información. -Dentro de los elementos del bloque ‘BTABLA’ acceder a la propiedad ‘Base de Datos - Nombre de Columna’ e indicar el nombre del campo correspondiente a visualizar (debe de tener el mismo nombre que el nombre del campo definido en base de datos para la tabla anteriormente seleccionada). Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 18 Nombre del manual TODO SOBRE FORMS 1OG Aquí se permite poner o el nombre del campo o bien una expresión compuesta por varios campos de la tabla, por ejemplo para obtener el Código de Expte. formateado: cddeptno || '-' || cdtexp || '-' ||LPAD(cdnexp,5,'0') ||'.'||cddigito||'/'||cdaexp -También hay que modificar la etiqueta que queremos que aparezca como cabeceras de campos de la lista para ello modificamos la propiedad ‘Prompt’ de los elementos del Bloque. - Y por último cambiar las propiedades de los elementos del bloque ‘BTABLA’ en cuanto al tamaño de y ancho de visualización de los mismos. Ejemplo de llamada a un Form tipo ‘Lista de valores’ : Call ( 'LOV_INTE' , NO_HIDE , NO_REPLACE ) ; --- Si se obtiene información de la lista de valores la siguiente global contendrá ‘S’ -IF :GLOBAL.LOV_RESULT = 'S' THEN -- se obtiene el valor de la lista sobre un campo de nuestro form :B10.INTERESADO := :GLOBAL.LOV_V1; END IF; 4 EMPLEO DE LAS PLANTILLAS La utilización de cualquiera de estas plantillas para los nuevos desarrollos se realizará del siguiente modo: - seleccionar la opción del menú principal: Nuevo Form con Plantilla Acceso a módulo de fichero navegaremos a nivel de carpetas hasta posicionarnos en la ubicación donde se encuentran los forms de infraestructura y seleccionaremos el módulo del que se desea partir. Por el hecho de que estas plantillas contienen referencias a módulos, cualquier modificación que se realice sobre ellos quedará reflejada en el momento de abrir de nuevo el módulo -en caso de modificaciones en la librería de objetos lCM_OBJ- y tan sólo tendremos que compilar y automáticamente en el caso de modificación de cualquier procedimiento/función de la librería PL/SQL ICM_PLL. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 19 Nombre del manual TODO SOBRE FORMS 1OG 4.1 Form de Gestión de Perfiles - F60_USU Este es un módulo estándar que permite realizar la gestión de perfiles para aplicaciones desarrolladas en Developer v10g y que se puede incorporar a cualquier aplicación simplemente con la implementación de una opción de menú dedicada a tal efecto que realice una llamada al form: - F60_USU En el siguiente menú de ejemplo: Opcion1 Opcion2 Opcion3 Acceso Autorizaciones la llamada CALL al form F60_USU se realizará desde el punto de menú ‘Autorizaciones’. Cuando el módulo se incorpora a una aplicación con el método anteriormente indicado tan solo se permite la modificación de perfiles para la aplicación en curso no pudiendo modificar perfiles de otras aplicaciones. La aplicación con la que se actuará será la definida en la variable global ‘GLOBAL.COD_APLICACION’ definida en el form de identificación de entrada a la aplicación ‘APL_XXX’. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 20 Nombre del manual TODO SOBRE FORMS 1OG Ésta pantalla va a permitir : Crear Grupos (perfiles) de Aplicación Asignar y desasignar Usuarios a los Grupos Crear Opciones de Menú en las que se indicará: Cod. Menú: el codigo de item menú Desc. Menú: Descripción de la Opción de Menú Tipo de Acción: Visible, Oculto y Desactivado Asignar Opciones de Menú a los Perfiles Dar de Alta Programas: Dar de alta un form. Esto nos permitirá posteriormente crear acciones sobre éstos programas (forms). Crear Acciones de Programa. Las acciones de programa son aquellos objetos de un form susceptibles de ser modificados sus propiedades de visibilidad, activacion,… Antes de crear una acción de Programa se debe seleccionar siempre el programa (form) al que va a pertener la acción (objeto). También cuando se desea consultar las acciones de los perfiles se debe seleccionar siempre el programa (form) Para crear una acción se indicará: Cod. Acción: el objeto que se desea restringir por ejemplo: BLOQUE.BT_ALTA Desc. Acción: Descripción del objeto Tipo de Acción: Desactivado Oculto No modificable No permitida la inserción No permitida la consulta No modificable – No permitida la inserción Entre los tipos de objeto que se pueden restringir están: Items , botones, radiogroup, pestañas,… Por defecto todos los objetos de la Aplicación (menús, Acciones) están accesibles. Por lo tanto, lo habitual va a ser añadir restricciones de Opciones de menú y Acciones. 4.2 Form Calendario Se ha creado un form que actua como calendario contemplando los festivos según la tabla catálogo CATA_FESTIVOS. La llamada a este se realiza a partir del procedimiento FCALENDARIO, incluido en la librería general de PL/SQL ICM_PLL. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 21 Nombre del manual TODO SOBRE FORMS 1OG Los parámetros de llamada son: -FECHA_CAL ..: Devuelve la fecha seleccionada del calendario -FIESTA_CAL..: Devuelve uno de los siguientes valores: 'L' - Día laboral 'F' - Día festivo 'D' - Domingo -DIA_SEM_CAL.: Devuelve el número del día de la semana (1-Lunes ...7-Domingo) -CAL_X ......: Coordenada x de visualización de la ventana del form Calendario -CAL_Y ......: Coordenana y de visualización de la ventana del form Calendario Un ejemplo de llamada a este sería: FCALENDARIO(:B10.FECHA,:B10.FIESTA,:B10.DIA_SEM, GET_ITEM_PROPERTY('FECHA',X_POS), GET_ITEM_PROPERTY('FECHA',Y_POS) ); Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 22 Nombre del manual TODO SOBRE FORMS 1OG 5 ADAPTACIÓN DE PROCEDIMIENTOO - MENSAJE – DE LIBRERÍA PL/SQL DE FORMS 10G - ICM_PLL.pll Solamente para la migración de los forms (v3) de procedimientos de carácter general se ha producido la situación de encontrarnos con dos procedimientos que se llaman de igual nombre contenidos en dos PLL’s distintas ambas de carácter general. - MENSAJE perteneciente a F6_PROCS_SIS.pll - MENSAJE perteneciente a ICM_PLL.pll el fin de ambos procedimientos es el mismo, mostrar un mensaje por pantalla, pero lo hacen de forma distinta: - el primero migrado de Forms v3 muestra un mensaje mediante la ejecución de la built-in ‘message’ por lo tanto este aparecerá en la linea de estatus de pantalla y además el texto a mostrar lo obtiene de base de datos en función de los parámetros recibidos en la llamada. La llamada actual es del tipo: MENSAJE(‘I’,9999); - el segundo también muestra un mensaje en pantalla pero este aparecerá contenido en una ventana (el modo habitual para cualquier mensaje de Windows) sin embargo no obtiene valor alguno de la base de datos simplemente muestra en la ventana el texto que se la pasa por parámetro. La llamada actual es del tipo: MENSAJE(‘Texto’); Entonces para evitar tener dos procedimientos con idéntica nomenclatura y tomar de cada uno de estos su máxima funcionalidad se han realizado los siguientes cambios: F6_PROCS_SIS.MENSAJE cambia de nombre y pasa a llamarse F6_PROCS_SIS.MENSAJE_BD y además pasa a ser una función en lugar de un procedimiento con lo cual se obtiene el texto del mensaje de base de datos (a partir de ahora esta función no se llamará directamente, será llamada desde ICM_PLL.MENSAJE) ICM_PLL.MENSAJE cambia el interface de llamada, pero no hace falta adaptación alguna en los programas que actualmente utilizan dicho procedimiento, añadiendole un nuevo parámetro y queda del siguiente modo: MENSAJE(TEXTO, [NUMERO] ); Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 23 Nombre del manual TODO SOBRE FORMS 1OG siendo este último parámetro opcional con lo cual con el cambio obtenemos la siguiente funcionalidad: - podemos utilizar la procedure como se utilizaba hasta ahora, para mostrar cualquier texto: MENSAJE(‘Texto a mostrar’); - utilizar la procedure para obtener un mensaje a partir de la tabla de mensajes de base de datos (ya que internamente la procedure detecta por el número de parámetros recibidos que en este caso ha de realizar una llamada a PROCS_SIS.MENSAJE_BD para obtener el texto final a mostrar): MENSAJE(‘I’,9999); - todos los procedimientos migrados de Forms v3 a PLL’s a la hora de mostrar mensajes no utilizarán la antigua procedure MENSAJE utilizarán esta nueva de ICM_PLL y por lo tanto los textos se mostrarán siempre bajo una ventana de mensaje utilizando el interface de siempre. MENSAJE(‘I’,9999); Además aprovechando que se modificaban las librerías se borran de ICM_PLL.pll los siguientes procedimientos: - GLOBALES_MONEDA - N2EDITAMONEDA - N2EDITANUM2 ya que actualmente están disponibles en la librería F6_PROCS_GENERAL. En la librería ICM_PLL.pll se encuentra disponible el procedimiento MENSAJE_I que proporciona la siguiente funcionalidad: MENSAJE_I Tiene la misma funcionalidad que MENSAJE y además permite escoger el Estilo(Icono) de Alerta que se va a visualizar indicandole el estilo en el parámetro Tipo_Alerta Parámetros del Procedimiento MENSAJE_I: TEXTO :Texto a visualizar en la Alerta NUM_ADAPT :Nº del Mensaje de Base de Datos correspondiente a la tabla Mensajes (se incluye como compatibilidad y es opcional) a visualizar en la Alerta TIPO_ALERTA :Valores Permitidos (1,2,3), Valor por Defecto 1 1Estilo: Parar Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 24 Nombre del manual TODO SOBRE FORMS 1OG 23- Estilo: Nota Estilo: Precaución EJEMPLOS: Las siguientes llamadas al Procedimiento generarán una visualización de la Alerta como sigue: MENSAJE_I('Mensaje visualizado con Estilo de Alerta PARAR'); MENSAJE_I('Mensaje visualizado con Estilo de Alerta PARAR', 1); MENSAJE_I('Mensaje visualizado con Estilo de Alerta NOTA', 2); MENSAJE_I('Mensaje visualizado con Estilo de Alerta PRECAUCIÓN', 3); 6 CREACIÓN DE WEB PARA ALOJAR PÁGINA ESTÁTICA INICIAL DE LA APLICACIÓN Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 25 Nombre del manual TODO SOBRE FORMS 1OG La página estática inicial de la Aplicación contiene información ,descripción o presentación de la Aplicación y un enlace de ejecución de la Aplicación, se incluirá cuando sea necesaria. Si nuestra aplicación contiene una página estática inicial de aplicación: 6.1 Creación del web Se creará un web con FrontPage con la siguiente estructura: http://Host/nombre_del_modulo 6.2 Estructura del web que aloja la página estática inicial de la aplicación Colgando directamente del web estará la página estática html index.htm Si lleva imágenes se creará una carpeta images para contenerlas http://host/modulo ---------------------- index.htm /images------------- imágenes que pertenecen a index.htm 7 CREACIÓN DE WEB PARA AYUDA Si nuestra aplicación incorpora ayuda : 7.1 Creación del web Se creará un web con FrontPage con la siguiente estructura: http://Host/Nombre_del_Modulo No es necesario crear el web si ya existe un web que contiene la página estática inicial de la aplicación . Se utilizará el ya existente 7.2 Estructura de ayuda de la aplicación en el web Debajo del web se crea una carpeta ayuda que contendrá las páginas htm Debajo de la carpeta ayuda una subcarpeta images, que contiene todas las imágenes de la ayuda http://Host/Modulo /ayuda/ ------------- páginas htm de ayuda /ayuda/images--- imágenes que pertenecen a las páginas htm de ayuda NOTA: Independientemente del tipo de ejecución la ayuda se realizará en páginas html y se mostrará con el navegador que tenga el puesto definido por defecto. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 26 Nombre del manual TODO SOBRE FORMS 1OG 8 VISUALIZACIÓN DE AYUDA EN DEVELOPER 10G Se ha modificado la librería general de Procedimientos/Funciones ‘ICM_PLL.pll’ para implementar en el procedimiento de visualización de ayudas ‘PROC_AYUDA’ la posibilidad de mostrar estas tanto ejecutando nuestras aplicaciones desde un entorno Web como en ejecuciones en Cliente/Servidor Windows (este caso solamente para versión Forms6i, en 10g ya no existe cliente/servidor). Independientemente del tipo de ejecución la ayuda se realizará en páginas html y se mostrará con el navegador que tenga el puesto definido por defecto. Para implementar el tipo de ejecución en que nos encontramos se ha de incluir en el fichero ‘.ini’ de la aplicación el siguiente parámetro: TipoEjecucion=XXXX Pudiendo tomar los siguientes: - Web - para ejecuciones en OAS bajo Web - Windows - para ejecuciones en Cliente/Servidor Windows Para ubicar el Web en el que se van a buscar las páginas htm de ayuda para nuestra aplicación se utilizará el siguiente parámetro en el fichero ‘.ini’ de la aplicación: ; por ejem. WebAyuda=http://host/Modulo/ Para poder realizar la visualización de la ayuda en ejecuciones tipo Cliente/Servidor Windows se ha de tener el programa lanzador de las mismas: -ShowHtml.exe en el directorio en donde se encuentren el resto de los forms de la aplicación. El procedimiento de llamada para las ayudas ‘PROC_AYUDA’ no ha cambiado la Interface, tan solo a nivel de código interno, aprovecho para recordar la llamada al mismo: PROC_AYUDA( XXXXX IN VARCHAR2) ; El parámetro de entrada puede tener los siguientes valores: - NULL, la ayuda a mostrar será la del form activo en ese momento - Nombre_de_Form, se visualizará la ayuda del form indicado en el parámetro. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 27 Nombre del manual TODO SOBRE FORMS 1OG Os recuerdo que para poder recoger el código actualizado de la librería ‘ICM_PLL.pll’ tenéis la última versión en la carpeta: \Pll donde se encuentran el resto de forms de infraestructura de Forms. NOTA: Independientemente del tipo de ejecución la ayuda se realizará en páginas html y se mostrará con el navegador que tenga el puesto definido por defecto. 9 TRATAMIENTO DE IMÁGENES EN DEVELOPER 10G Tratamiento de Iconos - Gif mediante el programa de diseño de imágenes Microangelo Inicialmente y como recordatorio simplemente comentaros que en aplicaciones forms en tipo de ejecución Cliente/Servidor Windows las imágenes asociadas a los botones han de ser ficheros de iconos (.ico) y sin embargo cuando ejecutamos nuestras aplicaciones en modo Web las imágenes asociadas a los botones han de ser ficheros Gif (.gif). Por lo tanto se necesita una herramienta de fácil manejo que permita diseñar este tipo de imágenes y establecer de modo rápido el cambio entre ambos formatos (en versión v10g al no existir ejecución Cliente/Servidor solamente necesitamos gif). Con el empleo del programa ‘Microangelo’ se permiten crear nuevos iconos y una vez creados estos pasar a formato Gif realizando los siguientes pasos: Creación de un nuevo icono - accedemos mediante el menú: File - New y seleccionamos ‘Icon’ como en la figura siguiente: Se aconseja como estandar de Developer v10g la definición de los botones con un ancho-alto de 18X18 por lo tanto a la hora de crear el icono no se han de superar estas coordendas (aunque las coordenadas que nos aparezcan sean de 32X32) para no perder imagen a la hora de cargar esta sobre el botón. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 28 Nombre del manual TODO SOBRE FORMS 1OG Al grabar el fichero creado se recuerda que el nombre ha de contener el prefijo de la aplicación y no superar los 8 caract. ( por ejem. usu_xxxx.ico) Creación de ficheros Gif (.gif) a partir de ficheros de Iconos (.ico) - en una ventana abrimos el fichero de icono y seleccionamos el area de imagen ( 18X18 de máximo) para ello con la porción seleccionada realizaremos un ‘Copy’ de la misma. - abrimos una nueva ventana (File - New Windows) en la que definimos una imagen con unos valores predeterminados en cuanto a color y tamaño, para ello accedemos a: Tools - New Image Format y nos aparece la siguiente ventana en la que indicaremos los valores que a continuación se han fijado: - automáticamente la herramienta nos genera una pantalla con las dimensiones establecidas dispuesta a alojar la nueva imagen, para ello y sobre esta nueva ventana hacemos ‘Paste’ de la selección anterior. Se aconseja ajustar la imagen al borde izquierdo de la ventana ya que al cargar esta en el botón en la ejecución en Web automáticamente nos deja un pequeño margen vertical en la izquierda. Este margen automático hace que perdamos las 2 últimas coordenadas a nivel de columna del fichero por lo tanto se aconseja que sobre estas no haya porción de imagen alguna. En la figura siguiente se muestra en gris la porción de imagen que se mostrará sobre el botón y en blanco la que nunca se visualizará: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 29 Nombre del manual TODO SOBRE FORMS 1OG - una vez realizadas estas consideraciones se pasará a salvar, en este momento se define el formato de la nueva imagen que será del tipo Gif. Se ha realizado la solicitud de adquisición del programa Microangelo hasta que lo que tengamos el que este interesado en la herramienta poneros en contacto con nosotros y os dejamos una versión de evaluación del mismo. Nota: a nivel de diseño con Forms se han encontrado casos en los que al asociar un icono a un botón lo alinea incorrectamente (alineamiento inferior) y por mucho que intentemos solucionarlo no se consigue dejar correctamente, en estos casos la solución que hemos observado es, y aunque parezca un poco Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 30 Nombre del manual TODO SOBRE FORMS 1OG estraño, renombrar simplemente el fichero .ico y asociando el nuevo fichero al botón lo alinea correctamente (Forms debe de heredar alguna propiedad de alineamiento del fichero que causó el problema inicialmente que por mucho que lo intentemos asociar a otro botón nos repite el alineaminento incorrecto). 10 EJECUCIÓN DE PROCESOS EN BATCH Para la ejecución de procesos en batch desde Forms6i bajo Web se ha implementando unos paquetes en el nucleo de Oracle mediante los cuales se permite realizar una petición de trabajo e inmediatamente se puede consultar el estado de la misma. Los siguientes procedimientos se utilizan para: -Petición de un proceso: - QUJB_PAQ_GENERAL.PETICION(Parametros) Parámetros: - Host:máquina donde va a correr el trabajo - Cola: cola que gestionará el trabajo -Shell: ejecutable a lanzar -Param: parámetros a pasar al ejecutable -Usuario: usuario que encarga el trabajo -Mensaje: (salida) mensaje de error en una petición errónea Devuelve: -el numero de petición (WPETI) que nos ha generado -en el caso de ERROR devuelve -1 -Ejecución del mismo: - QUJB_PAQ_GENERAL.EJECUCION(WPETI,WHOST) Parámetros: - Nº.Petición:que hemos obtenido en la función QUJB_PAQ_GENERAL.PETICION. -Host:- Host:máquina donde va a correr el trabajo Devuelve: -el el caso de ejecución correcta devuelve 0 . -en el caso de ERROR devuelve -1. -Consultar el estado de la petición QUJB_PAQ_GENERAL.ESTADO(WPETI) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 31 Nombre del manual TODO SOBRE FORMS 1OG Parámetros: -Nº.petición: num. de petición que vamos a comprobar. Devuelve: Uno de los siguientes literales: - “En cola” - “En ejecución” - “Terminada” - “Petición desconocida” Ejemplo de cómo Realizar Una Petición al Servicio Pipe_Batch 1.- Realizar Petición PROCEDURE EJECUTA_BATCH IS WPARAM VARCHAR2(250); WMENS VARCHAR2(250); WHOST VARCHAR2(25); WCOLA VARCHAR2(25); WSHELL VARCHAR2(99); WUSER VARCHAR2(12); WLIN1 VARCHAR2(50); WLIN2 VARCHAR2(50); WLIN3 VARCHAR2(50); timer_id Timer; un_segundo NUMBER(5) := 1000; BEGIN -- Extensión ".w2z" para el nuevo visor WordPerfect/Word (anterior extension ".wpz") :GLOBAL.FICH_DOC := to_char(sysdate,'YYYYMMDDHH24MISS')||'_'||:B20.CDDOCUM||'.w2z'; -- Se rellenan los parámetros de ejecución del ejecutable (b.d. del fich.ini) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 32 Nombre del manual TODO SOBRE FORMS 1OG WPARAM := 'bd='||USER||'/'||:GLOBAL.PASSWD||'@icm21_denivel2 operacion='||:B30.RG_OPC||' '|| 'codigo='||:B20.CDDOCUM||' '|| 'copias='||NVL(TO_CHAR(:B30.COPIAS),'1')||' '|| 'fichero='||LEER_FICH_INI(:GLOBAL.FICH_INI,'DocDir')||:GLOBAL.FICH_DOC; -- Parámetros requeridos para el lanzamiento del trabajo en PipeBatch WHOST := LEER_FICH_INI(:GLOBAL.FICH_INI,'DocHost');-- Host que ejecutará el trabajo WCOLA := LEER_FICH_INI(:GLOBAL.FICH_INI,'DocCola');-- Cola dedicada a este WSHELL := LEER_FICH_INI(:GLOBAl.FICH_INI,'DocExe'); -- Nombre del ejecutable a lanzar WUSER := USER; -- Usuario peticionario -- Se realiza la Petición :B00.WNUMPET := QUJB_PAQ_GENERAL.PETICION( WHOST, WCOLA, WSHELL, WPARAM, WUSER, WLIN1, WLIN2, WLIN3, WMENS); -- Control de la petición solicitada IF :B00.WNUMPET < 0 THEN MENSAJE('Error al realizar la petición de impresión del documento'); ELSE -- Si la petición es correcta es necesario realizar Commit -- (el Servicio PipeBatch es un proceso externo) COMMIT; -- Se realiza la Ejecución de la petición anterior IF QUJB_PAQ_GENERAL.EJECUCION(:B00.WNUMPET,WHOST) < 0 THEN MENSAJE('Error al ejecutar la petición QUJB_PAQ_GENERAL.MENSAJE'); END IF; END IF; -- Control de la existencia del Timer IF Not Id_Null(Find_Timer('MI_TIMER')) THEN Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 33 Nombre del manual TODO SOBRE FORMS 1OG Delete_Timer('MI_TIMER'); END IF; -- Creación del Timer para controlar cuando finaliza el programa ejecutado -- desde el Trigger "When-Timer-Expired" Timer_Id := CREATE_TIMER('MI_TIMER', un_segundo, REPEAT); END; 2.- Controlar el Estado de una Petición [Trigger When-Timer-Expired] DECLARE WESTAD VARCHAR2(25); WURL VARCHAR2(100); tm_id Timer; wmaxtime number(3) := 60; -- 1 minutos BORRAR_TIMER EXCEPTION; BEGIN --- El Timer se activa cada 1seg. Si se ejecuta mas de wmaxtime(60 veces) (60 * 1seg. = 1min.) -- automáticamente se desactivará el Timer -:b00.nm_veces := :b00.nm_veces + 1; IF UPPER( QUJB_PAQ_GENERAL.ESTADO(:B00.WNUMPET) ) = 'TERMINADA' THEN -- Se construye la URL a visualizar -- (DocMapping, definido en el ini invoca un VirtualPath donde se depositan los fich.de salida) WURL := LEER_FICH_INI(:GLOBAL.FICH_INI,'DocMapping')||:GLOBAL.FICH_DOC; -- Se invoca la URL WEB.SHOW_DOCUMENT(WURL,'_blank'); RAISE BORRAR_TIMER; END IF; --- El Timer bien finaliza por peticion 'TERMINADA' o por maxtime -IF :b00.nm_veces > wmaxtime THEN RAISE BORRAR_TIMER; Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 34 Nombre del manual TODO SOBRE FORMS 1OG END IF; EXCEPTION WHEN BORRAR_TIMER THEN Delete_Timer('MI_TIMER'); END; Ejemplo de fich. de configuración (Sección "Documentos") [Documentos] DocHost=nticmdesXX DocCola=NORMAL DocDir=D:\icm\web\web_reps\ DocMapping=http://nticmdes01/web_reps/ DocExe=d:\icm\oas\general\etc\ImpreOfi_Batch_New.exe Nota: Cuando el servicio PipeBatch ejecuta una petición le añade a la lista de parámetros propia del ejecutable los siguientes parámetros: Np = 99999 (Número de proceso) Lg = c:\temporal\ (Carpeta de Log.) (es decir cuando se lanze un ejecutable fuera del entorno de ejecución del servicio PipeBatch es necesario el añadirle estos dos parámetros al final) Pruebas en vuestra instalación (empresas externas) Para probar la ejecución de los paquetes QUJB.* es necesario insertar la información básica en los catálogos: QUJB_HOST QUJB_COLAS (‘NORMAL’,’URGENTE’) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 35 Nombre del manual TODO SOBRE FORMS 1OG 11 VISUALIZACIÓN DE TRABAJOS BATCH Haciendo una llamada a la pantalla general ICM_TRABAJOS, ésta nos mostrará información de todos los trabajos lanzados con el Pipe_Batch por el usuario conectado. La pantalla permite hacer búsquedas de trabajos filtrando los campos Consulta 1 y Consulta2 que contienen una breve descripción del Trabajo lanzado. Con el botón ver Detalle además de los campos que aparecen en la pantalla con la información de Petición, Fecha de Solicitud, Fecha de Lanzamiento, Estado, Consulta 1, Consulta 2, nos permite visualizar información adicional del trabajo seleccionado. El botón Ver Documento abre con el navegador el fichero indicado en el campo Documento (Éste campo se visualiza a través de la opción de menú Detalle citada anteriormente). El botón Borrar elimina el trabajo seleccionado de la tabla de Histórico y realiza el borrado del fichero asociado al trabajo siempre y cuando en el campo Documento esté inidicada la URL al fichero, Ejemplo de llamada: CALL_FORM(‘ICM_TRABAJOS’, NO_HIDE, NO_REPLACE);); Pantalla ICM_TRABAJOS: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 36 Nombre del manual TODO SOBRE FORMS 1OG 12 VISUALIZACIÓN DE TRABAJOS BATCH EN MÁQUINAS UNIX Haciendo una llamada a la pantalla general ICM_TRBUNIX, ésta nos mostrará información de los trabajos lanzados por el Usuario en máquina Unix. Ésta información se recoge de la tabla GAT_SEG_PETICION . La pantalla permite visualizar los trabajos lanzados en el día , los trabajos lanzados desde hace 7 días o todos los trabajos. Con el botón ver Detalle además de los campos que aparecen en la pantalla con la información de Petición, Fecha de Solicitud, Fecha de Lanzamiento, Fecha de Inicio, Fecha de Finalización y el Estado nos permite visualizar información adicional del trabajo seleccionado. Ejemplo de llamada: CALL_FORM(‘ICM_TRBUNIX’, NO_HIDE, NO_REPLACE);); Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 37 Nombre del manual TODO SOBRE FORMS 1OG Pantalla ICM_TRBUNIX: 13 FUSIÓN DE DOCUMENTOS DESDE FORMS 10G La Visualización de Fusión de Documentos consiste en la Fusión de una Plantilla Word o WordPerfect salvada en la base de datos con un fichero de datos. Desde forms se llama al programa delphi encargado de generar un fichero zip que contiene la plantilla, el fichero de datos y un fichero ini indicando la operación a realizar, una vez generado éste fichero zip, desde Forms se abre éste fichero cargandose automáticamente el visor Word_WordPerfect que realiza la fusión. La visualización de Fusión de Documentos consta de los siguientes Programas/Productos: 1. Visor Word_WordPerfect instalado en el Puesto Cliente Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 38 Nombre del manual 2. Programa Delphi: zip (con TODO SOBRE FORMS 1OG - genera una serie de ficheros dentro de un fichero extensión W2Z) 3. Programa Forms: - Realiza la llamada al programa delphi - Visualiza el Fichero (generado por el programa delphi) 1. Visor Word_WordPerfect instalado en el Puesto Cliente La instalación se puede realizar a través de la intranet en la siguiente URL: http://nticmdes01/Forms6/software_base/visor_de_wordperfect_word.htm o ejecutando el fichero de instalación visorwpword.exe . El visor se carga automáticamente al abrir cualquier documento con la extensión W2Z. Se encarga de realizar la fusión de la plantilla con el fichero de datos dbf y realiza la operación indicada en elfichero ini (Visualización o Impresión del Documento, Nº de copias a imprimir) 2. Programa Delphi Recibe del programa forms una cadena con los siguientes parámetros: bd= Usuario, Password y Cadena de Conexión con el formato Usuario/Password@cadena_conexion operacion= Operación a realizar, puede ser Visualizar (V) o Imprimir (I) codigo= Código de Plantilla copias= Nº de copias fichero= El path y nombre del fichero que se va a generar, el nombre del fichero debe llevar la extensión W2Z. dl= Directorio Temporal Ejemplo: bd=ADMON/PASSWORD@imc21_denivel2 operacion=V codigo=2 copias=1 fichero=d:\icm\web\web_reps\ADMON_200021120_171106.W2Z dl=d:\temp\ Va a generar un fichero zip (con extensión W2Z) que contiene los siguientes ficheros: Plantilla Word o WordPerfect, es obtenida de base - Plantilla: de datos consultando un tabla por codigo de Plantilla, que hemos recibido como parámetro del programa Forms - Fichero de datos: Fichero dbf Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 39 Nombre del manual TODO SOBRE FORMS 1OG - Fichero ini: Contiene los siguientes parámetros: FORMULARIO= Nombre de la plantilla DATOS= Nombre del fichero de datos (dbf) OPERACION= Visualizar (V)o Imprimir (I) COPIAS= Nº de copias. Ejemplo: FORMULARIO=W2ZP.doc DATOS=W2ZP.dbf OPERACION=V COPIAS=1 3. Programa Forms Consta de las siguientes componentes: Fichero Ini Además de los parámetros standard de una aplicación Forms , el fichero ini de la aplicación debe llevar los parámetros predeterminados para la ejecución de programas en batch, que son los siguientes: DocxHost = Máquina dónde va a correr el programa delphi. DocxDir = Dirección Física dónde el programa delphi depositará el fichero que genera. DocxCola = Cola en la que se ejecutará el programa delphi. DocxMapping =URL que apunta a la direccción física dónde el programa delphi deposita el fichero que genera. DocxExe = Dirección física del programa delphi. DocxTemp = Directorio temporal. Ejecución del programa Delphi La ejecución de un programa en batch desde forms se realiza a través de las funciones del paquete QUJB_PAQ_GENERAL: PETICION Obtiene un nº de Petición. EJECUCION Se lanza la ejecución del proceso. ESTADO Devuelve si ha finalizado el proceso. Para más información sobre ejecución de programas en batch desde forms consultar el documento Ejemplo_Pipe_Batch.doc . Al programa delphi se le envía una cadena con los siguientes parámetros bd= Usuario, Password y Cadena de Conexión con el formato Usuario/Password@cadena_conexion operacion= Operación a realizar, puede ser Visualizar (V) o Imprimir (I) codigo= Código de Plantilla copias= Nº de copias fichero= El path y nombre del fichero que se va a generar. El path se captura del parámetro DocxDir del fichero ini, el nombre del fichero se Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 40 Nombre del manual TODO SOBRE FORMS 1OG construye con el Nombre del Uusario de base de datos, fecha actual y con la extensión W2Z. dl= Directorio Temporal Ejemplo: bd=ADMON/PASSWORD@imc21_denivel2 operacion=V codigo=2 copias=1 fichero=d:\icm\web\web_reps\ADMON_200021120_171106.W2Z dl=d:\temp\ Visualización del fichero (generado por el programa delphi) Comprobado con la Función QUJB_PAQ_GENERAL.Estado que el proceso ha terminado se visualiza el fichero generado realizando un WEB.Show_Document a la URL dónde se encuentra el fichero, el path del fichero se captura del parámetro DocxMapping del fichero ini. Ejemplo: v_Url := ‘http://nticmdes01/web_reps/ ADMON_200021120_171106.W2Z’; WEB.SHOW_DOCUMENT(v_Url,'_blank'); 14 TRATAMIENTO DE CAMPOS LOB La carga y descarga de ficheros al Server (upload y download respectivamente) cada vez está siendo más habitual en los proyectos Forms en WEB. Para facilitar los desarrollos y la puesta en producción de las aplicaciones se ha desarrollado un Servlet genérico para realizar este tipo de operaciones. Modelo de datos.Se han creado tres tablas nuevas de GAT donde el Servlet almacenará la información de los ficheros a tratar a modo temporal para que las distintas aplicaciones puedan procesar esta información, de este modo el Servlet depositará o recogerá siempre la información de ficheros de estas tablas temporales, son las siguientes GAT_UPLOAD_FICHERO .contiene la información general de cada archivo. GAT_UPLOAD_LINEA .- dónde se almacenan los ficheros de texto a cargar, tendremos un registro por cada línea del archivo, aquí se almacenarán los campos de tipo CLOB. GAT_UPLOAD_BLOB .- dónde se almacenan los ficheros en binario a cargar/visualizar, aquí se almacenarán los campos de tipo BLOB. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 41 Nombre del manual TODO SOBRE FORMS 1OG Conexión a base de datos.No nos hemos de preocupar de la conexión ya que existen una cuenta preestablecida para cada base de datos con la cual se conecta el Servlet. 14.1 Carga de Archivos de Texto a campos CLOB -uploadLos archivos para hacer UPLOAD tendrán que ser archivos de texto, formato TXT y la estructura de cada registro será la que cada aplicación defina y/o requiera. Funcionamiento General: Desde un punto determinado de una aplicación se realiza la llamada el servlet genérico de upload. Aparece una ventana de petición de la localización del fichero a cargar. El servlet sube el fichero al servidor y lo carga en las tablas temporales. El archivo ya cargado será tratado por nuestra aplicación. Una vez procesada esta información los datos se borrarán de las tablas temporales por nuestra aplicación. Se realizarán los siguientes pasos: 1.- Generación de una Clave Externa. Se genera en nuestra aplicación, desde el módulo que llame al servlet con un criterio de clave única, por ejemplo del tipo: USER_YYYYMMDD_HH24:MI:SS 2.- Llamada al Servlet La llamada al Servlet debe ser como se describe a continuación: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 42 Nombre del manual TODO SOBRE FORMS 1OG http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=<bd>&user=<user >&apli=<apli>&clave=<clave> &plantilla=<plantilla>&opcclob=C Los parámetros del querystring son los siguientes: 1. <bd> - base de datos donde se va a dejar la información del fichero 2. <user> - usuario que realiza la operación (no se utiliza para la conexión) 3. <apli> - aplicación que hace la carga 4. <clave> - clave de referencia para localizar el registro 5. <plantilla> - plantilla htm a utilizar (opcional, existe una plantilla por defecto) 6. <opcclob> - Valores válidos: C - Carga de Fichero de texto a campo CLOB Por defecto si no aparece el parámetro opcclob también realiza la carga de fichero de texto a campo clob Ejemplos de llamadas: http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm1003_orcl8&user=U SU1&apli=USUG&clave= USU1_20021217_101330&plantilla=defecto http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm1003_orcl8&user=U SU1&apli=USUG&clave=USU1_20021217_101330&plantilla=defecto&opcclob= C http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm21_denivel2&user=G AT1&apli=GAT&clave= GAT1_20021217_101330&plantilla=azul Una vez finalizado el Programa Servlet ya se han cargado las tablas Temporales y se ha generado un registro por cada línea del Fichero de texto en la tabla GAT_UPLOAD_LINEA 3.- Leer de la Tabla Temporal A través de un cursor se leen los registros(uno para cada línea del fichero) generados por el programa Servlet. El cursor nos permite operar con cada registro(línea del fichero) y realizar la operación que necesitemos. NOTA: No se debe realizar la lectura de los registros hasta que el programa Servlet no ha finalizado. 4.- Borrado de Registros de Tablas Temporales Una vez finalizada la lectura de los registros en las tablas temporales GAT_UPLOAD_.... se realizará el borrado de nuestros registros. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 43 Nombre del manual TODO SOBRE FORMS 1OG 14.2 Carga de Archivo de Texto a campo CLOB y campo BLOB Los archivos para hacer UPLOAD tendrán que ser archivos de texto, formato TXT y la estructura de cada registro será la que cada aplicación defina y/o requiera. Funcionamiento General: Desde un punto determinado de una aplicación se realiza la llamada el servlet genérico de upload. Aparece una ventana de petición de la localización del fichero a cargar. El servlet sube el fichero al servidor y lo carga en las tablas temporales tanto en líneas como en fichero. El archivo ya cargado será tratado por nuestra aplicación. Una vez procesada esta información los datos se borrarán de las tablas temporales por nuestra aplicación. Se realizarán los siguientes pasos: 1.- Generación de una Clave Externa. Se genera en nuestra aplicación, desde el módulo que llame al servlet con un criterio de clave única, por ejemplo del tipo: USER_YYYYMMDD_HH24:MI:SS 2.- Llamada al Servlet La llamada al Servlet debe ser como se describe a continuación: http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=<bd>&user=<user >&apli=<apli>&clave=<clave> &plantilla=<plantilla>&opcclob=T Los parámetros del querystring son los siguientes: <bd> - base de datos donde se va a dejar la información del fichero <user> - usuario que realiza la operación (no se utiliza para la conexión) <apli> - aplicación que hace la carga <clave> - clave de referencia para localizar el registro <plantilla> - plantilla htm a utilizar (opcional, existe una plantilla por defecto) 6. <opcclob> - Valores válidos: T - Carga de Fichero de texto a campo CLOB y campo BLOB 1. 2. 3. 4. 5. Ejemplos de llamadas: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 44 Nombre del manual TODO SOBRE FORMS 1OG http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm1003_orcl8&user=U SU1&apli=USUG&clave=USU1_20021217_101330&plantilla=defecto&opcclob= T http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm21_denivel2&user=G AT1&apli=GAT&clave= GAT1_20021217_101330&plantilla=azul &opcclob=T Una vez finalizado el Programa Servlet ya se han cargado las tablas Temporales y se ha generado un registro por cada línea del Fichero de texto en la tabla GAT_UPLOAD_LINEA y un registro en la tabla GAT_UPLOAD_BLOB con el fichero blob 3.-Carga de Blob a tablas de nuestra aplicación Transferencia del registro recién insertado en tablas temporales a la tabla de nuestra aplicación ‘XXXX’ ( XXXX_TABLA_BLOB) con una sentencia ‘insert’ del siguiente estilo: insert into XXXX_TABLA_BLOB (pk1, …., campo_blob) (select :pk1, …, b.it_contenido from GAT_UPLOAD_BLOB b, GAT_UPLOAD_FICHERO a where a.nm_fichero = b.nm_fichero and a.cod_aplicacion = :global.cod_aplicacion and a.cod_usuario = USER and b.cd_cl_externa = :cla) siendo: :pk1 campo clave de la tabla XXXX_TABLA_BLOB de la aplicación ‘XXXX’. :cla campo clave externa que se envió en paso 2 en la llamada al Servlet upload.exe (en caso de que la tabla contenga más de un campo clave u otros campos … se cumplimentarán en la sentencia insert anterior) En este pto. ya tenemos el archivo BLOB almacenado en la tabla de nuestra aplicación XXXX_TABLA_BLOB 4.- Leer de la Tabla Temporal A través de un cursor se leen los registros(uno para cada línea del fichero de la tabla GAT_UPLOAD_CLOB) generados por el programa Servlet. El cursor nos permite operar con cada registro(línea del fichero) y realizar la operación que necesitemos. NOTA: No se debe realizar la lectura de los registros hasta que el programa Servlet no ha finalizado. 5.- Borrado de Registros de Tablas Temporales Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 45 Nombre del manual TODO SOBRE FORMS 1OG Una vez finalizada la lectura de los registros en las tablas temporales GAT_UPLOAD_.... se realizará el borrado de nuestros registros. 14.3 DESCARGA y VISUALIZACION de campos CLOB Funcionamiento General Se realiza la transferencia de un Clob o conjunto de registros de mi aplicación a tablas temporales a través de la función GAT_FUNC_CARGA_CLOB Se ejecuta el programa servlet que descarga y visualiza del Clob o conjutnos de registros de la tabla temporal Finalizada la descarga-visualización, la aplicación borrará de las tablas temporales la información recién tratada. Se realizarán los siguientes pasos: 1.- Generación de una Clave Externa. Se genera en nuestra aplicación, desde el módulo que llame al servlet con un criterio de clave única, por ejemplo del tipo: USER_YYYYMMDD_HH24:MI:SS 2.- Paso de CLOB o del conjuntos de registros de nuestra aplicación a tablas temporales 2.1- Paso de CLOB de nuestra aplicación a tablas temporales Se transfiere 1 registro a la tabla de nuestra aplicación ‘XXXX’ (XXXX_TABLA_CLOB) que contiene el campo CLOB a tablas temporales GAT_UPLOAD_... mediante la ejecución de la siguiente función de carácter general del núcleo de Oracle GAT_FUNC_CARGA_CLOB: La función obtiene el nº de registros que recupera la sentencia “where” que pasamos como parámetro. Parámetros de entrada de la Función: w_Cod_Aplicacion: Código de aplicación w_Cd_Cl_Externa: Clave generada por la aplicación w_Nom_Archivo: Nombre del archivo a generar para su posterior descarga w_Tabla_Apl: Nombre de la tabla de la aplicación (XXXX_TABLA_CLOB) w_Clave_Tabla_Apl: Sentencia where para localizar el registro único que contiene el CLOB Por ejemplo: WHERE ID_CLOB=9877 and CDTIPO=’A’ Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 46 Nombre del manual w_Campo_Clob: TODO SOBRE FORMS 1OG Nombre del campo CLOB a extraer de la anterior tabla Parámetros de salida de la Función: z_Mensaje_Err: Mensaje de Error si se produce. En éste punto se debe realizar COMMIT; para confirmar la inserción del campo CLOB en las tablas temporales y que el proceso “externo” Servlet pueda obtener ésta información 2.2- Paso de un conjunto de registros de nuestra aplicación a tablas temporales Se transfiere el conjunto de registros a la tabla de nuestra aplicación ‘XXXX’ (XXXX_TABLA) a tablas temporales GAT_UPLOAD_... mediante la ejecución de la siguiente función de carácter general del núcleo de Oracle GAT_FUNC_CARGA_CLOB: La función obtiene el nº de registros que recupera la sentencia “where” que pasamos como parámetro. Parámetros de entrada de la Función: w_Cod_Aplicacion: Código de aplicación w_Cd_Cl_Externa: Clave generada por la aplicación w_Nom_Archivo: Nombre del archivo a generar para su posterior descarga w_Tabla_Apl: Nombre de la tabla de la aplicación (XXXX_TABLA) w_Clave_Tabla_Apl: Sentencia where para localizar el registro único que contiene el conjunto de registros Por ejemplo: WHERE ID_EXPETE=9877 and CDTIPO=’A’ w_Campo_Clob: Nombre del campo a extraer de la anterior tabla w_Campo_Nm_Linea: Nombre del Campo de la tabla que contiene el número de línea Parámetros de salida de la Función: z_Mensaje_Err: Mensaje de Error si se produce. En éste punto se debe realizar COMMIT; para confirmar la inserción del conjunto de registros en las tablas temporales y que el proceso “externo” Servlet pueda obtener ésta información 3.- Ejecución del Servlet para realizar la descarga-visualización del campo CLOB Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 47 Nombre del manual TODO SOBRE FORMS 1OG La llamada al servlet debe ser como se describe a continuación: http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=<bd>&user=<user >&apli=<apli>&clave=<clave> &plantilla=<plantilla>&opcclob=V Los parámetros del querystring son los siguientes: 1. 2. 3. 4. 5. <bd> - base de datos donde se va a dejar la información del fichero <user> - usuario que realiza la operación (no se utiliza para la conexión) <apli> - aplicación que hace la carga <clave> - clave de referencia para localizar el registro <plantilla> - plantilla htm a utilizar (opcional, existe una plantilla por defecto) 6. <opcclob> - Valores válidos: V - Descarga/Visualización de campos CLOB a fichero para su posterior visualización 7. <zip> - Valores Válidos: S - El fichero se almacenará comprimido N - El fichero no se almacenará comprimido. (Opcional, no es necesario añadir éste parámetro, por defecto no se comprime). Ejemplos de llamadas: http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm1003_orcl8&user=U SU1&apli=USUG&clave=USU1_20021217_101858&plantilla=defecto&opcclob= V http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm21_denivel2&user=G AT1&apli=GAT&clave=GAT_20021217_101858&plantilla=azul&opcclob=V&zip =S Automáticamente el Servlet realizará la descarga del CLOB generando un archivo en disco y posteriormente procederá a visualizar el documento correspondiente con su aplicación asociada. 4.- Borrado de Registros de Tablas Temporales Una vez visualizado el fichero debemos realizar el borrado de las tablas temporales GAT_UPLOAD… para el registro recién tratado. NOTA: No se debe realizar el borrado hasta que el programa Servlet ha terminado Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 48 Nombre del manual TODO SOBRE FORMS 1OG 14.4 CARGA de cualquier tipo de Archivo a campos BLOB uploadFuncionamiento General: Desde un punto determinado de una aplicación se realiza la llamada el servlet genérico de upload. Aparece una ventana de petición de la localización del fichero a cargar. El servlet sube el fichero al servidor y carga las tablas temporales Se transfiere el Blob de la tabla temporal a la tabla de mi aplicación Finalizada la transferencia se borra de las tablas temporales los registros asociados al fichero cargado Se realizarán los siguientes pasos: 1.- Generación de una Clave Externa. Se genera en nuestra aplicación, desde el módulo que llame al servlet con un criterio de clave única, por ejemplo del tipo: USER_YYYYMMDD_HH24:MI:SS 2.- Ejecución del Servlet de carga de ficheros con la opción BLOB opcblob-. La llamada al servlet debe ser como se describe a continuación: http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=<bd>&user=<user >&apli=<apli>&clave=<clave> &plantilla=<plantilla>&opcblob=C Los parámetros del querystring son los siguientes: 1. 2. 3. 4. 5. <bd> - base de datos donde se va a dejar la información del fichero <user> - usuario que realiza la operación (no se utiliza para la conexión) <apli> - aplicación que hace la carga <clave> - clave de referencia para localizar el registro <plantilla> - plantilla htm a utilizar (opcional, existe una plantilla por defecto) 6. <opcblob> - Valores válidos: C - Carga de archivos a tablas temporales V - Descarga/Visualización de campos BLOB a fichero para su posterior visualización 7. <zip> - Valores Válidos S - El fichero se almacenará comprimido Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 49 Nombre del manual TODO SOBRE FORMS 1OG N - El fichero no se almacenará comprimido. (Opcional, no es necesario añadir éste parámetro, por defecto no se comprime). Ejemplos de llamadas: http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm1003_orcl8&user=U SU1&apli=USUG&clave=USU1_20021217_101858&plantilla=defecto&opcblob =C http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm21_denivel2&user=G AT1&apli=GAT&clave=GAT_20021217_101858&plantilla=azul&opcblob=C&zip =S En este pto. ya tenemos el archivo BLOB cargado en las tablas temporales GAT_UPLOAD_... 3.- Carga de Blob a tablas de nuestra aplicación Transferencia del registro recién insertado en tablas temporales a la tabla de nuestra aplicación ‘XXXX’ ( XXXX_TABLA_BLOB) con una sentencia ‘insert’ del siguiente estilo: insert into XXXX_TABLA_BLOB (pk1, …., campo_blob) (select :pk1, …, b.it_contenido from GAT_UPLOAD_BLOB b, GAT_UPLOAD_FICHERO a where a.nm_fichero = b.nm_fichero and a.cod_aplicacion = :global.cod_aplicacion and a.cod_usuario = USER and b.cd_cl_externa = :cla) siendo: :pk1 campo clave de la tabla XXXX_TABLA_BLOB de la aplicación ‘XXXX’. :cla campo clave externa que se envió en paso 2 en la llamada al Servlet upload.exe (en caso de que la tabla contenga más de un campo clave u otros campos … se cumplimentarán en la sentencia insert anterior) En este pto. ya tenemos el archivo BLOB almacenado en la tabla de nuestra aplicación XXXX_TABLA_BLOB 4.- Borrado de Registros de Tablas Temporales Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 50 Nombre del manual TODO SOBRE FORMS 1OG Una vez almacenado el campo BLOB en nuestra aplicación debemos realizar el borrado de las tablas temporales GAT_UPLOAD… para el registro recién tratado. NOTA: No se debe realizar el borrado hasta que el programa Servlet ha terminado 14.5 DESCARGA y VISUALIZACION de campos BLOB Funcionamiento General Se realiza la transferencia de un Blob de mi aplicación a tablas temporales a través de la función GAT_FUNC_CARGA_BLOB Se ejecuta el programa servlet que descarga y visualiza el Blob de la tabla temporal Finalizada la descarga-visualización la aplicación borrará de las tablas temporales la información recién tratada. Se realizarán los siguientes pasos: 1.- Generación de una Clave Externa. Se genera en nuestra aplicación, desde el módulo que llame al servlet con un criterio de clave única, por ejemplo del tipo: USER_YYYYMMDD_HH24:MI:SS 2.- Paso de BLOB de nuestra aplicación a tablas temporales Se transfiere el registro de la tabla de nuestra aplicación ‘XXXX’ (XXXX_TABLA_BLOB) que contiene el campo BLOB a tablas temporales GAT_UPLOAD_... mediante la ejecución de la siguiente función de carácter general del núcleo de Oracle GAT_FUNC_CARGA_BLOB: La función obtiene el nº de registros que recupera la sentencia “where” que pasamos como parámetro. Parámetros de entrada de la Función: w_Cod_Aplicacion: Código de aplicación w_Cd_Cl_Externa: Clave generada por la aplicación w_Nom_Archivo: Nombre del archivo a generar para su posterior descarga w_Tabla_Apl: Nombre de la tabla de la aplicación (XXXX_TABLA_BLOB) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 51 Nombre del manual TODO SOBRE FORMS 1OG w_Clave_Tabla_Apl: Sentencia where para localizar el registro único que contiene el BLOB Por ejemplo: WHERE ID_BLOB=9877 and CDTIPO=’A’ w_Campo_Blob: Nombre del campo BLOB a extraer de la anterior tabla Parámetros de salida de la Función: z_Mensaje_Err: Mensaje de Error si se produce. En éste punto se debe realizar COMMIT; para confirmar la inserción del campo BLOB en las tablas temporales y que el proceso “externo” Servlet pueda obtener ésta información 3.- Ejecución del Servlet para realizar la descarga-visualización del campo BLOB La llamada al servlet debe ser como se describe a continuación: http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=<bd>&user=<user >&apli=<apli>&clave=<clave> &plantilla=<plantilla>&opcblob=V Los parámetros del querystring son los siguientes: 1. 2. 3. 4. 5. <bd> - base de datos donde se va a dejar la información del fichero <user> - usuario que realiza la operación (no se utiliza para la conexión) <apli> - aplicación que hace la carga <clave> - clave de referencia para localizar el registro <plantilla> - plantilla htm a utilizar (opcional, existe una plantilla por defecto) 6. <opcblob> - Valores válidos: C - Carga de archivos a tablas temporales V - Descarga/Visualización de campos BLOB a fichero para su posterior visualización 7. <zip> - Valores Válidos: S - El fichero se almacenará comprimido N - El fichero no se almacenará comprimido. (Opcional, no es necesario añadir éste parámetro, por defecto no se comprime). Ejemplos de llamadas: http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm1003_orcl8&user=U SU1&apli=USUG&clave=USU1_20021217_101858&plantilla=defecto&opcblob =V Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 52 Nombre del manual TODO SOBRE FORMS 1OG http://icmweb01.icm.es/util/upload/servlet/Servidor?bd=icm21_denivel2&user=G AT1&apli=GAT&clave=GAT_20021217_101858&plantilla=azul&opcblob=V&zip =S Automáticamente el Servlet realizará la descarga del BLOB generando un archivo en disco y posteriormente procederá a visualizar el documento correspondiente con su aplicación asociada. 4.- Borrado de Registros de Tablas Temporales Una vez visualizado el fichero debemos realizar el borrado de las tablas temporales GAT_UPLOAD… para el registro recién tratado. NOTA: No se debe realizar el borrado hasta que el programa Servlet ha terminado 14.6 CARGA DE BLOB DESDE URL Funcionamiento General: Desde un punto determinado de una aplicación se realiza la llamada el servlet genérico de upload pasandole entre otros parámetros la url donde está ubicado el fichero. El servlet deposita el fichero en la tabla gat_upload_blob Se transfiere el Blob de la tabla temporal a la tabla de mi aplicación Finalizada la transferencia se borra de las tablas temporales los registros asociados al fichero cargado Se realizarán los siguientes pasos: 1.- Generación de una Clave Externa. Se genera en nuestra aplicación, desde el módulo que llame al servlet con un criterio de clave única, por ejemplo del tipo: USER_YYYYMMDD_HH24:MI:SS 2.- Ejecución del Servlet de carga de ficheros con la opción BLOB opcblob-. La llamada al servlet debe ser como se describe a continuación: http://icmweb01.icm.es/util/upload/servlet/Servidor?opcion=CargarDeURL &bd=<bd>&user=<user>&apli=<apli>&clave=<clave>&plantilla=<plantilla> &nombre_fich=<nombre_fich>&urlfichero=<urlfichero>&zip=<zip> Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 53 Nombre del manual TODO SOBRE FORMS 1OG Los parámetros del querystring son los siguientes: 1. <opcion> CargarDeURL 2. <bd> - base de datos donde se va a dejar la información del fichero 3. <user> - usuario que realiza la operación (no se utiliza para la conexión) 4. <apli> - aplicación que hace la carga 5. <clave> - clave de referencia para localizar el registro 6. <plantilla> - plantilla htm a utilizar (opcional, existe una plantilla por defecto) 7. <nombre_fich> - Nombre del fichero a cargar 8. <urlfichero> - url del fichero a cargar 7. <zip> - Valores Válidos S - El fichero se almacenará comprimido N - El fichero no se almacenará comprimido. (Opcional, no es necesario añadir éste parámetro, por defecto no se comprime). Ejemplos de llamadas: http://icmweb01.icm.es/util/upload/servlet/Servidor?opcion=CargarDeURL&bd=i cm21_denivel2&user=ADMON&apli=USUI&clave=ADMON_20021217_101858 &plantilla=&nombre_fich=ADMON_20071108_121949_73.pdf&urlfichero=http:// NTICMAPL11/web_reps/ADMON_20071108_121949_73.pdf&zip=N En este pto. ya tenemos el archivo BLOB cargado en las tablas temporales GAT_UPLOAD_... 3.- Carga de Blob a tablas de nuestra aplicación Transferencia del registro recién insertado en tablas temporales a la tabla de nuestra aplicación ‘XXXX’ ( XXXX_TABLA_BLOB) con una sentencia ‘insert’ del siguiente estilo: insert into XXXX_TABLA_BLOB (pk1, …., campo_blob) (select :pk1, …, b.it_contenido from GAT_UPLOAD_BLOB b, GAT_UPLOAD_FICHERO a where a.nm_fichero = b.nm_fichero and a.cod_aplicacion = :global.cod_aplicacion and a.cod_usuario = USER and b.cd_cl_externa = :cla) siendo: :pk1 campo clave de la tabla XXXX_TABLA_BLOB de la aplicación ‘XXXX’. :cla campo clave externa que se envió en paso 2 en la llamada al Servlet upload.exe Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 54 Nombre del manual TODO SOBRE FORMS 1OG (en caso de que la tabla contenga más de un campo clave u otros campos … se cumplimentarán en la sentencia insert anterior) En este pto. ya tenemos el archivo BLOB almacenado en la tabla de nuestra aplicación XXXX_TABLA_BLOB 4.- Borrado de Registros de Tablas Temporales Una vez almacenado el campo BLOB en nuestra aplicación debemos realizar el borrado de las tablas temporales GAT_UPLOAD… para el registro recién tratado. NOTA: No se debe realizar el borrado hasta que el programa Servlet ha terminado NOTA: Tanto en la carga de Blob como de Clob el nombre de Fichero que se indique debe ser único , para ello se puede utlizar la nomenclatura USER_DDMMYYYY_HHMMSS NOTA: Funciones GAT_FUNC_CARGA_BLOB y GAT_FUNC_CARGA_CLOB CREATE OR REPLACE FUNCTION GAT_FUNC_CARGA_BLOB (w_Cod_Aplicacion IN GAT_UPLOAD_FICHERO.Cod_Aplicacion%TYPE , w_Cd_Cl_Externa IN GAT_UPLOAD_FICHERO.Cd_Cl_Externa%TYPE, w_Nom_Archivo GAT_UPLOAD_FICHERO.Nom_Archivo%TYPE, w_Tabla_Apl IN Varchar2, w_Clave_Tabla_Apl IN Varchar2, w_Campo_Blob IN Varchar2, z_Mensaje_Err OUT Varchar2) RETURN Integer IS /****************************************************************************************** * FUNCIÓN: GAT_FUNC_CARGA_BLOB DESCRIPCIÓN: Realiza Descarga Blob desde la tabla Origen 'Tabla de la Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 55 Nombre del manual TODO SOBRE FORMS 1OG Aplicación' a la tabla de Trabajo. La función obtiene el Nº de Registros que recupera la Clave de la Tabla de la Aplicación Se obtiene 1 la función ha funcionado correctamente Se obtiene 0 ó >= 2 La Clave de la tabla de la Aplicación es errónea no recupera 1 Registro Si devuelve -1 se ha producido un error en la Función Si devuelve -2 se ha detectado parámetros obligatorios de Entrada con valor Nulo ******************************************************************************************* */ v_Nm_Fichero GAT_UPLOAD_FICHERO.Nm_Fichero%TYPE; v_Cuenta Integer; BEGIN -- Validaciones de Parámetros IF w_Cod_Aplicacion IS NULL OR w_Cd_Cl_Externa IS NULL OR w_Nom_Archivo IS NULL OR w_Tabla_Apl IS NULL OR w_Campo_Blob IS NULL THEN z_Mensaje_Err := 'Los parámetros de entrada de la Función no pueden ser Nulos.'; RETURN (-2); END IF; -Select GAT_SEQ_UPLOAD.NEXTVAL INTO v_Nm_Fichero FROM DUAL; -INSERT INTO GAT_UPLOAD_FICHERO (Nm_Fichero, Cod_Aplicacion, Cod_Usuario, Fc_Carga, Cd_Cl_Externa, Nom_Archivo) VALUES(v_Nm_Fichero, w_Cod_Aplicacion, USER, SYSDATE, w_Cd_Cl_Externa, w_Nom_Archivo); EXECUTE IMMEDIATE 'INSERT INTO GAT_UPLOAD_BLOB (Nm_Fichero, It_Contenido) Select '|| v_Nm_Fichero||', '||w_Campo_Blob||' FROM '||w_Tabla_Apl||' '||w_Clave_Tabla_Apl; -- Valida que Clave Principal recupera un registro ----------v_Cuenta := SQL%ROWCOUNT; IF v_Cuenta = 0 THEN z_Mensaje_Err := 'La Clave Principal No ha obtenido ningún registro.'; RETURN(v_Cuenta); ELSIF v_Cuenta >= 2 THEN z_Mensaje_Err := 'La Clave Principal ha obtenido Más de 1 registro.'; RETURN(v_Cuenta); END IF; ------------------------------------------------------------- Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 56 Nombre del manual TODO SOBRE FORMS 1OG RETURN(v_Cuenta); EXCEPTION WHEN OTHERS THEN z_Mensaje_Err := SQLERRM; RETURN(-1); END; / CREATE OR REPLACE FUNCTION GAT_FUNC_CARGA_CLOB (w_Cod_Aplicacion IN GAT_UPLOAD_FICHERO.Cod_Aplicacion%TYPE , w_Cd_Cl_Externa IN GAT_UPLOAD_FICHERO.Cd_Cl_Externa%TYPE, w_Nom_Archivo GAT_UPLOAD_FICHERO.Nom_Archivo%TYPE, w_Tabla_Apl IN Varchar2, w_Clave_Tabla_Apl IN Varchar2, w_Campo_Clob IN Varchar2, z_Mensaje_Err OUT Varchar2, w_Campo_Nm_Linea IN Varchar2 DEFAULT Null ) RETURN Integer IS /****************************************************************************************** * FUNCIÓN: GAT_FUNC_CARGA_CLOB DESCRIPCIÓN: Realiza Descarga Clob desde la tabla Origen 'Tabla de la Aplicación' a la tabla de Trabajo. La función obtiene el Nº de Registros que recupera la Clave de la Tabla de la Aplicación Se obtiene 1 la función ha funcionado correctamente Se obtiene 0 ó >= 2 La Clave de la tabla de la Aplicación es errónea no recupera 1 Registro Si devuelve -1 se ha producido un error en la Función Si devuelve -2 se ha detectado parámetros obligatorios de Entrada con valor Nulo ******************************************************************************************* */ v_Nm_Fichero GAT_UPLOAD_FICHERO.Nm_Fichero%TYPE; v_Cuenta Integer; BEGIN -- Validaciones de Parámetros IF w_Cod_Aplicacion IS NULL OR w_Cd_Cl_Externa IS NULL OR Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 57 Nombre del manual TODO SOBRE FORMS 1OG w_Nom_Archivo IS NULL OR w_Tabla_Apl IS NULL OR w_Campo_Clob IS NULL THEN z_Mensaje_Err := 'Los parámetros de entrada de la Función no pueden ser Nulos.'; RETURN (-2); END IF; --- Evalúo si se va a procesar un Conjunto de Líneas o un CLOB ------------------------------------------------------------------------------------ Tratamiento de 1 CLOB -------------------------------------------------------------------------------------------------------------------------------------------IF w_Campo_Nm_Linea IS NULL THEN Select GAT_SEQ_UPLOAD.NEXTVAL INTO v_Nm_Fichero FROM DUAL; -INSERT INTO GAT_UPLOAD_FICHERO (Nm_Fichero, Cod_Aplicacion, Cod_Usuario, Fc_Carga, Cd_Cl_Externa, Nom_Archivo, Nm_Lineas) VALUES(v_Nm_Fichero, w_Cod_Aplicacion, USER, SYSDATE, w_Cd_Cl_Externa, w_Nom_Archivo, 1); EXECUTE IMMEDIATE 'INSERT INTO GAT_UPLOAD_LINEA (Nm_Fichero, Nm_Linea, It_Contenido) SELECT '|| v_Nm_Fichero||', '||'1 ,'||w_Campo_Clob||' FROM '||w_Tabla_Apl||' '||w_Clave_Tabla_Apl; -- Valida que Clave Principal recupera un registro ----------v_Cuenta := SQL%ROWCOUNT; IF v_Cuenta = 0 THEN z_Mensaje_Err := 'La Clave Principal No ha obtenido ningún registro.'; RETURN(v_Cuenta); ELSIF v_Cuenta >= 2 THEN z_Mensaje_Err := 'La Clave Principal ha obtenido Más de 1 registro.'; RETURN(v_Cuenta); END IF; ------------------------------------------------------------------------------------ Tratamiento de un Conjunto de Líneas ----------------------------------------------------------------------------------------------------------------------------ELSIF w_Campo_Nm_Linea IS NOT NULL THEN Select GAT_SEQ_UPLOAD.NEXTVAL INTO v_Nm_Fichero FROM DUAL; -EXECUTE IMMEDIATE 'INSERT INTO GAT_UPLOAD_LINEA (Nm_Fichero, Nm_Linea, It_Contenido) SELECT '|| v_Nm_Fichero||', '||w_Campo_Nm_Linea||', '||w_Campo_Clob||' FROM '||w_Tabla_Apl||' '||w_Clave_Tabla_Apl; Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 58 Nombre del manual TODO SOBRE FORMS 1OG -- Valida que Clave Principal recupera algún registro ----------v_Cuenta := SQL%ROWCOUNT; IF v_Cuenta = 0 THEN z_Mensaje_Err := 'La Clave Principal No ha obtenido ningún registro.'; RETURN(v_Cuenta); END IF; INSERT INTO GAT_UPLOAD_FICHERO (Nm_Fichero, Cod_Aplicacion, Cod_Usuario, Fc_Carga, Cd_Cl_Externa, Nom_Archivo, Nm_Lineas) VALUES(v_Nm_Fichero, w_Cod_Aplicacion, USER, SYSDATE, w_Cd_Cl_Externa, w_Nom_Archivo, v_Cuenta); END IF; ------------------------------------------------------------------------------------------RETURN(v_Cuenta); EXCEPTION WHEN OTHERS THEN z_Mensaje_Err := SQLERRM; RETURN(-1); END; / Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 59 Nombre del manual TODO SOBRE FORMS 1OG 15 CREACIÓN DE TABLA ORACLE CON CAMPOS BLOB Script de creación de una tabla que contiene un campo BLOB en la que se fijan las características de acceso y almacenamiento al mismo. CREATE TABLE XXXX_TAB_BLOB ( ... campo_lob BLOB ... ) LOB (campo_lob) STORE AS (CHUNK 4096 PCTVERSION 10 NOCACHE LOGGING TABLESPACE TBSLOB_XXXX_100); Para la incorporación de tablas que contienen campos de tipo BLOB en Erwin es más sencillo la creación por un lado de la tabla normal y por otro de las características del campo BLOB mediante una sentencia ‘ALTER TABLE’. De este modo en el Post-Script de Erwin asociado a la tabla tendríamos solamente la sentencia ‘ALTER TABLE …’ (en el caso del create anterior en un modelo Erwin habría de incorporarse en su totalidad la sentencia create table en el Post-Script). CREATE TABLE XXXX_TAB_BLOB ( ... campo_lob BLOB ... ); ALTER TABLE XXXX_TAB_BLOB MOVE LOB (campo_lob) STORE AS (CHUNK 4096 PCTVERSION 10 NOCACHE LOGGING TABLESPACE TBSLOB_XXXX_100); Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 60 Nombre del manual TODO SOBRE FORMS 1OG 16 ACCESO A ESTACIÓN DE ESCANER PROCESO: 1. Forms ejecuta el Servlet pasándole los parámetros adecuados (bajo el frame 'oculto') Ejemplo de Llamada al Servlet desde Forms: 1 - Es necesario incorporar en el fichero ini de la Aplicación Forms el siguiente parámetro: [LOAD] ; *** Parámetros válidos solamente para la ejecución de Upload y DownLoad y ActiveX de Escaner Upload_Exe=http://icmweb01.icm.es/util/upload/servlet/Servidor 2 - En el programa Forms incorporando el siguiente Código de Ejecución del Servlet: DECLARE WURL VARCHAR2(250); -- almacena la URL de llamada al Servlet con los parámetros necesarios v_Upload_Exe VARCHAR2(200); -- almacena la dirección URL del Servlet obtenida del parámetro Upload_Exe del fichero ini de la Aplicación -- Los posibles Valores de :BOTONES.Formato son: JPG -TIF, TIFBN PDF, PDFBN -- Los posibles Valores de :BOTONES.Vis_Imagen son: S -N -- Los posibles Valores de :BOTONES.Vis_Interface son: S -N BEGIN v_Upload_Exe := LEER_FICH_INI(:GLOBAL.Fich_Ini ,'Upload_Exe'); :BOTONES.ID_CLAVE := USER||TO_CHAR(SYSDATE,'DDMMYYYYHH24MISS'); -- Generación de Clave Única dinámicamente WURL := v_Upload_Exe||'?opcion=GeneraActiveX'||'&BD='||:GLOBAL.WBD||'&APL='||:GL OBAL.COD_APLICACION||'&CLAVE='||:BOTONES.ID_CLAVE||'&USU='||USE R||'&FORMATO='||:BOTONES.Formato||'&VIS_IMAG='||:BOTONES.Vis_Image n||'&VIS_INTF='||:BOTONES.Vis_Interface; Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 61 Nombre del manual TODO SOBRE FORMS 1OG WEB.SHOW_DOCUMENT(WURL,'oculto'); -- Ejecución del Servlet END; 2. El Servlet crea página -incrustando el ActiveX- y la invoca 3. Si es la 1ª vez que se ejecuta esta opción se solicitará la instalación automática del ActiveX en el puesto 4. Se interactúa con el ActiveX para realizar el escaneo Requisitos: - se ha de tener un escáner homologado con los driver correctamente instalados 17 ENVÍO DE CORREO DESDE FORMS Como solución al envío de correo electrónico desde Forms se han elaborado varias soluciones que a continuación se detallan en función de la versión de Oracle Forms a utilizar (Forms4.5 – Forms6i) y del tipo de envío a realizar: 17.1 Envío de correo desde Forms v4.5 (Unix) Esta funcionalidad se realiza mediante la ejecución de un módulo genérico en Perl que es el encargado de realizar el envío, cara a nuestros desarrollos es tan simple como realizar la ejecución HOST del módulo “sendmail.pl” con los siguientes parámetros: sendmail.pl –f UsuarioRemitente –t UsuarioDestino –u “Asunto” –m “Mensaje” –s Servidor –a FicheroAdjunto –cc UsuarioCopia –q siendo los parámetros siguientes: -f -t -u -m -s -a -cc -q Usuario que envía el correo Usuario/s destinatario del correo (separados por espacio) Asunto del correo Texto del mensaje de correo Servidor, posibles valores: I=Interno – E=Externo (por defecto I) Fichero/s adjuntos (separados por espacio) Con copia a se enviará siempre para obviar la salida Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 62 Nombre del manual TODO SOBRE FORMS 1OG Un ejemplo de llamada sería el siguiente: sendemail.pl –f usuario@madrid.org –t UsuarioDestino1@madrid.org UsuarioDestino2@madrid.org –u “Envio de correo” –m “Este correo se envía como prueba de correo desde Forms v4.5” –s I –a /tmp/fichero.txt –q 17.2 Envío de correo desde Forms6i -sin archivos adjuntosDesde Forms6i en Web para poder enviar este tipo de correos –sin archivos adjuntos- se ha creado una función en el núcleo de Oracle ‘SIS_FUNC_ENVIO_CORREO’ que nos permitirá de modo rápido e inmediato realizar el envío de correos. Los parámetros utilizados en esta función son los siguientes: Remitente …: (IN) indica el usuario que envía el correo Destinatario …: (IN) indica el/los usuarios destinatarios del correo (separados por el carácter ; ) Asunto ...: (IN) asunto del correo Mensaje ...: (IN) texto del correo TipoDestino ...: (IN) tipo de destino ‘I – Interno’ , ‘E – Externo’ ‘M – Masivo’ (por defecto ‘I’) Salida …: (Out) en caso de envío erróneo, el texto del error Result …: que devolverá: El resultado de la función es un campo numérico 0 – envio correcto 1 – envío erroneo (el texto del error en el campo out Salida) Un ejemplo de envío de este tipo de correo lo tenéis disponible en la siguiente URL, accediendo a la opción de menú: Correo -> Envio de Correo de una aplicación de pruebas ‘GPER’ accesible desde la siguiente URL: http://nticmdes01.icm.es:8080/dev60cgi/ifcgi60.exe?form=gper_ap l.fmx Este procedimiento actualmente esta habilitado en la base de datos de desarrollo ‘icm21_decentrl’ solamente en pruebas ya que la creación del mismo está superditada a que la base de datos tenga la opción de Java instalada. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 63 Nombre del manual TODO SOBRE FORMS 1OG 17.3 Envío de correo desde Forms 6i -con archivos adjuntos Se implementa la funcionadad de enviar archivos adjuntos que no existan en disco y que tengamos almacenados en campos LOB de base de datos (hasta ahora tan solo se enviaban como adjuntos normalmente el resultado de la ejecución de un Report, un archivo .pdf que existía en el disco del servidor de aplicaciones). Estos archivos que no existen en disco serán generados por el trabajo Batch ‘icm_correo.exe’ como resultado de la ejecución de una consulta, esta consulta se debe de informar previamente en la tabla ‘XXXX_CORREO’ bajo el nuevo atributo ‘QUERY’ que se ha de añadir a la estructura tipo que teníamos en nuestra tabla correo de aplicación (para los que utilizaban anteriormente esta funcionalidad, no obstante no es obligatorio, el envío de correo seguirá funcionando como hasta ahora sin añadir este atributo pero no se dispondrá de esta nueva funcionalidad). Por tanto la definición completa de la tabla tipo de cada aplicación ‘XXXX_CORREO’ se debe de ajustar a la siguiente estructura: Desc XXXX_CORREO CD_CLAVE VARCHAR2(30) REMITENTE VARCHAR2(30) DESTINATARIO VARCHAR2(2000) correo, separado por el caract ; ) TITULO VARCHAR2(250) MENSAJE CLOB ADJUNTOS VARCHAR2(250) separados con el caract. ; ) TP_ENVIO VARCHAR2(1) Individual’ , ‘M-Masivo’ –defecto M-) TP_DESTINO VARCHAR2(1) ‘E-Externo’ –defecto I-) FC_SOLICITUD DATE (clave única) (quien envía el correo) (destinatario/s del (asunto del correo) (cuerpo del correo) (archivos adjuntos (tipo de envio ‘I(tipo de envio ‘I-Interno’ , (fecha de solicitud de envío) FC_ENVIO DATE (no cumplimentar, lo hace el proceso de envío de correo) RESULTADO VARCHAR2(250) (no cumplimentar, lo hace el proceso de envío de correo) QUERY CLOB “nuevo atributo” (cumplimentar en el caso de generar archivo/s adjunto a partir de una consulta en B.D.) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 64 Nombre del manual TODO SOBRE FORMS 1OG Con este nuevo atributo ‘QUERY’ podremos establecer una correspondencia con el atributo ya existente ‘ADJUNTOS’ para obtener el archivo de la base de datos del siguiente modo: ADJUNTOS = Archivo_Prueba1.doc ; QUERY = SELECT CAMPO_BLOB FROM XXXX_DOCUMENTOS_CORREO WHERE IDCOD = 9883 ; Si no se cumplimenta el atributo QUERY (=null o no existe en la tabla) siempre se obtendrán el/los archivos contenidos en ‘ADJUNTOS’ del disco del servidor. Desde el programa Forms, al hacer insert en la tabla XXXX_CORREO y antes de hacer COMMIT, se llamará a un procedimiento XXXX_PROC_CORREO_AUX creado con anterioridad en la B.D con el siguiente código: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 65 Nombre del manual TODO SOBRE FORMS 1OG CREATE OR REPLACE PROCEDURE XXXX_PROC_CORREO_AUX (w_Id_Correo IN Varchar2, w_Bufer IN Varchar2) IS v_ClobLocator Clob; BEGIN Select mensaje INTO v_ClobLocator FROM XXXX_CORREO WHERE cd_clave = w_Id_Correo; DBMS_LOB.WRITEAPPEND(v_ClobLocator, Length(w_Bufer), w_bufer); END; A continuación unos ejemplos con distintas posibilidades en el envío: 1.- Envío de 1 archivo adjunto obtenido de base de datos ADJUNTOS = Archivo_Prueba1.doc ; QUERY = SELECT CAMPO_BLOB FROM XXXX_DOCUMENTOS_CORREO WHERE IDDOC = 9883 ; 2.- Envío de 2 archivos adjuntos obtenidos de base de datos ADJUNTOS = Archivo_Prueba1.doc ; Archivo_Prueba2.xls ; QUERY = SELECT CAMPO_BLOB FROM XXXX_DOCUMENTOS_CORREO WHERE IDDOC = 9883 ; SELECT CAMPO_BLOB FROM XXXX_DOCUMENTOS_CORREO WHERE IDDOC= 998 ; 3.- Envío de 3 archivos adjuntos, dos de ellos obtenidos de disco, y el tercero obtenido de base de datos: ADJUNTOS = d:\icm\web\web_reps\USU1_20031222_102307_98.pdf ; d:\icm\web\web_reps\USU1_20031222_102407_14.pdf ; Archivo_Prueba2.xls ; QUERY = ; ; SELECT CAMPO_BLOB FROM XXXX_DOCUMENTOS_CORREO WHERE IDDOC = 9883 ; (como se puede ver los dos primeros archivos no tienen select asociada en el atributo QUERY) Una prueba de integración de esta funcionalidad la podéis comprobar desde la siguiente URL: http://nticmdes01/forms6/lanza_ejemplos/envio_correo_forms.htm Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 66 Nombre del manual TODO SOBRE FORMS 1OG 18 Empleo de Frames en Aplicaciones Forms Un frame es un área de visualización de la ventana del navegador, se puede definir una zona horizontal o vertical, la definición de estos la realizaremos desde la herramienta Front-Page de un modo muy sencillo. Frame_A Frame_B ¿ por que utilizar frames en forms ? El uso de frames en forms principalmente lo hacemos para enviar a una zona de ventana una página que no queremos que sea visualizada en ningún momento. Para ello lo que hacemos es definirnos un determinado frame con unas características especiales de tamaño y visualización cero de modo que el resultado del mismo sea un frame oculto. ¿ como definimos una página con frames ? La definición de los frames la hacemos en la página principal ‘index.htm’ de acceso a nuestra aplicación: http://nticmdes01.icm.es/XXXX Para crear una página de estas características, desde Front-Page, seguimos los siguientes pasos: Archivo -> Nuevo -> Pagina o Web -> Nuevo a partir de una plantilla -> División horizontal En este momento nos aparece una página donde podemos ubicar nuestras páginas ya existentes, en la zona superior la página con el contenido (texto, logo, enlace a la aplicación …) y en la zona inferior el nombre de una página en blanco (no contiene nada ya que será esta la zona de frame oculto). Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 67 Nombre del manual TODO SOBRE FORMS 1OG Una vez creada la página index.htm de este modo, pasamos a personalizar las características de los frames contenidos, por tanto nos iremos a la solapa inferior –HTML de página de marcos- para dejar los frames con los siguientes atributos: <frameset rows="100%,0%"> <frame name="enlace" scrolling="auto" src="enlace.htm"> <frame name="oculto" src="oculto.htm" noresize scrolling="no"> <noframes> Como se puede observar hay dos frames con los nombres: “frame name=enlace” “frame name=oculto” al primero de ellos se le puede nombrar como se quiera al segundo hay que hacerlo con el nombre “oculto” -definido este nombre como estandar para esta funcionalidad-, cada uno de ellos estará asociado a la página que le hemos indicado. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 68 Nombre del manual TODO SOBRE FORMS 1OG De este modo quedaría así la página: enlace “oculto” no se visualizaría (0% de visualización) ¿ como hacemos uso de los frames en forms ? Desde nuestros forms y através de la built-in WEB.SHOW_DOCUMENT –la cual nos permite invocar una determinada URL- utilizaremos el frame definido como en el siguiente ejemplo: BEGIN .. Wurl := 'http:// icmweb01.icm.es/util/upload/servlet/Servidor?opcion=GeneraActiveX'|| '&BD=IC M21_DENIVEL2&APL=' ||:GLOBAL.COD_APLICACION||'&CLAVE='||:BLO.ID_CLAVE||'&USU='||USER|| '&FORMATO=TIF&VIS_IMAG=N'; WEB.SHOW_DOCUMENT(Wurl,'oculto’); -- se realiza la llamada al servlet bajo el frame ‘oculto’ .. END; Consideraciones 1.- ‘_blank’ el utilizar el nombre de frame ‘_blank’ con la finalidad de oculto nos puede producir efectos colaterales como pueden ser: - la visualización de ayudas se realiza sobre este frame y al ser oculto jamás conseguiríamos verlas - la visualización de los pdf’s de la aplicación –a través del módulo gral. LIS_REP- sufrirían el mismo efect, no se visualizarían por lo tanto no se debe de utilizar este nombre de frame para la funcionalidad de ocultar una llamada. 2.- dominios se han detectados problemas al pasar aplicaciones a producción que de repente una llamada a Servlet que siempre nos ha funcionado nos deja de funcionar, no hace nada, ni siquiera se ejecuta. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 69 Nombre del manual TODO SOBRE FORMS 1OG Tras pruebas se detecta la siguiente situación: - cuando accedemos a la página principal de la aplicación lo hacemos con dominio, por ejemplo http://nticmpro32.icm.es/XXXX/ y dentro de esta página principal invocamos a Forms Server sin dominio como por ejemplo: http://nticmpro32/dev60cgi/ifcgi60.exe?form=XXXX_APL.fmx esta diferencia en dominios es la que provoca que no se ejecute el Servlet por seguridad bajo el applet de forms ‘Jinitiator’. Por tanto tenemos que utilizar el uso de dominio incluso en las pruebas que realicemos en el entorno de desarrollo, del siguiente modo: http://nticmdes01.icm.es/XXXX y dentro de la página web principal de acceso a la aplicación incluiremos la llamada también con dominio: http://nticmdes01.icm.es:8080/dev60cgi/ifcgi60.exe?form=XXXX_APL.fm x de este modo nos evitaremos problemas en el posterior paso de la aplicación a producción. 19 UTILIZACIÓN DE FRAME OCULTO EN PÁGINA HTML CON FRAMES VERTICALES Partimos de ésta Situación, una página principal.htm, que contiene 2 Marcos Horizontales: lateral – apunta a la página lateral.htm central – apunta a la página central.htm En el marco Central se encuentran los hipervínculos a las aplicaciones Forms con Marco de Destino: Toda la página (_top) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 70 Nombre del manual TODO SOBRE FORMS 1OG Página Principal.htm LATERAL CENTRAL Hipervinculo a aplicación Forms _top Para evitar la visualización de la URL en las llamadas al Servlet desde Forms, sería necesario incorporar una página inicial.htm que va a contener 2 Marcos Verticales: principal – apunta a la página principal.htm oculto – apunta a la página oculto.htm y modificar en los hipervinculos a Aplicaciones Forms que se se encuentran en el marco Central que el Marco de Destino sea Marco Primario (_parent) Página Inicial.htm PRINCIPAL OCULTO Ejemplo: http://nticmdes01.icm.es/forms6/lanza_ejemplos/inicial.htm Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 71 Nombre del manual TODO SOBRE FORMS 1OG 20 EJECUCIÓN DE INFORMES CRYSTAL REPORTS 20.1 Obtener el token de business Objects Esto se realiza ejecutando la función de base de datos WS_PACK_CRYSTALR_0001.OBTENER_TOKEN /******************************************************************************************* * FUNCTION: OBTENER_TOKEN * * DESCRIPCIÓN: Para un cod. usuario y clave (Business Objects) obtiene el token de crystal report * * PARÁMETROS: * w_usuario: Parámetro Obligatorio. Código de Usuario (Business Objects) * w_clave: Parámetro Obligatorio. Clave encriptada (Business Objects) * z_Token: Parámetro de salida. token para ejecucion informe crystal report * z_Cd_Mensaje_Err: Parámetro de salida. Codigo de Mensaje de Error * z_Ds_Mensaje_Err: Parámetro de Salida. Descripciòn de Mensaje de Error * * VALORES DE RETORNO DE LA FUNCIÓN: True * False * * CODIGOS Y DESCRIPCIONES DE ERROR: * Codigo de Error Descripción * -------------------------* 1 'Los parámetros w_usuario, w_clave son obligatorios' * 100 Cualquier error o excepción de Oracle: SQLERRM * ********************************************************************************************/ A la función se le pasarán como parámetros el Usuario y Clave (de business Objects) . Éstos parámetros se almacenan en el fichero ini, ejemplo: [BUSINESS OBJECTS] ;*** Parámetros válidos solamente para obtener token de B.O bo_usuario=EJPL_Usu bo_clave=C7FFB972B34AB66E2C45124586507E4F 20.2 Ejecución de Informe Crystal Report Una vez obtenido el token se compone la url de ejecución del informe (incluyenndo el token) y se ejecuta con la built-in WEB.SHOW_DOCUMENT , con target ‘_blank’ Ejemplo: WEB.SHOW_DOCUMENT(‘http://icmdesbi01:8080/OpenDocument/opendoc/openDocument.jsp ?sType=rpt&sDocName=EJPLListadoEmpleados&sOutputFormat=P&token=icmdesbi01:6400@34236JCl HcPZDmlET75s534235JBAqEg6vt8ePfmgE’, ‘_blank’); Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 72 Nombre del manual TODO SOBRE FORMS 1OG Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 73