lenguajes de cuarta generacion - oracle developer suite 10g-libre

80
UN LENGUAJE DE CUARTA GENERACIÓN Primera Edición ORACLE DEVELOPER SUITE 10G PROGRAMACIÓN BÁSICA EN ORACLE FORMS Y REPORT Lic. Roy Morales Venegas

Upload: marbimon

Post on 24-Dec-2015

60 views

Category:

Documents


15 download

DESCRIPTION

Manual Oracle 10 g

TRANSCRIPT

Page 1: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

UN LENGUAJE DE CUARTA GENERACIÓN

Primera Edición

ORACLE DEVELOPER SUITE 10G

PROGRAMACIÓN BÁSICA EN ORACLE FORMS Y REPORT

Lic. Roy Morales Venegas

Page 2: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

2

UN LENGUAJE DE CUARTA GENERACIÓN

Primera Edición

ORACLE DEVELOPER SUITE 10G

PROGRAMACIÓN BÁSICA EN ORACLE FORMS Y REPORT

Lic. Roy Morales Venegas Universidad Magister San José COSTA RICA

Page 3: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

3

1............................................................................................................................................................ 4

INSTALACIÓN DE ORACLE....................................................................................................... 4 Instalación de la Base de datos Oracle 10g Express Edition....................................................... 4 Conexión con una instancia de base de datos.............................................................................. 4 Instalación del Developer Suite 10G de Oracle........................................................................... 6 Iniciando el contenedor de Oracle para J2EE (OC4J) ................................................................. 9 Configuración básica del servidor de aplicaciones.................................................................... 10 Configuración del servidor de reportes...................................................................................... 16 Comprobando la configuración del ambiente de ejecución....................................................... 22

2.......................................................................................................................................................... 26 PROGRAMACION CON FORMS DEVELOPER DE ORACLE............................................... 26

Componentes de la herramienta................................................................................................. 26 Componentes en la definición de las formas o pantallas........................................................... 27 Generación de otros objetos aplicativos.................................................................................... 28 Componentes en la definición de menús................................................................................... 28 Diseño de una pantalla básica.................................................................................................... 29 Objetos de trabajo...................................................................................................................... 38 Ventanas..................................................................................................................................... 38 Bloques de datos........................................................................................................................ 38 Tipos de elementos.................................................................................................................... 41 Listas de Valores........................................................................................................................ 45 Alertas........................................................................................................................................ 53 Disparadores.............................................................................................................................. 54 Implementación de Disparadores más comunes........................................................................ 57 Bibliotecas PL/SQL................................................................................................................... 60 Conectar Bibliotecas.................................................................................................................. 61 Unidades de Programa............................................................................................................... 62 Excepciones, RETURN y EXIT................................................................................................ 68 Manejo de Errores con ERROR_CODE, ERROR_TEXT........................................................ 68 Uso de Identificadores............................................................................................................... 70 Referencia a Objetos de la forma............................................................................................... 70 Referencia indirecta a Objetos con NAME_IN........................................................................ 71 Código provisto por DEVELOPER........................................................................................... 71 Navegación entre registros......................................................................................................... 73 Como personalizar la barra de herramientas.............................................................................. 74 Uso de Parámetros..................................................................................................................... 78 Manejo de Sesiones.................................................................................................................... 79

Page 4: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

1

INSTALACIÓN DE ORACLE

Instalación de la Base de datos Oracle 10g Express Edition

La base de datos de Oracle es el primer componente que debe ser instalado. Para efectos de éste curso se utilizará la Base de Datos Oracle 10g Express Edition. Una vez instalado éste producto, podrá contar con una página web local que permite acceder a algunas herramientas administrativas que permiten administrar y gestionar aspectos de almacenamiento, memoria, usuarios y control. Si desea contar con la guía de instalación de la base de datos puede ingresar al siguiente sitio web de documentación de Oracle www.oracle.com/pls/xe102/homepage.

Cada base de datos instalada en un servidor conforma una instancia de Oracle, la cual consume recursos de memoria y disco considerables del servidor donde ésta se encuentra instalada, por lo que es recomendable crear una sola instancia por servidor, para que el rendimiento del mismo sea óptimo y resuelva cada petición en un tiempo prudencial.

La estructura de una base de datos Oracle está compuesta por archivos de control (Control File), archivos de datos (Data File) y Archivos de Bitácora (Redo Log Files).

Conexión con una instancia de base de datos

4

Page 5: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Una vez instalada la base de datos Oracle, varios servicios son definidos en el sistema operativo, de los cuales nos enfocamos básicamente en los siguientes:

El servicio relacionado con la instancia y la base de datos, cuyo nombre tiene la estructura:

OracleServiceXXX, donde XXX representa el nombre de la instancia de base de datos. Para efectos del curso la instancia instalada tiene por nombre XE, por lo tanto el nombre del servicio es OracleServiceXE.

El servicio relacionado con la disponibilidad del servidor para permitir el acceso remoto, recibe el nombre de OracleXETNSListener para la instancia XE instalada en el servidor.

Ambos servicios deben encontrarse en estado iniciado, para poder ingresar a la base de datos a

través de cualquier gestor de bases de datos Oracle, siendo utilizados con mayor frecuencia los siguientes: SQL Plus de Oracle, TOAD, SQL-DEVELOPER entre otros.

Utilizando el gestor Oracle Database Express Edition, ingresaremos a la base de datos,

autenticándonos mediante el siguiente diálogo de conexión, donde debe ingresar el usuario SYSTEM y la clave de paso. Una vez autenticado el usuario y clave de paso la base de datos le presentará la página principal de Oracle Database Express Edition.

Diálogo de conexión Página principal de la base de datos XE

5

Page 6: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Instalación del Developer Suite 10G de Oracle 1. En el servidor de la localidad con el administrador de la red definir la ruta donde se instala el

Developer suite, se sugiere instalar en la carpeta APPS\Oracle10iDS

2. DISCO 1

3. ABRIR CARPETA DISK1

4. SETUP

5. Seleccionar siguiente:

6

Especificar en el destino: Nombre: oracle10IDS ó default DevSuiteHome1 Ruta Acceso: C:\APPS\oracle10iDS (ruta definida con el administrador de red)

Page 7: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Debe seleccionar la opción Terminar 1.15GB y seleccionar siguiente: Seleccionar la opción instalar para dar inicio a la instalación del producto Oracle Developer Suite 10g:

1.6 Cambiar y seleccionar el disk2 y aceptar:

7

Page 8: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

8

eleccionar y cambiar al disk 1 y aceptar:

inalizada la instalación de Oracle

S

F Developer Suite 10g, presionar el botón Salir.

Page 9: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Iniciando el contenedor de Oracle para J2EE (OC4J)

9

Al instalar ORACLE 10 iDS, Ud encuentra en la carpeta de Forms Developer un componente adicional OC4J; el cual es el servicio que permite que el servidor funcione en ambiente de Aplicaciones Web.

El contenedor de Oracle para Java con sus siglas en ingles OC4J (Oracle Container for J2EE), es un componente del Servidor de Aplicaciones de Oracle corriendo sobre un standard Java SE distributions, el cual permite que las aplicaciones desarrolladas en Oracle Forms y Report sean ejecutadas desde un explorador de Internet, ofreciendo un comportamiento excelente y de alta escalabilidad para ambientes de producción.

Abrir el Contenedor de Oracle para J2EE

Este componente se levanta como un servicio local en el servidor de aplicaciones, tal y como se muestra en la siguiente imagen. Este servicio se debe iniciar a través de la opción START OC4J Instante, se debe mantener activa la ventana mientras se ejecuta la aplicación. Por ninguna razón debe cerrar la sesión Start OC4J Instance, ya que ésta representa el servicio que el servidor de aplicaciones de Oracle requiere para ejecutar los formularios (pantallas) y reportes que el programador desarrolla.

Instancia del OC4J Activa

Page 10: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

10

Para bajar el servicio utilice la opción

Shutdown OC4J Instante, automáticamente se cierra la ventana de Start OC4J Instance y se baja el servicio.

Cuando el servicio se encuentra abajo

(no disponible) le muestra el siguiente error al ejecutar la aplicación:

Configuración básica del servidor de aplicaciones

Para que la aplicación de “Curso” funcione apropiadamente se debe:

Copiar DEFAULT.ENV como CURSO.ENV y modificar la configuracion ubicados en <ORACLE_HOME>\forms\server

Modificar los archivos FORMSWEB.CFG ubicados en <ORACLE_HOME>\forms\server, donde <ORACLE_HOME> es la ruta de instalación del Developer Suite 10g , Ej: C:\oracle10iDS\forms

ARCHIVO VARIABLES ACCION curso.env FORMS_PATH= Incluir los Path de la aplicación de curso

Ejemplo: FORMS_PATH=D:\APPS\Curso\lib; D:\APPS\Curso\bin;

Formsweb.cfg Incluir las siguientes líneas al final del archivo

[curso] separateFrame=True lookandfeel=oracle

Page 11: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

form=D:\APPS\Curso\bin\acceso.fmx

userid=USER/PASSWORD@[String de conexion] envfile=curso.env

useSDI=yes colorScheme=Teal

config=sepwin IE=JInitiator

Creación del String de Conexión: Ejecutar el asistente de configuración de Red de oracle:

11

Seleccionar Configuración del nombre del servicio de red local y

Seleccionar Agregar y siguiente para agregar un nuevo servicio de red

Page 12: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Seleccionar el nombre de la instancia de la base de datos, el cual corresponde a un nombre de base de datos global.

12

Seleccionar el tipo de protocolo de comunicación , en este caso y para efectos de éste curso utilizaremos: TCP

Introducimos la dirección IP donde se ubica el servidor de la base de datos: Ej: 127.0.0.1, dirección que corresponde al LocalHost.

El puerto a utilizar es el 1521 que corresponde al puerto por defecto.

Page 13: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Probar la conexión, para validar que la configuración del nuevo servicio de red local se haya realizado correctamente.

El asistente realiza inmediatamente una prueba con el usuario system, con una clave que probablemente no coincide con la que se definió en la instalación de la base de datos.

Por lo anterior, se debe seleccionar el botón de Cambiar Conexión para suministrar el usuario y clave de paso correcta para probar la conexión.

13

Page 14: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Una vez suministrado el usuario y clave correcta, la prueba de configuración del nuevo servicio de red local es exitosa.

El de nombre del servicio de Red local es ingresado con el mismo nombre de la base de datos global, sin embargo, el mismo puede ser nombrado diferente. Teniendo en cuenta que es con el nuevo nombre que debe conectarse a la base de datos desde cualquier herramienta del Developer Suite 10g de Oracle. (SQL Plus, Forms, Report). Como recomendación dejar el nombre por defecto.

Si no se desea configurar mas servicios, seleccionar NO y siguiente.

14

Page 15: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

El asistente le indicará que concluyó la configuración del servicio.

Presione Terminar para salir del asistente de configuración de Red de Oracle.

15

Page 16: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Configuración del servidor de reportes Para configurar el servidor de reportes se crea un icono de acceso directo al archivo rwserver,exe ubicado en el directorio <ORACLE_HOME>\bin de la siguiente manera:

Botón derecho del Mouse aparece lo siguiente: Configurar la ruta de los reportes del aplicativo “Curso”

Una vez localizado el archivo rwserver.exe agregamos en la ubicación del elemento “Server=<nombre_servidor_de_reportes>” como se muestra en la siguiente imagen.

16

Page 17: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Para finalizar la creación del servidor de reportes, indicamos el nombre con el que deseamos se visualice el acceso directo.

Para que todos los objetos del aplicativo (pantallas, menus, librerías y reportes) puedan ser ubicados por la aplicación en tiempo de desarrollo (programación), se configura el REGEDIT de la siguiente forma:

Al presentarse el editor del registro de Windows se debe localizar la clave HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_DevSuite10gR2 y modificar los valores FORMS_PATH, REPORT_PATH y UI_ICON, adicionando al inicio de la cadena del valor la ruta donde se encuentran almacenados los archivos del aplicativo, para nuestro efecto “D:\apps\Curso\Bin”(Formas, reportes y menús), “D:\apps\Curso\Lib”(Librerías) y “D:\apps\Curso\Ico”(Imágenes).

17

Page 18: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

18

Page 19: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Subir los servicios: START OC4J Instante Servicio de reportes:

Una vez que se haya establecido el servicio OC4J puede iniciar el servidor de reportes configurado anteriormente.

Inicialmente el Reports Server es un archivo bloqueado por el Firewall de Windows, debe desbloquearse para que pueda establecerse el servicio de reportes.

El servicio de reportes está preparado y listo para ser utilizado.

19

Page 20: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

De acuerdo a la ruta señalada, abrir con Wordpad el archivo Orion_web.xml y adicionar las siguientes líneas, como recomendación copiar cualquier línea en el archivo en una nueva y sustituir los valores correspondientes.

<virtual-directory virtual-path="/Icons" Real-path="D:\APPS\Curso/Ico" /> SALVAR Y SALIR

20

Page 21: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Abrir archivo Registy.dat y adicionar al final de las variables los valores del directorio virtual y la extensión de los íconos utilizados en la aplicación.

Ejemplo: default.icons.iconpath= icons/ default.icons.iconextension=gif

21

Page 22: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Comprobando la configuración del ambiente de ejecución Después de modificados los archivos de configuración del ambiente de ejecución de las aplicaciones que serán desarrolladas durante éste curso, procedemos a ingresar al Forms Builder de Oracle para comprobar la conexión y el ingreso a la pantalla de prueba. Durante el desarrollo de éste curso utilizaremos el usuario HR, el cual corresponde a un pequeño esquema que consta de ocho entidades (tablas) que comprenden la lógica de un sistema de nómina. Conectarse a la base de datos de la siguiente forma: ctrl. + j (tecla j) o ir a la siguiente opción de menú de {Archivo}{Conectar}.

22

Si ésta es la primera vez que nos conectamos a la base de datos con el usuario HR es posible que el usuario se encuentre bloqueado. Para desbloquear el usuario debe ingresar a una sesión de SQL con el usuario SYSTEM y digitar las siguientes instrucciones, que desbloquearán el usuario HR para lograr conectarse.

Alter User hr Account Unlock; Alter User hr Identified By hr;

Una vez ejecutadas las instrucciones anteriores intente conectarse nuevamente con el Forms Builder, éste paso debería de ejecutarse sin ningún problema.

Page 23: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

23

Vaya a la siguiente opción de menú del Forms Builder, al ingresar se le presenta la siguiente pantalla:

Presione le botón Restablecer y copie el texto ubicado en el campo URL de Servidor de Aplicación. Abra una sesión de Explorador de Internet y pegue el texto anterior en el espacio de dirección. Antes asegúrese que el componente OC4J se encuentra activo. Si es la primera vez que ejecuta el servicio de forms, se instalará el componente JINITIATOR en el sistema operativo en forma automática. La versión de JINITIATOR depende de la versión del servicio de forms utilizado. Para efectos de éste cursos se utilizará la versión 1.3.1.22 ya que estamos utilizando Developer Suite 10g Forms Builder 10.1.2.02.

Permita la instalación del complemento Oracle JInitiator de Oracle Corporation, posicionándose en la barra amarilla y haciendo Clic, esta acción le presentará el menú que se observa en la siguiente figura, en el cual usted deberá seleccionar Instalar control ActiveX…

Page 24: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Finalmente instale el componente JINITIATOR presionando el botón Instalar y en la siguiente pantalla presine el botón Next para indicar la carpeta donde se desea instar éste componente. Recomendación permitir que se instale en la ruta que se presenta por defecto.

Una vez concluida la instalación del componente JINITIATOR se le solicitará que reinicie su ordenador, ejecute ésta acción y al ingresar nuevamente compruebe que el componente haya sido instalado correctamente, ingresando a la opción Agregar y quitar programas ubicada en el Panel de Control.

24

Page 25: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Ingrese nuevamente el texto http://127.0.0.1:8889/forms/frmservlet en una nueva sesión de explorador de Internet, esta acción le presentará la aplicación test.fmb, que está creada desde la instalación del Developer Suite y configurada como aplicación inicial en el archivo de configuración Formsweb.cfg para el ambiente default.

25

Si ésta aplicación se presenta, significa que la configuración del servidor de aplicaciones para el servicio de forms está funcionando correctamente. Ahora contamos con el ambiente de desarrollo y de ejecución listos para ser utilizados, si recordamos que tanto el Registro de Windows y los archivos de configuración del Servidor de Aplicaciones

Page 26: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

2

PROGRAMACION CON FORMS DEVELOPER DE ORACLE

Componentes de la herramienta Ü NAVEGADOR DE OBJETOS Es el navegador de Objetos, aparece con la misma estructura en

todas las herramientas ORACLE DEVELOPER y permite movilizarse entre las otras 3 interfaces y se pueden arrastrar los objetos entre diferentes formas. Este componente es el primero en aparecer después de ingresar al ORACLE Forms Builder.

Ü EDITOR DE DISEÑO Es el editor de diseño, aquí se diseña el aspecto de los lienzos (Canvas), se colocan los distintos objetos para el desarrollo de la aplicación. Para crear un lienzo se selecciona Lienzos en el Navegador de Objetos, luego se pulsa CREAR (paleta de herramientas) y aparece el Lienzos, luego seleccione el Lienzos que desee crear y pulse F2.

Ü PALETA DE PROPIEDADES Es la paleta de propiedades, aquí se configuran todas las propiedades y características de los diferentes objetos, por ejemplo: tamaño de letra, fuentes, visibilidad, etc. Existen 2 maneras de mostrar la paleta, la primera pulsando F4 y la segunda es dar un clic derecho sobre el objeto al cual se desea configurar sus características.

26

Page 27: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

27

Ü EDITOR PL/SQL: El editor del PL/SQL permite añadir, modificar, eliminar y compilar código PL/SQL, aquí se modifican las estructuras y procedimientos de la base de datos. Para abrir el editor, simplemente pulse doble-clic sobre el procedimiento que desee modificar, trigger a programar.

Ü BIBLIOTECAS DE OBJETOS La librería de Objetos se definen los estándares para el desarrollo de aplicaciones y los objetos a reutilizar.

Ü PAQUETES INCORPORTADOS Paquetería que Oracle incorpora como parte del producto Forms Developer que ofrece diversas utilidades como lectura y escritura sobre archivos texto, operaciones con árboles jerárquicos, funciones de uso estándar, etc..

Ü OBJETOS DE BASE DE DATOS Permite la visualización y definición de componentes de base de datos como unidades de programa almacenadas PL/SQL, tales como procedimientos, funciones, paquetes y disparadores (Triggers) Update, Delete e Insert de tablas.

Componentes en la definición de las formas o pantallas Ü DISPARADORES Los Disparadores son bloques de código PL/SQL escrito para realizar tareas

cuando un evento especifico ocurre dentro de la aplicación. Ü ALERTAS Una alerta es una ventana modal que despliega un mensaje el cual notifica al operador

sobre alguna condición de la aplicación. Existen 3 tipos de alertas: Parar, Atención y Nota. Ü BIBLIOTECAS CONECTADAS Son vínculos a las librerías de los archivos de sistema, las cuales

tienen procedimientos, paquetes y funciones que realizan ciertas operaciones al momento de ejecutar la aplicación.

Ü BLOQUES DE DATOS Se refiere a los bloques que agrupan cierta información, ya sea ítems de trabajo, o bloques de datos que representan a campos de una tabla.

Ü LIENZOS Es el lienzo donde se diseña la forma que verá el usuario final, aquí se insertan los ítems que contendrá la misma.

Ü EDITORES Se refiere a los editores personalizados que ORACLE FORMS permite definir. Ü LISTA DE VALORES (LOV`S) Es un objeto que tiene una ventana desplegable que representa

una estructura de datos lógica. Básicamente realiza una sola consulta por cada lista de valores. Ü GRUPOS DE OBJETOS Es un contenedor para un grupo de objetos los cuales permiten trabajar

con herencias entre formularios a través de atributos y componentes. Ü PARÁMETROS Son variables del tipo CHAR, NUMBER o DATE que se definen en tiempo de

diseño y capaces de almacenar valores por defecto y ser alterados en tiempo de ejecución. Ü MENUS EMERGENTES Son menús anexados a los elementos de la forma y lienzos, permiten a

los usuarios finales rápidamente acceder a funciones y comandos comunes.

Page 28: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

28

Ü UNIDADES DE PROGRAMA Se almacenan los procedimientos y funciones programadas dentro de la misma forma. También se tienen los procedimientos que utilizan los disparadores (si es que se programara adicionalmente).

Ü CLASES DE PROPIEDAD Un clase de propiedad es un objeto nombrado que contiene una lista de propiedades y sus configuraciones para los elementos y componentes de la aplicación.

Ü GRUPOS DE REGISTRO Son objetos que representan una estructura de datos con el marco fila/columna de la base de datos.

Ü INFORMES Permite la vinculación de informes que han sido diseñados con el Reports Builder de Oracle. Corresponde al nombre del vínculo para ejecutar un informe almacenado físicamente en el servidor de aplicaciones.

Ü ATRIBUTOS VISUALES Representa un atributo visual que es aplicado a un objeto en tiempo de ejecución. Los atributos definen color, fuente, patrones y la apariencia de un objeto.

Ü VENTANAS Es un contenedor para todos los objetos visuales que hacen la aplicación de FORMS BUILDER, puede incluir varios Lienzos. Así mismo, una forma puede contener varias Ventanas.

Generación de otros objetos aplicativos Ü MENÚES Son listas de items que los usuarios utilizan para seleccionar funciones específicas u

operaciones. Ü LIBRERÍAS Es una colección de subprogramas, incluyendo procedimientos, funciones y

paquetes, los cuales pueden compartirse entre distintas aplicaciones. Esto ayuda a la estandarización del desarrollo.

Componentes en la definición de menús Ü BIBLIOTECAS CONECTADAS Las librerías son archivos que contienen un conjunto de

procedimientos, funciones o paquetes que pueden ser utilizados por cualquier objeto aplicativo de ORACLE Forms, Reports y Menús.

Una vez creadas las librerías, estas se relacionan(Atachan) al menú; y posteriormente su código PL/SQL puede ser invocado desde triggers, otro código PL/SQL de ítem del menú y rutinas predefinidas.

Ü MENÚS Los Menúes son listas de ítems que los usuarios utilizan para seleccionar funciones específicas u operaciones. Forms soporta tres tipos de Menúes: menú de formas, menú de barra de herramientas y menú popup (desplegables).

Ü GRUPOS DE OBJETOS Un Objeto de Grupo es un contenedor para un grupo de objetos (ítems, propiedades, atributos, alertas, disparadores). Se lo define cuando se quiere empaquetar objetos relacionados, los cuales pueden ser copiados o heredados en otro módulo. (Menú Template)

Page 29: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Ü UNIDADES DE PROGRAMA Se almacenan los procedimientos o funciones a nivel del menú, se los utiliza comúnmente para definir programáticamente las propiedades del menú, inicialización de variables, definición de seguridades para los menús y estados para trabajar con los menús, etc.

Ü CLASES DE PROPIEDAD Una clase de propiedad es un objeto nombrado que contiene una lista de propiedades y sus configuraciones para los ítems de la aplicación. Luego de crear la clase de propiedad puede poner otros objetos en él. Un objeto basado en una clase de propiedad puede heredar las características de cualquier propiedad. Pueden existir varias propiedades en una clase de propiedad y las propiedades en una clase. Las propiedades pueden ser controladas y localmente pueden ser descartadas para ese ítem, es decir que la herencia puede romperse.

Ü ATRIBUTOS VISUALES Son las fuentes, colores y propiedades patrón que se configuran para los objetos del menú. Cada objeto de la interfaz tiene un grupo de atributos visuales que determinan su configuración.

Diseño de una pantalla básica

29

P ionando para pan

na vez creado el módulo de la nueva

Para definir una pantalla debe crear un nuevo módulo de pantalla, posicionándose en el componente antallas y prescrear un nuevo módulo de talla. Upantalla, ubicarse en el componente Bloques de Datos y hacer clic derecho sobre éste componente, al presentarse el menú de opciones seleccione Asistente de Bloques de Datos.

Page 30: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

30

l presentarse la pantalla de bienvenida al

eleccione Tabla o Vista para definir el tipo

eleccione la tabla y las columnas que se desean utilizar y presentar en el bloque de datos. No

Aasistente de bloques de datos presione el botón Siguiente para definir el bloque de datos. Sbloque de datos que se desea crear. Snecesariamente todos las columnas de una tabla deben seleccionarse, solo aquellas que se desean utilizar y en el caso de bloques utilizados para registro deben presentarse las que corresponden a datos necesarios (requeridos).

Page 31: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

eleccione la tabla Departments para crear el

eleccione todas las columnas disponibles

Sbloque de datos y presione Aceptar. Smediante el botón con doble signo mayor

para elegir todas las columnas como ntos de base de datos que conformarán

el bloque de datos.

eleme

tilice el mismo nombre de la tabla para

Udefinir el nombre del bloque de datos y presione el botón Siguiente. Esto finalizará la creación del bloque de datos.

31

Page 32: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

32

a concluido el diseño del bloque de datos,

el ejemplo seleccione el primer

l presentarse la pantalla de bienvenida al

iseño del Lienzo Son los lienzos de trabajo para realizar el diseño gráfico de las formas. Los elementos

Ü Contenido: Lienzo contenedor, en este se depositarán los objetos del diseño, incluyendo otros

Ü Apilado: es un lienzo que se coloca sobre el lienzo de contenido, se lo utiliza cuando se requieren

Ü Separador: Es la implementación en Forms de lo que en otras herramientas se conoce como

Ü Barra de Herramienta Horizontal: es un lienzo utilizado para diseñar barra de herramientas con

Ü Barra de Herramienta Vertical: es un lienzo utilizado para diseñar barra de herramientas con

Hseleccione uno de los botones de radio para indicar al Asistente de Bloques de Datos la operación que desea realizar. Si selecciona Crear el bloque de datos y, a continuación, llamar al Asistente de Diseño, automáticamente se abrirá el Asistente de Diseño de Lienzos. Si elige Crear solo el bloque de datos el volverá al navegador de objetos donde podrá observar el bloque de datos creado. Para efectos dbotón. Aasistente de diseño de lienzos presione el botón Siguiente para definir el bloque de datos. Dque lo conforman son los Gráficos (Graphics). Existen varios tipos de LienzosCanvas.

lienzos de tipo apilados.

lienzos sobrepuestos para continuar cierto ingreso / presentación de la información (opcional).

Carpetas, los lienzos Separadores, pueden tener 1 o más Páginas, los cuales son independientes para contener los objetos de las formas.

orientación horizontal.

orientación vertical.

Page 33: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

eleccione Nuevo Lienzo para crear el lienzo

i selecciona un lienzo de tipo separador, debe

eleccione el bloque de datos y los elementos de

grese el nombre de la etiqueta que desea que

Sdonde desee diseñar los elementos del bloque de datos. Si el lienzo ya existe selecciónelo. Si crea un nuevo lienzo asegúrese de seleccionar el tipo de lienzo apropiado. Sseleccionar las páginas donde desea diseñar los elementos del bloque de datos. Séste que desea presentar en el lienzo.

33

Inpresente cada campo en el lienzo, puede modificar el ancho y el alto de elemento, ésta medida está dada en puntos.

Page 34: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

34

eleccione el estilo de diseño que desea para la

i se desea registrar información muy completa

grese el título que desea para el marco que

esea mostrar

a ver la barra de desplazamiento,

l asistente diseño ha finalizado el diseño del

l asistente de diseño mostrará el marco nuevo

Spantalla, el cual debe ser elegido según la presentación que se quiera dar a los datos. Sen un solo registro es conveniente seleccionar Pantalla, si la información a ingresar es masiva o es agrupada por otro elemento se debe seleccionar Tabular. Inencierra los elementos en el lienzo. Indique el número de registros que den el lienzo. Usualmente si seleccionó el estilo del lienzo de tipo Pantalla se mostrará un solo registro, si es tabular indique la cantidad de registros que desea visualizar y la distancia entre cada registro. Indique si desela cual puede ser vertical u horizontal según el sentido de orientación de los datos el bloque. Elienzo. Para crear el marco y diseñar los elementos seleccionados presione el botón Terminar. Een el Editor de Diseño. Puede ajustar el diseño en el futuro utilizando nuevamente el asistente de diseño, o utilizando la paleta de propiedades para modificar propiedades específicas del marco, lienzo o de cualquier elemento dentro de éste.

Page 35: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

sta es la pantalla resultante del diseño

sta aplicación esta preparada para

i el servicio del contenedor OC4J está

a pantalla que se presenta inicialmente

Eanterior. El diseño es básico, sin embargo puede ajustarse a medida que se identifican los elementos de ajuste necesarios. Eejecutarse. Puede presionar el botón Ejecutar Pantalla para ejecutarla, éste paso abrirá en forma automática el explorador de Internet y presentará en modo de ejecución la aplicación diseñada.

35

Slevantado puede ejecutarse la aplicación diseñada, sino levante el servicio tal y como se explicó anteriormente. Lestá en modo de inserción de datos, si se desea consultar la información debe presionar los botones de Introducir consulta y Ejecutar consulta.

Page 36: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

36

na vez consultados los datos, éstos Upueden modificarse y almacenarse presionando el botón Guardar . Modifique el nombre del departamento, luego nos pasamos a otro registro presionando el botón o la tecla

gde dirección con la flecha ↓ sin guardar el cambio, modificamos otra descripción y luego uardamos presionando el botón guardar , observe como se despliega en la barra de estado el mensaje transacción terminada: dos registros aplicados y guardados, esto se puede realizar entre registros, pero no entre bloques de registros. Es decir, si contamos con dos bloques Maestro – Detalle, y modificamos un registro del bloque detalle, si intentamos navegar hacia otro registro del bloque maestro, Oracle solicitará que se almacene o se descarte los cambios realizados en el bloque detalle del registro que deseamos abandonar, debido a que no mantiene en memoria los cambios realizados entre registros de nivel de detalle para múltiples registros maestros, sino únicamente del registro maestro actual.

Page 37: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Si modificamos datos que afecten la integridad referencial entre uno o mas datos, se produce un error durante el evento de almacenamiento en base de datos (Grabar), el error puede ser visualizado en el menú {Ayuda}{Mostrar Error} de la pantalla en ejecución.

37

Como puede observar, se presenta una ventana que describe el error en forma de la sentencia en lenguaje DML que ocasionó el fallo, y el error de validación por violación a la integridad de la base de datos, al tratar del almacenar un dato que no existe en una entidad, a la cual existe una llave foránea.

Page 38: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Objetos de trabajo

Ventanas Es un contenedor para todos los objetos visuales que hacen la aplicación de Form Builder, incluyendo los lienzos. Una sola forma puede tener varias ventanas.

38

Cuando se crea una ventana, se especifica su tipo configurando la propiedad Window Style, existen 2 estilos : Document: Son ventanas que típicamente despliegan el

canvas principal y áreas de trabajo de la aplicación donde se realiza la mayor parte de interacción entrada / salida con el usuario final.

Dialog: Son ventanas flotantes, contenedores usados para diálogos modales que esperan respuesta inmediata.

Ventana que muestra la consola de Forms Builder Esta ventana despliega la consola para la forma actual activa en la aplicación. Esta manera de trabajar es opcional, aunque es muy utilizada en aplicaciones de formas múltiples, la ventaja es que siempre muestra la consola de la forma actual.

Bloques de datos Son estructuras que agrupan a un conjunto de ítems de diferente tipo, que podría por ejemplo representar a los campos de una tabla o conformar un bloque de trabajo. Si se utiliza un bloque para relacionarlo a la información de la base de datos, existen 2 formas: Relación Directa, donde se específica directamente con que tabla(solo una) trabajará el bloque. Relación Indirecta, en este caso el bloque trabajará con información de la base datos a través de procedimientos. La programación en estos procedimientos tiene ciertas restricciones pero en general tiene ventajas como la mejora del performance y que permite enlazar un bloque con un conjunto de tablas. Los bloques de datos estas conformados con los siguientes elementos: Disparadores, elementos (columnas de tabla o elementos temporales) y relaciones, estas ultimas se forman cuando se crean bloques maestro-detalle.

Page 39: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

39

En la siguiente imagen observamos las diferentes secciones que contiene un bloque de datos, y las propiedades que corresponden a cada sección. Propiedades básicas de un bloque de datos General

Nombre: Nombre interno del objeto. Comentarios: Información general que usted desea especificar acerca del bloque de datos creado.

Navegación

Estilo de navegación: Como procesar el elemento siguiente o anterior cuando el foco es el primer o último elemento navegable dentro del bloque de datos.

Registros

Consultar todos los registros: Especifica si desea recupera todos los registros que coinciden con los criterios de consulta en el bloque de datos. Esta propiedad tiene por defecto el valor NO, para utilizar elementos calculados de tipo resumen en un bloque, se debe definir ésta propiedad en SI.

Grupo de atributos visuales del registro actual: Permite definir atributos visuales a nivel de forma, bloque de datos y elementos de un bloque de datos, o bien, para formas con varios niveles de bloques de datos, permite la combinación de atributos visuales para cada bloque o elemento de un bloque, otorgando una apariencia visual independiente.

Base de Datos

Bloque de datos de base de datos: Indica si

Page 40: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

40

el bloque de datos se basa en un objeto de base de datos (SI), o si se utiliza como un bloque de trabajo temporal (NO).

Consulta permitida: Define si las aplicaciones pueden ejecutar una consulta en el bloque de datos. Inserción permitida: Define si las aplicaciones pueden insertar registros en el bloque de datos. Actualización permitida: Define si las aplicaciones pueden actualizar registros en el bloque de datos. Supresión permitida: Define si las aplicaciones pueden suprimir registros en el bloque de datos. Alias: Nombre del Alias asociado al Origen/Destino de datos. Cláusula WHERE: Cláusula estándar asociada por defecto al bloque de datos, en la cual se define

específicamente las sentencias de condición que limita la consulta de registros en el bloque. Clásula ORDER BY: Cláusula estandar asociada por defecto al bloque de datos, en la cual se define el

orden de visualización de los registros recuperados en una consulta. Puede utilizar orden ascendente(ASC) o descendente(DESC) después de cada columna. Ejemplo Location_Id Desc, Department_Name Asc

Barra de desplazamiento

Mostrar barra de desplazamiento: Desea visualizar la barra de desplazamiento en el lienzo. Lienzo de barra de desplazamiento: Especifica el lienzo donde será visualizada la barra de

desplazamiento. Página de separador de la barra de desplazamiento: Especifica la página donde será visualizada la

barra de desplazamiento en caso de que se utilicen lienzos de tipo separador. Tipos de bloques de datos De acuerdo a la necesidad de la aplicación y para optimizar el desarrollo de la misma se tienen diferentes tipo de bloques. Bloque de barra de herramientas Es un bloque donde se añaden los objetos que pertenecerán al toolbar (barra de herramientas) de la aplicación, regularmente son botones típicos de edición, impresión, grabar, hacia delante, hacia atrás, los cuales son programados para que realicen las funciones que les corresponde. Este bloque no pertenece a la base de datos, por lo tanto no se deben parametrizar las propiedades de base de datos y registros en el property palette. Bloques de trabajo Es un bloque utilizado por los programadores, donde se manejan valores necesarios para la aplicación pero que no necesitan ser vistos por el usuario final, se los esconde al no definir en que lienzo debe mostrase. Regularmente tenemos datos de consultas generadas por PL/SQL cargadas en estos elementos del bloque de trabajo. Este tipo de bloque puede estar enlazado con alguna columna de la base de datos de la cual se recoja información, otras veces simplemente los elementos del bloque de trabajo son repositorio transitorio hasta realizar algún proceso. Bloques de información Son los bloques presentados al usuario final, aquí se permiten realizar consultas, ingresar, actualizar o eliminar datos. Dependiendo de la funcionalidad pueden estar enlazados a tablas o procedimientos almacenados, estos últimos trabajan con columnas de las tablas del módulo.

Page 41: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Cuando se desea crear un bloque con el botón Create de la paleta de herramientas, aparece el Asistente de ayuda y allí se puede indicar que vinculo tendrá ese bloque, con una tabla o con un procedimiento, si se hace de esa manera es más fácil. Si se prefiere la creación manual deben especificarse ciertas propiedades en la paleta de propiedades para ese bloque de datos en particular.

En la propiedad Elemento de Base de Datos indique SI Si se trabaja con claves primarias, seleccione SI en la propiedad Clave Primaria

Continúe parametrizando las propiedades restantes, dependiendo de las necesidades de la aplicación. Generalmente las aplicaciones se realizan enlazando los bloques de datos con la base de datos, debido a las transacciones que se manejan, además existen métodos que optimizan el tiempo de consulta a la base de datos.

Elementos gráficos Los elementos gráficos aparecen como una paleta en el editor de diseño del lienzo, esta situado al lado izquierdo de la pantalla. Marcos Son objetos gráficos que aparecen en un lienzo. Se los usa para acomodar varios objetos dentro de un bloque. Esto ayuda porque varias propiedades pueden configurarse para ese marco y permite la estandarización. Texto Fijo Son etiquetas de texto las cuales son editadas en modo de diseño. Texto

Elemento texto

Tipos de elementos

Elemento mostrado Son ítems que únicamente despliegan valores asignados al mismo. No son navegables y comúnmente se utilizan para mostrar valores referenciales.

Elemento de texto Es un recuadro o campo que permite desplegar y además editar texto. Son utilizados para permitir al usuario ingresar información que será posteriormente procesada. Como todos los objetos tienen propiedades que pueden ser configuradas en modo de diseño, o con programación.

Botón Son ítems de interfaz que permite a los usuarios finales ejecutar comandos o iniciar acciones. Se los utiliza para iniciar navegación, desplegar listas de valores, invocar un editor o ventana; y son programados con pl/sql. En Forms se soportan 2 estilos: de texto e icónicos, estos últimos pueden contener un gráfico visible al usuario. Este gráfico tiene que ser un archivo de tipo .ICO.

Grupo de botones de radio Es desplegado como un indicador visual (circulo) y aparece lleno o vacío para indicar el status actual de cada sub-opción. Un radio button debe pertenecer a un radio group menú de dos o mas ítems relacionados.

41

Page 42: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

42

Casilla de control Son casilleros de selección múltiple, los cuales pueden ser configurados en tiempo de diseño o por programación.

Elemento de lista

Es una lista de elementos de texto que pueden ser desplegados de alguna forma: poplist, tlist o combo box. Estas listas muestran números fijos de elementos, estos son cadenas de texto de hasta 30 caracteres. En tiempo de ejecución, programáticamente pueden ser evaluados o eliminados.

Creación de elementos de trabajo Creando el bloque de datos Employees relacionado con el bloque Departments, agregar en el los siguientes elementos en el bloque Employees luego de que éste es diseñado:

L_Total_Linea L_Total_Salario L_Total_General

Asignar a la propiedad Elemento de Base de Datos el valor SI. Ya que éste es un valor de cálculo temporal el cual no es almacenado en base de datos, sino que únicamente se muestra para efectos de resumir o totalizar datos.

Page 43: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Existen 2 métodos de cálculo del valor de un elemento calculado:

43

Fórmula: Se especifican los elementos que se desean operar entre sí, formando una operación aritmética simple o combinada. Formula= :employees.salary*(1+NVL(:employees.commission_pct))

Resumen: Suma o resume los valores de un elemento. Esto es muy útil cuando se requiera sumar los valores que presenta un elemento específico en un bloque de varios registros (Tabular). Resumen= function resumen (suma) Bloque resumido: employees Elemento resumido:salary

El elemento debe residir en un bloque de datos donde la propiedad Consultar todos los registros=SI, o Pre-Calcular=SI.

Page 44: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

44

Como una buena práctica y para indicar que es un elemento que no puede ser modificado, debe definir éste elemento como un tipo de elemento mostrado, utilizado para aquellos elementos que no deben ser manipulados o alterado su valor en tiempo de ejecución. Al ejecutar la aplicación una vez concluida la especificación de las propiedades necesarias para los elementos de fórmula y resumen, ésta debe presentar como sigue a continuación

Page 45: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Listas de Valores El constructor Forms de Oracle ofrece muchas ventajas al contar con asistentes para diseñar y definir ciertos objetos como Listas de Valores y Grupos de Registros, los cuales trabajan conjuntamente. Uso del Asistente A continuación se detalla el uso del Asistente para la creación de listas de valores y grupos de registro. Durante su definición se crea primero el grupo de registros, ya que los valores o registros que obtenga la consulta serán mostrados en la lista de valores. Como ejemplo se elabora una lista de valor basada en la consulta de la tabla Employees, de la cual se consultarán todos los empleados que tengan una jefatura. Para esto se implementará el uso de la siguiente consulta:

select a.employee_id, a.first_name||' '||a.last_name nombre_empleado from employees a where a.employee_id in (select b.manager_id from employees b where a.employee_id = b.manager_id )

O bien, la siguiente creada automáticamente por Query Builder de Oracle Developer.

SELECT DISTINCT A.MANAGER_ID, B.FIRST_NAME, B.LAST_NAME FROM EMPLOYEES A, EMPLOYEES B WHERE (A.MANAGER_ID = B.EMPLOYEE_ID) ORDER BY A.MANAGER_ID ASC

Los elementos marcados MANAGER_ID y L_MANAGER_NAME presentan los valores del código de un empleado jefe (Elemento de base de datos = ‘SI’) y el nombre de empleado jefe (Elemento de base de datos=NO) respectivamente, lo cuales serán utilizados para desplegar la lista de valores y retornar los valores seleccionados de la lista.

45

Page 46: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Creando la lista de valores con el asistente de diseño Seleccione el componente Listas de Valores en el navegador de objetos, presione clic derecho sobre el componente y elija Asistente de Listas de Valores para iniciar la creación de la lista de valores. La lista de valores obtiene los datos de los grupos de registros, éstos últimos se pueden definir con consultas SQL o introduciendo una lista de valores estáticos. Si el grupo de registros existe, selecciónelo de la lista de Grupo de Registros Existente, si la lista de valor es completamente nueva, seleccione Nuevo Grupo de Registros Basado en una Consulta y presione el botón Siguiente. Los grupos de registros pueden basarse en consultas SQL. Si desea introducir o modificar una consulta que es utilizada por un grupo de registros de la lista de valores, puede hacerlo a partir de la creación de una nueva consulta o su importación desde un archivo del tipo SQL almacenado. Si desea obtener ayuda al crear la consulta seleccione Crear Consulta SQL , Oracle le permite utilizar Query Builder de Oracle Developer, donde podrá seleccionar las tablas y columnas que desee presentar y relacionar.

46

Page 47: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

47

Debe seleccionar las tablas que conformarán la consulta, una vez seleccionadas cierre éste diálogo de selección y establezca las relaciones entre las tablas incluidas, de modo que la consulta se defina debidamente normalizada. Para efectos de éste ejemplo, se ha seleccionado la tabla EMPLOYEES dos veces, relacionando la columna Manager_Id de la entidad con alias EMPLOYEES y la columna Employee_Id de la tabla con alias EMPLOYEES_A1.

Ordenar datos por columnas

Una vez establecida la consulta básica, ésta se presentaría de la manera en que lo muestra ésta figura. Sin embargo, puede mejorarse su estructura, utilizando ordenamientos de columnas y asignando un nombre de diferente a los alias de las tablas incluidas en la consulta.

Page 48: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Ordenamiento de datos

Mediante el ícono puede establecer el orden de los datos en la consulta. Seleccione de la lista de Columnas Disponibles, la columna por la cual desea ordenar la información, presione doble-clic o presione

el botón para establecer el grupo de columnas ordenadas. Cambiar Nombre de Tablas Query Builder asigna automáticamente el alias de las tablas incluidas en la consulta, sin embargo, el

nombre de éstas puede ser cambiado mediante el botón (Cambiar nombre de tablas). Seleccione la tabla a modificar y asigne en el campo Nombre Nuevo el nuevo alias de la tabla.

EMPLOYEES A EMPLOYEES_A1 B

48

Page 49: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

De la forma en que se presenta en la figura Consulta A, es creada la consulta con el asistente de Query Builder, en cuyo caso se presentarían tantos registros de un mismo jefe como éste se encuentre asignado a diferentes empleados. De manera que para presentar únicamente un registro de cada jefe y el nombre respectivo, se sustituye la cláusula ALL por DISTINCT.

Consulta A Consulta B

Los datos de presentarían en cada caso como se muestra a continuación: Para una mejor presentación del nombre del empleado, realice la siguiente modificación a la consulta generada:

SELECT DISTINCT A.MANAGER_ID, (B.FIRST_NAME||’ ’||B.LAST_NAME) NOMBRE FROM EMPLOYEES A, EMPLOYEES B WHERE (A.MANAGER_ID = B.EMPLOYEE_ID) ORDER BY A.MANAGER_ID ASC

Los datos serán presentados como se muestra en ésta figura. Este ajuste es necesario debido a que según el diseño de la aplicación, en la cual tenemos únicamente dos campos para retornar los valores de la lista, los cuales son Manager_Id y L_Manager_Name, donde en éste último se debe mostrar el nombre completo del empleado jefe.

49

Page 50: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Una vez que la consulta es definida puede incluir algunas o todas las columnas del grupo de registros en la lista de valores. Seleccione de la lista de Columnas del Grupo de Registros la columna(s) que desea visualizar en la lista de valores y

presione el botón para pasar dichas columnas como parte de la lista de Columnas de la Lista de Valores.

Presione el botón para pasar a la siguiente pantalla. Nuevamente otra ventana le indica que etiquetas llevaran las columnas o si desea usar el default.

50

En la parte inferior de la ventana hay un botón Consultar elemento de retorno, el cual le permite definir cuales serán los elementos que recibirán a cada columna de la consulta. Estos objetos pueden ser elementos de texto o elementos mostrados. Seleccione el elemento del bloque de datos que recibirá el valor de la columna que el usuario elige de la lista de valores en tiempo de ejecución. Avance a la siguiente pantalla presionando Siguiente >

Page 51: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

En ésta pantalla debe definir algunos valores a ciertas atributos de la lista. Para éste ejemplo asigne el título Lista de Jefes, modifique los valores por defecto del ancho y la altura de la ventana de la lista de valores, asignando 300 y 350 respectivamente. Forms colocará la lista de valores automáticamente.

51

Avance a la siguiente pantalla presionando Siguiente > Si desea modificar las propiedades avanzadas puede hacerlo. Recuperar # de filas cada vez permite limitar la cantidad de filas que muestra la lista de valores. Refrescar los datos del grupo de registros antes de mostrar la lista de valores permite actualizar datos que hayan sido incluidos durante el tiempo en que se ha interactuado con una aplicación sin salir de ella, presentando en la lista de valores cualquier cambio en las tablas que la conforman. Permitir al usuario filtrar los registros antes de mostrarlos es una funcionalidad que en tiempo de ejecución permitirá al usuario final filtrar información antes de que los valores de la lista sean mostrados en pantalla. Avance a la siguiente pantalla presionando Siguiente >

Page 52: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

De los elementos que se seleccionaron como valores de retorno, se han seleccionado el Manager_Id y L_Manager_Name donde se asignarán el código y el nombre del empleado jefe.

52

Asigne a alguno de éstos elementos o a todos la lista de valores, con el fin de que el usuario presionando la combinación de teclas CTRL+L pueda levantar la lista de valores. Importante: los elementos deben ser de tipo Elemento de Texto, en éste caso Manager_Id es elemento de texto y L_Manager_Name es elemento mostrado por lo tanto éste último al ser un elemento que nunca podrá tener el foco de edición, no tendrá sentido asignarle la lista de valores. Una vez asignada la lista de valores al elemento presione el botón Siguiente > El asistente ha completado la definición de la lista

de valores, presione el botón para crear el grupo de registros y la lista de valores. El navegador de objetos mostrará y asignará un nombre y un consecutivo de grupo de registros y lista de valores, el cual podrá modificar editándolos. Si desea modificar la lista de valores en un futuro, vuelva a llamar al asistente de diseño de listas de valores y modifique los atributos que considere necesarios.

Page 53: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Creando listas de valores manualmente Creación de Grupo de Registros

Se abre la forma a la cual se le añadirá el Grupo de Registros. Luego se da clic en el componente de Grupo de Registros en el navegador de objetos y en la

paleta de herramientas escoja Crear (+) Aparece una ventana para la creación de la consulta o indicar que se trabajara con valores

estáticos. Escoja la opción que necesite. Clic en aceptar. Aparecerá el nuevo objeto Record Group.

Creación de la Lista de Valores

Previamente creado el grupo de registros se da clic en el componente Lista de Valores del navegador de objetos y en la paleta de herramientas escoja Crear (+)

Aparece una ventana la cual indica el modo de creación (manual o Asistente). Escoja Manual. Presione Aceptar.

Luego diríjase a la paleta de propiedades de la nueva lista de valores. Defina cual Grupo de Registros se utilizará en la propiedad Grupo de Registros. Luego en la propiedad Propiedades de Correspondencia de Columnas, indique cuales columnas

serán retornadas a los elementos del bloque de datos. Finalizado esto debe indicar al botón que disparara la lista de valores, cual lista de valores debe

ejecutarse (Ver código en la parte superior). Si fuera un text item quien dispara la lista de valores, se define en la propiedad Lista de Valores del elemento de texto cual Lista de Valores se invocará.

Alertas Una alerta es una ventana modal que despliega un mensaje el cual notifica al operador sobre alguna condición de la aplicación. Existen 3 estilos de alertas: Parar, Atención y Nota.

53

Cada estilo de alerta mostrará una figura diferente. La cantidad de botones en una alerta será definida por la cantidad de Etiquetas de Botón con contenido. Es decir, si se necesita una alerta que presente un mensaje, ésta deberá tener el texto Aceptar en la Etiqueta del Botón 1, y las etiquetas del botón 1 y 2 deben de dejarse sin contenido.

Page 54: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

54

Disparadores Los disparadores responden a eventos que se ejecutan en una aplicación en tiempo de ejecución, con el objetivo de ejecutar ciertas rutinas, dependiendo del procedimiento invocado. Explicación principales disparadores definidos

Existe división de categorías funcionales para los disparadores: ° Disparadores para procesamiento de bloques ° Disparadores para eventos de interfaz ° Disparadores para maestro-detalle ° Disparadores para el manejo de mensajes de error ° Disparadores de navegación ° Disparadores para tiempo de consulta ° Disparadores transaccionales ° Disparadores de validación

Disparadores para procesamiento de bloques .- Estos triggers se disparan en respuesta a eventos relacionados en la administración de un registro en un bloque. When-Create-Record Realiza una acción cuando se intenta crear un nuevo registro en un

bloque. When-Clear-Block Realiza una acción cuando se elimina el registro actual. Remueve

todos los registros del bloque. When-Database-Record Realiza una acción cuando cambia el estado del registro para

insertar, actualizar, así se indica que el registro será procesado por la siguiente operación COMMIT_FORM.

When-Remove-Record Realiza una acción cuando un registro es limpiado o eliminado. Disparadores para eventos de interfaz.- Son disparados en los eventos que ocurren en la interfaz de la forma. When-Button-Pressed Inicia una acción cuando un operador selecciona un botón

(mouse/tecla). Key-Commit Se ejecuta cuando se realiza la acción COMMIT, con la tecla F10. Key-Entqry Inicia acción cuando se entra el modo de consulta (tecla F7). Key-Exeqry Inicia acción cuando se ejecuta la consulta (tecla F8). When-Timer-Expired Inicia una acción cuando expira el timer programático. When-Window-Activated Inicia una acción cuando un operador o aplicación activa una

ventana.

Page 55: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

55

When-Window-Closed Inicia una acción cuando un operador cierra una ventana con el comando Close del administrador de ventana.

Disparadores Maestro-Detalle .- Son generados automáticamente al definirse una relación maestro-detalle entre bloques. Estos obligan la coordinación entre registros en un bloque detalle y en el registro maestro del bloque maestro. On-Check-Delete-Master Se dispara cuando se intenta eliminar un registro en un bloque que es un bloque maestro en una relación maestro-detalle. On-Clear-Details Se dispara cuando se necesitan limpiar registros en un bloque que es un bloque detalle en una relación maestro-detalle. Disparadores para el manejo de mensajes de error.- Form Builder envía mensajes de información y error en respuesta a eventos en tiempo de ejecución. On-Error Reemplaza un mensaje de error default con un mensaje de error personalizado. Disparadores de navegación.- Responden a eventos de navegación. Por ejemplo cuando el usuario da un clic en un ítem de texto en otro bloque, un disparador de navegación se dispara y Forms mueve el foco de ingreso desde el ítem actual al ítem objetivo. Pueden dispararse en respuesta a eventos internos de navegación que ocurren durante el procesamiento de la forma. Se subdividen en 2 categorías: Pre-trigger y Post-trigger. Listado de Disparadores de Navegación: Pre-Block, Pre-Record, Pre-Text-Item, Post-Text-Item, Post-Record, Post-Block. Pre-Form Se dispara durante el evento de Entrar a la forma, al inicio de la forma. Post-Form Realiza una acción cuando Forms sale de la forma. Además, existen los disparadores When-New-Instance-Triggers que se disparan al final de la secuencia de navegación que ubica el foco en un ítem diferente. Estos son: When-New-Block-Instance, When-New-Record-Instance, When-New-Item-Instance. When-New-Form-Instance Realiza una acción al iniciar la forma. Se ejecuta después del

disparador Pre-Form. Disparadores para tiempo de consulta.- Son disparados antes y justo después que el usuario o la aplicación ejecuta una consulta en un bloque. Estos disparadores son : Pre-Query Valida el criterio de consulta actual o provee programáticamente criterio adicional. Post-Query Realiza una acción después de recuperar un registro. Se dispara una vez para cada

registro dentro del bloque. Disparadores transaccionales.- Se disparan en respuesta a varios eventos que ocurren cuando la forma interactúa con la fuente de datos. Los triggers son: On-Delete, On-Insert, On-Lock, On-Logout, On-Update,

Page 56: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

56

Post-Database-Commit, Post-Delete, Post-Forms-Commit, Post-Insert, Post-Update, Pre-Commit, Pre-Delete, Pre-Insert, Pre-Update. On-Logon Se dispara para cada logon a la base de datos. Disparadores de validación.- Se disparan cuando Form Builder valida datos en un ítem o registro. La validación la chequea durante la navegación que ocurre por control de programación, procesamiento, etc. When-Validate-Item Se dispara en la ultima parte de la validación del ítem para los

ítems con el estado de validación Nuevo o Modificado. When-Validate-Record Se dispara durante el proceso de validación de registros, en la

ultima parte de la validación del registro para los registros con estado Nuevo o Modificado.

Otros Disparadores When-Button-Pressed Se dispara cuando se selecciona un botón al dar un clic o usar el

teclado. Es definido a nivel de forma, bloque o ítem. When-Mouse-Click Se dispara después de hacer click con el ratón, si ocurren estos

eventos: click en lienzos o elementos de la forma. When-Mouse-Enter Se dispara cuando el mouse entra a un ítem o canvas. When-Mouse-Leave Se dispara cuando el mouse sale de un ítem o canvas.

Page 57: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Implementación de Disparadores más comunes POST-QUERY

Se implementó el disparador PORT-QUERY mediante un cursor el cual obtiene el nombre del jefe, consultando el código del empleado en la tabla EMPLOYEES y que corresponda al código de jefe del registro actual en el bloque de departamentos. Recordemos que éste disparador se ejecuta luego de realizada la consulta a la base de datos y presentados lo datos en el bloque. Este disparador se ejecuta para todos los registros recuperados y visualizados en el bloque de datos.

WHEN-VALIDATE-ITEM

57

El When-Validate-Item es un disparador que podría implementarse igual que el POST-QUERY para la recuperación y validación del dato, incorporando el comando Raise Form_Trigger_Failure dentro de la validación de localización del registro. Sin embargo, para implementar un ejemplo diferente, se realiza la validación haciendo una consulta directa y utilizando el manejo de excepciones para identificar si se logró o no encontrar el registro. En éste caso si el registro es encontrado lo asigna directamente al elemento L_Manager_Name, el registro no es encontrado, el proceso se va a la sección

de excepciones inmediantamente, ejecutando el código dentro de la excepción WHEN NO_DATA_FOUND, asignando el código no existe al elemento L_Manager_Name. En caso de presentarse cualquier otro error se ejecuta la excepción WHEN OTHERS, la cual mostraría el mensaje de error de SQL, el cual no permitiría identificar con precisión el error presentado. Recordemos que éste disparador se ejecuta luego de realizada cualquier modificación de información en un elemento, cuando el bloque de datos se encuentra en estado NEW.

Page 58: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

58

PRE-FORM

El Pre_Form es un disparador que se ejecuta inmediatamente que se ingresa a una pantalla, en éste se puede cargar valores iniciales de trabajo que definen el entorno de operación en una aplicación. Para una mejor ilustración tome como ejemplo el código fuente que se presenta en el disparador Pre-Form de ésta figura, donde se implementa la carga de un elemento de tipo lista a partir de los valores de la tabla Departements del esquema HR. Para esto utilizamos el procedimiento Gen_Carga_ListItem contenido en la Biblioteca Pl/Sql llamada General.pll. Esta unidad de programa consiste en llenar un elemento de tipo lista a partir de la construcción de una consulta a la base

de datos, recibiendo los parámetros necesarios para conformar la estructura de dicha consulta. Bliblioteca:General.pll PROCEDURE GEN_CARGA_LISTITEM(Campo In Varchar2, -- campo tipo lista de manera: bloque.campo

Codigo In Varchar2, -- Valor del campo a guardar en la lista Des In Varchar2, -- Descripción del campo a guardar en la lista.

Tabla In Varchar2, -- Nombre de Tabla de la cual se cargan valores Where_ In Varchar2 Default Null, -- Condiciones de la consulta. Order_ In Varchar2 Default Null, -- Ordenamiento de los valores a mostrar en la lista. GloDef In Varchar2 Default Null -- Global para utilización de valor inicial del campo.

) IS RG RecordGroup; Status Number; NomRG varchar2(20); Consulta varchar2(2000); Inicial varchar2(500); BEGIN -- Se crea la consulta para cargar los valores de la lista. Consulta := 'Select '||Des||' DES, '||Codigo||' COD From '||Tabla; IF Where_ is not null then Consulta := Consulta ||' Where '||Where_; End If; IF Order_ is not null then Consulta := Consulta ||' Order by '||Order_; end if; -- Si el RG ya existe, lo elimina para crear la nueva consulta. RG := Find_Group('GRUPO_LISTA'); IF Not Id_Null(Rg) Then Delete_Group (RG); End IF; -- Crea Record group. NomRG := 'GRUPO_LISTA'; RG := Create_Group_From_Query (NomRG,Consulta); Status := Populate_Group (RG); Clear_List (Campo); Populate_List (Campo,RG); -- Asignar a la global el primer valor if (GloDef is not null) and (Get_Group_Row_Count(RG) > 0) then Inicial := Get_Group_Char_Cell (NomRG||'.COD',1); Copy (Inicial,GloDef); end if; Delete_Group (RG); EXCEPTION When Others Then Gen_Mensaje('<Gen_Carga_ListItem>..Error interno en rutina de carga de campo lista.. '||SqlErrM); Raise Form_Trigger_Failure; END;

Page 59: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Continuando con la implementación del elemento de lista dinámico, es necesario definir la propiedad Tipo de Elemento en la paleta de propiedades como Elemento de Lista.

Una vez definido el tipo de elemento y debido a que el elemento de lista se llena a partir de los datos en una tabla, no deben existir valores en la propiedad Elementos en Lista, los cuales son creados por defecto y deben eliminarse, tanto el Elemento de Lista como el Valor de Elemento de Lista.

Asegúrese de conectar la biblioteca General.pll para poder utilizar la unidad de programa Gen_Carga_ListItem contenida en ella. Al ejecutar la aplicación ésta deberá presentarse como se observa en la siguiente figura.

59

Page 60: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Bibliotecas PL/SQL Es una colección de subprogramas, incluyendo procedimientos, funciones y paquetes, los cuales pueden compartirse entre distintas aplicaciones. Esto ayuda a la estandarización del desarrollo. Crear una librería nueva Para crear una Biblioteca, debe ubicarse en el componente Bibliotecas PL/SQL, y presionar el botón crear en el panel vertical, seguidamente Forms creará el objeto en ésta sección de componentes con un nombre lógico temporal, el cual será almacenado con el nombre que se le defina. Una vez almacenada la biblioteca en disco, podemos incorporarle funciones, procedimientos y paquetes, tal y como se muestra en la siguiente figura.

60

Page 61: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

61

Como se puede apreciar, esta biblioteca llamada, General.pll, contiene una serie de procedimientos y funciones que se convierten en código flexible y estándar, el cual puede ser utilizado por cualquier aplicación que conecte ésta biblioteca. Una vez creada la biblioteca, ésta puede ser recuperada para adicionarle o modificarle cualquier de las unidades de programa que la componen. Luego de realizar cualquier cambio en la biblioteca, ésta debe ser compilada completamente utilizando la combinación de teclas CTRL+SHIFT+K. Posteriormente con CTRL+T debe generar el módulo compilado, para su utilización en ambiente de ejecución.

Conectar Bibliotecas Son vínculos a las librerías del sistema de archivos, las cuales tienen procedimientos, paquetes y funciones que realizan ciertas operaciones al momento de ejecutar la aplicación.

Para conectar una biblioteca PL/SQL, debe ubicarse en el componente Bibliotecas Conectadas, y presionar el botón crear en el panel vertical, seguidamente Forms abrirá un diálogo de conexión, donde deberá buscar el archivo con extensión PLL y seleccionarlo para conectarlo a la aplicación.

Al conectar la biblioteca Forms le solicitará que indique si desea eliminar la ruta de acceso, si la elimina deberá definir la ruta en la variable FORMS_PATH en el Regedit y en el archivo ambiente *.env del ambiente de ejecución. Si no elimina la ruta se debe tener en cuenta que la aplicación buscará tanto en ambiente de desarrollo como de ejecución la biblioteca en la ubicación donde originalmente se encontraba almacenada en el momento de conectarla a la aplicación.

Page 62: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Unidades de Programa Son procedimientos o funciones a nivel de la forma, las cuales tiene la lógica de programación con la que interactúan los objetos de la forma. Para ilustrar mejor éste concepto, confeccionará un elemento de tipo Árbol Jerárquico a partir de la tabla de Employees del esquema HR, el cual será cargado utilizando una unidad de programa local a la forma de Empleados.fmb. Como primer paso se debe crear el componente Grupo de Registro al cual le asignaremos el nombre Gr_Tree_Empleados, incorporando la consulta que se presenta en la siguiente figura. Implementación de un árbol jerárquico

62

ree el bloque de datos manualmente con el nombre

Para la construcción de un árbol jerárquico a partir de una tabla se debe respetar la siguiente estructura:

1. Valores numéricos 0 y 1 que indican si el árbol se presenta con todos sus nodos colapsados o expandidos respectivamente.

2. Nivel de jerárquía del nodo en el árbol. 3. Descripción que será mostrada en el árbol. 4. Ícono con que se desea visualizar un nivel o

jerarquía de nodos. 5. Valor al que responde o que encapsula el nodo.

CB_Tree_Empleados no basado en tablas y agregue en este un nuevo elemento de tipo Árbol Jerárquico con el nombre TREE, vaya a la sección funcional de la paleta de propiedades y asóciele el Grupo de Registros Gr_Tree_Empleados y finalmente vincúlelo al lienzo donde se desea visualizar.

Page 63: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

Tome el siguiente procedimiento e inclúyalo como una unidad de programa local a la forma Empledos.fmb, con el nombre Tree_Carga_Rg. PROCEDURE TREE_CARGA_RG (p_Campo In Varchar2, -- Item tipo árbol p_NomRG In Varchar2 -- Nombre del Record Group asociado ) IS v_Status Number := 0; -- Almacena resultado de ejecución de RG. RG RecordGroup; -- Record group de cuentas contables definidas. BEGIN -- Asigna el Record Group al campo determinado FTree.Set_Tree_Property(p_Campo,FTree.Record_Group,p_NomRG); -- Asigna el cursor como ocupado Set_Application_Property(Cursor_Style,'Busy'); -- Ejecuta el record group con el cual se cargará el árbol v_Status := Populate_Group(p_NomRG); :Parameter.Par_TotNodos := Get_Group_Row_Count(p_NomRG); -- Carga elementos en el árbol FTree.Populate_Tree(p_Campo); -- Restaura el estilo del mouse para indica que ya finalizó el proceso Set_Application_Property(Cursor_Style,'Default'); -- Establece el primer elemento del árbol como Seleccionado FTree.Set_Tree_Selection(p_Campo, 1, FTree.Select_On); END;

Una vez incluido el procedimiento en la forma, incluya en el disparador When-New-Form-Instance el llamado al procedimiento Tree_Carga_Rg para que sea cargado el elemento de tipo Árbol Jerárquico del bloque B_Tree_Empleados y puedan ser visualizados los registros de la tabla Employees según la jerarquía de jefatura asignada a cada empleado, según la consulta implementada en el grupo de registros GR_TREE_EMPLEADOS. El procedimiento Tree_Carga_Rg cargará los registros recuperados en el grupo de registros GR_TREE_EMPLEADOS en el elemento de tipo árbol B_Tree_Empleados.Tree, presentándolo como se muestra en la ésta figura.

63

Page 64: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

64

Como ejercicio adicional y explotando la funcionalidad que permite el elemento de tipo árbol, cree el siguiente procedimiento en como una unidad de programa local a la forma Empleados.fmb, con el nombre Tree_Nodos_Seleccianados, la cual recorrerá cada uno de los nodos seleccionados en el árbol y utilizaremos para que realice una consulta al bloque Employees y presente la información de cada empleado seleccionado en el árbol, simulando una relación entre bloques de datos. La selección de registros puede ser múltiple, presentando los mismos registros en el bloque empleados que fueron seleccionados en el árbol. PROCEDURE tree_nodos_seleccionados ( p_campoarbol IN VARCHAR2, -- Campo tipo árbol por controlar p_rgelementos OUT recordgroup, -- Rg donde almacena elem seleccionados p_colcodigo OUT groupcolumn, -- Columna a consultar posteriormente p_totelementos OUT NUMBER, -- # Elementos seleccionados p_selecpadres IN BOOLEAN DEFAULT FALSE -- Indica si se desean seleccionar los padres ) IS htree item := FIND_ITEM (p_campoarbol); v_nodoactual ftree.node; -- Almacena c/nodo seleccionado v_nodotmp ftree.node; -- Nodo padre temporal v_idtmp_rg recordgroup; v_valor_nodo VARCHAR2 (100); -- Almacena el valor del nodo v_tipo_nivel VARCHAR2 (2); -- Almacena el tipo de nivel que se extrae del árbol (1:Uen, 2:Proceso, 3:Funcionario) v_primera_vez BOOLEAN := TRUE; v_error VARCHAR2 (2000) := NULL; BEGIN IF ID_NULL (htree) THEN gen_error ( 'El campo tipo árbol: ' || p_campoarbol || ' no existe en la forma actual.' ); RAISE form_trigger_failure; END IF; -- Si no existen elementos seleccionados, solamente sale p_totelementos := ftree.GET_TREE_PROPERTY (htree, ftree.selection_count); IF p_totelementos = 0 THEN RETURN; END IF; -- Si el grupo por crear existe, lo borra v_idtmp_rg := FIND_GROUP ('Grupo_Elementos'); IF NOT ID_NULL (v_idtmp_rg) THEN DELETE_GROUP (v_idtmp_rg); END IF; -- Crea el record group y lo devuelve para luego permitir obtener los -- elementos seleccionados p_rgelementos := CREATE_GROUP ('Grupo_Elementos'); -- Crea la columna que almacena el valor de cada nodo seleccionado p_colcodigo := ADD_GROUP_COLUMN (p_rgelementos, 'COD', char_column, 100); -- Se recorren todos los nodos del árbol seleccionados, y si tiene padre, marca -- selecciona el padre. IF p_selecpadres THEN FOR nodopadre IN 1 .. p_totelementos LOOP -- Obtiene el nodo seleccionado v_nodoactual := ftree.GET_TREE_SELECTION (htree, nodopadre); -- Obtiene el padre (si es que tiene) v_nodotmp := NULL; v_nodotmp := ftree.GET_TREE_NODE_PARENT (htree, v_nodoactual); IF v_nodotmp <> 0 THEN ftree.SET_TREE_SELECTION (htree, v_nodotmp, ftree.select_on); END IF; END LOOP; END IF; -- Obtiene de nuevo los elementos seleccionados p_totelementos := ftree.GET_TREE_PROPERTY (htree, ftree.selection_count); IF p_totelementos = 0 THEN RETURN; END IF; :parameter.estatuto_sql := 'Where employee_id In ( '; -- En realidad, al seleccionarse nodos en un árbol, éste les asigna un índice, por lo que -- solamente debe recorrese cada elemento y obtener dicha selección FOR elemento IN 1 .. p_totelementos

Page 65: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

LOOP v_nodoactual := ftree.GET_TREE_SELECTION (htree, elemento); v_valor_nodo := UPPER (ftree.GET_TREE_NODE_PROPERTY (htree, v_nodoactual, ftree.node_value ) ); -- Incluye nueva línea y Asigna el valor al Recor group de elementos ADD_GROUP_ROW (p_rgelementos, end_of_group); SET_GROUP_CHAR_CELL (p_colcodigo, elemento, v_valor_nodo); IF NOT v_primera_vez THEN :parameter.estatuto_sql := :parameter.estatuto_sql || ', ' || v_valor_nodo; ELSE :parameter.estatuto_sql := :parameter.estatuto_sql || v_valor_nodo; v_primera_vez := FALSE; END IF; END LOOP; :parameter.estatuto_sql := :parameter.estatuto_sql || ') '; -- Ejecuta el estatuto sql para visualizar el registro en el bloque de mantenimiento -- que corresponde al valor del dato seleccionado en el arbol IF NOT gen_ejecutaqueryconwhere (:parameter.estatuto_sql, -- Estatuto SQL 'Employees' -- Bloque donde se ejecutará la consulta ) THEN NULL; END IF; RETURN; END;

Seguidamente incluya en el elemento B_Tree_Empleados.Tree el disparador When-Tree-Node_Selected e ingrese el siguiente código, el cual será ejecutado cada vez que se seleccione uno o más nodos del árbol. Disparador When-Tree-Node_Selected Declare v_RGElementos RecordGroup; -- Rg donde almacena elem seleccionados v_ColCodigo GroupColumn; -- Columna a consultar posteriormente v_TotElementos Number; v_BloqueActual Varchar2(50); Begin Tree_Nodos_Seleccionados ('B_TREE_EMPLEADOS.TREE', -- Elemento de tipo arbol v_RGElementos, -- Grupo de registro donde almacena elem seleccionados v_ColCodigo, -- Columna a consultar posteriormente v_TotElementos); End;

65

Page 66: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

66

Posteriormente a la implementación correcta del disparador When-Tree-Node_Selected compile y ejecute la aplicación. Seleccione uno o varios registros del árbol y observe como simultáneamente son consultados los registros en el bloque de datos Employees. Para lograr esta funcionalidad se incluye el siguiente código en la unidad de programa Tree_Nodos_Seleccionados, el cual incrusta en la cláusula Where del bloque, la condición de búsqueda dinámicamente, donde el parámetro Estatuto_Sql contiene la condición Employee_Id In (valor1, valorN…). La función Gen_EjecutaQueryConWhere se encuentra en la biblioteca General.pll, la cual se encarga de armar la cláusula de condición. -- Ejecuta el estatuto sql para visualizar el registro en el bloque de mantenimiento -- que corresponde al valor del dato seleccionado en el arbol IF NOT gen_ejecutaqueryconwhere (:parameter.estatuto_sql, -- Estatuto SQL 'Employees' -- Bloque donde se ejecutará la consulta ) THEN NULL; END IF;

Función Gen_EjecutaQueryConWhere integrado a la biblioteca General.pll. FUNCTION gen_ejecutaqueryconwhere ( p_estatutosql IN VARCHAR2, -- Estatuto SQL p_bloque IN VARCHAR2, -- Bloque donde se ejecutará la consulta p_num_registro NUMBER DEFAULT 1 -- Registro en el que se debe posicionarse posterior a la consulta ) RETURN BOOLEAN IS /* OBJETIVO.........: Ejecutar un query para un bloque dado, utilizando la cláusula WHERE dada en el estatuto SQL en P_EstatutoSQL REQUIERE.........: Que existe la palabra WHERE, sino retorna FALSE RESTRICCIONES....: Si el valor de la consulta no corresponde al bloque en el parámetro P_Bloque se ocurrirá un error de consulta en tiempo de ejecución. EFECT SECUNDARIOS: Mueve el cursor al bloque pasado en P_Bloque CONSIDERACIONES..: Si se utiliza el valor de la variable de sistema :System.Last_Query para asignarlo al Estatuto Sql que se recibe en el parámetro P_EstatutoSql, dicho valor debe ser asignado a un parámetro o item local caracter con una presición de 2000 y ejecutado desde el Trigger Post-Query del Bloque para el cual se ejecutará la consulta. Para que no se refresque el valor en el parámetro o varible local se puede condicionar a que dicho valor sea nulo para ser asignado, limpiándose en el trigger Key-ExeQry del mismo bloque. */ v_whereanterior VARCHAR2 (5000); v_wherenuevo VARCHAR2 (5000); v_orderbyanterior VARCHAR2 (5000); v_poswhere NUMBER; v_posorderby NUMBER; v_ret BOOLEAN := FALSE; BEGIN IF p_estatutosql IS NOT NULL THEN -- Guarda el valor anterior v_whereanterior := GET_BLOCK_PROPERTY (p_bloque, default_where); -- Obtiene la posicion del WHERE en el estatuto v_poswhere := INSTR (UPPER (p_estatutosql), 'WHERE'); IF v_poswhere != 0 THEN -- Determina si hay un order by v_posorderby := INSTR (UPPER (p_estatutosql), 'ORDER BY'); -- Obtiene el estatuto WHERE IF v_posorderby = 0 THEN v_wherenuevo := SUBSTR (UPPER (p_estatutosql), v_poswhere); ELSE v_wherenuevo := SUBSTR (UPPER (p_estatutosql), v_poswhere, v_posorderby - v_poswhere ); END IF; -- Cambia el estatuto WHERE, respaldando el anterior SET_BLOCK_PROPERTY (p_bloque, default_where, v_wherenuevo); END IF; GO_BLOCK (p_bloque); EXECUTE_QUERY; -- ejecuta la consulta

Page 67: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

-- Determina si el registro en el cual se va a posicionar es mayor que el número -- de registros traido por la consulta, si lo es se queda en el último registro LAST_RECORD; IF p_num_registro <= GET_BLOCK_PROPERTY (p_bloque, current_record) THEN GO_RECORD (p_num_registro); END IF; -- restaura el where anterior SET_BLOCK_PROPERTY (p_bloque, default_where, v_whereanterior); v_ret := TRUE; ELSE GO_BLOCK (p_bloque); EXECUTE_QUERY; END IF; RETURN v_ret; END;

67

Page 68: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

68

Excepciones, RETURN y EXIT En Developer Forms se manejan las excepciones que son situaciones las cuales generan error y no son manejadas por Oracle, entonces la aplicación le indica al usuario la anomalía y el programa muestra un mensaje de error o precaución. Las excepciones se definen en la parte final del procedimiento o función, dentro de ella no se escribe begin o end para que realice la tarea que se especificará. EXCEPTION

Nombre de la excepción THEN /* indicaciones a realizar cuando se dispare la excepción */

Ejemplo: Function Gen_EjecutarSql ( Instrucción in varchar2, Err out varchar2 ) Return boolean IS BEGIN if Form_Success then Return (true); else Err := DBMS_Error_Text; Return (false); end if; EXCEPTION when OTHERS then Err := DBMS_Error_Text||' / '||SqlErrM; Return (false); END;

Manejo de Errores con ERROR_CODE, ERROR_TEXT Error Code: retorna el número del error que genero Form Builder. Error_Text : retorna el mensaje de error que generó Form Builder. Trigger: On-Error DECLARE errnum NUMBER := ERROR_CODE; errtxt VARCHAR2(80) := ERROR_TEXT; BEGIN IF errnum = 40301 THEN Message('Criterio de búsqueda erróneo); END IF; END; Diferencias con SQLCODE SQLCODE captura los errores Oracle, si se desea usarlo en Forms, debe estar especificado dentro de las excepciones. Su uso es popular con la excepción WHEN OTHERS.

Page 69: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

69

DECLARE lv_sqlcode NUMBER; lv_sqlerrm VARCHAR2(240); lv_constr VARCHAR2(41); BEGIN UPDATE empleados SET dept = 5 WHERE PRIMARY_KEY_FIELD = :BLOCK.PK; EXCEPTION WHEN OTHERS THEN lv_sqlcode := SQLCODE; lv_sqlerrm := SQLERRM; IF (lv_sqlcode = -2290) THEN lv_constr := strip_constraint_name(lv_sqlerrm); END IF; END; Errores FRM Cuando se programa en Forms Builder, puede aparecer errores a nivel de la forma, estos errores se denotan con las siglas FRM seguidas de números.

Page 70: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

70

Uso de Identificadores Identificadores Locales Son las variables locales o aquellas que están en el ámbito del procedimiento/función. Son utilizadas por el procedimiento y pueden recibir valores externos por medio de parámetros. Identificadores del Sistema Es una variable de Form Builder que mantiene rastro de un estado interno de Form Builder. Los valores de estas variables se aplican solamente a la forma actual. A continuación una lista de las variables del sistema más utilizadas: :system.BLOCK_STATUS: Representa el estado del bloque de datos donde el cursor está localizado. :system.CURRENT_BLOCK: Retorna el valor del bloque actual si el foco esta en ítem, registro o bloque (Pre-Item, Post-Item, triggers de registro y bloque) , de lo contrario retorna NULL, si el foco esta en un a forma (Triggers Pre–Form, Post-Form). :system.CURRENT_ITEM: Representa el nombre del bloque e ítem (bloque.ítem) donde el foco esta localizado. Es un cadena de caracteres. :system.CURRENT_VALUE: Representa el valor del ítem donde el cursor esta localizado. Identificadores Globales - De Paquete: Son variables globales definidas por el usuario en un paquete, el cual puede estar en el

filesystem o base de datos. - GLOBAL: Estas variables tienen declaración implícita, es decir que no necesitan ser declaradas,

simplemente cuando se necesita se las crea. Son tipo varchar.

Referencia a Objetos de la forma Al desarrollar en Form Builder, se pueden referenciar objetos de la forma, dentro de los procedimientos, funciones y triggers, pueden ser utilizados para realizar validaciones y consultas. Estos objetos tienen valores que pueden ingresar como parámetros. Se los referencia de la siguiente manera: Situando : (dos puntos) delante del objeto.

: nombre_objeto (podría ser un ítem) : nombre_bloque.nombre_objeto (formato bloque.item)

Page 71: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

71

Referencia indirecta a Objetos con NAME_IN

Se utiliza la función NAME_IN para retornar el valor de una variable enviada como parámetro a esta función. Declare v_tm Varchar2(20); Begin Default_Value( '0', v_tm ); If name_in(v_tm) is null then v_tm := ‘1’; Else Procesar(v_tm); End if; End

Código provisto por DEVELOPER - Regedit : Cuando se necesitan especificar ciertos valores que dependen de variables de entorno, ya

sean propias de Oracle o definidas por el usuario, existe un procedimiento que nos permite capturar esos valores y manipular el resultado para procesos de validación. El procedimiento se llama tool_env.getvar (variable_de_ambiente, variable); tool_env.getvar (‘EV_COMPANY’, Lv_Compania); - Esta sentencia esta almacenando el valor de EV_COMPANY en Lv_Compania.

- Propiedades de Items: A los ítems se les puede modificar las propiedades en tiempo de ejecución. Existe la función GET_ITEM_PROPERTY que recupera la propiedad especifica del ítem también existe el procedimiento SET_ITEM_PROPERTY, que modifica la propiedad en cierto ítem. La sintáxis de GET_ITEM_PROPERTY: GET_ITEM_PROPERTY (item_id, ITEM, property NUMBER); GET_ITEM_PROPERTY (item_name VARCHAR2, property NUMBER); Se debe tomar en cuenta que existen ciertas propiedades que no están especificadas para todos los ítems, por esto si se desea setear o recuperar la propiedad de cierto ítem y en él no aplica la propiedad, generará error. Cuando se utiliza set_item_property, solo se puede modificar la propiedad a un solo ítem. La sintaxis de este procedimiento es amplia, a continuación se detalla la parametrización comúnmente usada. SET_ITEM_PROPERTY (item_id ITEM, property NUMBER, value VARCHAR2); SET_ITEM_PROPERTY (item_name VARCHAR2, property NUMBER, value VARCHAR2);

Page 72: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

72

- Navegación entre Objetos: Cuando se tienen módulo de consultas o ingresos en los que se requiere

llenar rápidamente los parámetros, es necesario manejar una buena navegación entre objetos. Así también en el aspecto de programación, el desarrollador debe indicarle a los procedimientos en que campos depositar los datos, por cual registro iniciar la navegación. Algunas ocasiones se nos presentan errores en la consulta de datos y se debe a que no se ha especificado directamente a cual bloque se llevarán los datos.

- GO_BLOCK: Indica a que bloque se debe fijar el foco para el ingreso / consulta de datos. La sintaxis es la siguiente: GO_BLOCK (‘NOMBRE_DEL_BLOQUE’)

- GO_ITEM: Indica a que objeto debe fijarse el foco de ingreso . La sintaxis es así:

- GO_ITEM (item_id Item); å Antes de definir el tipo ITEM se debe hacer FIND_ITEM para retornar un valor tipo ITEM y ejecutar el procedimiento GO_ITEM con esta parametrización. - GO_ITEM (‘:nombre_bloque.nombre_item);

NEXT_ITEM: Navega al siguiente ítem, regularmente se programa en el trigger KEY-NEXT-ITEM. Este procedimiento no recibe parámetros. La sintaxis es: NEXT_ITEM; PREVIOUS_ITEM: Navega al ítem anterior navegable. La sintaxis es: PREVIOUS_ITEM;

/* Trigger: Key-Previous-Item */ DECLARE cur_itm VARCHAR2(80) := :System.Cursor_Item; cur_blk VARCHAR2(80) := :System.Cursor_Block; frs_itm VARCHAR2(80); BEGIN frs_itm := cur_blk||'.'||Get_Block_Property(cur_blk,FIRST_ITEM); IF cur_itm = frs_itm THEN Previous_Block; ELSE Previous_Item; END IF; END;

- Menú: Dentro de las formas se pueden manejar los menúes para indicar cual debe aparecer o

esconderse. Para esto existe el procedimiento REPLACE_MENU. Este procedimiento reemplaza el menú actual con el menú que se especifica, pero no lo hace activo al nuevo menú. La sintaxis común es REPLACE_MENU; Pero dependiendo de la necesidad existen mas parámetros para definir en la programación. Por ejemplo: REPLACE_MENU (‘nombre_menu’);

Page 73: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

73

Navegación entre registros Forms trabaja con formularios multiregistros, es decir es un arreglo de registros para el ingreso/consulta de datos. Se utilizan los siguientes procedimientos para trabajar con estos : FIRST_RECORD, NEXT_RECORD, LAST_RECORD, GO_RECORD, INSERT_RECORD, DELETE_RECORD. FIRST_RECORD: Navega al primer registro del bloque de datos. ** Trigger: When-Button-Pressed */ BEGIN /* Si no esta en el último registro entonces vaya al último, de lo contrario vaya al primer registro. */ IF :System.Last_Record <> 'TRUE' THEN Last_Record; ELSE First_Record; END IF; END; NEXT_RECORD: Navega al siguiente ítem habilitado y secuencial en el registro con el número de secuencia mas alto que del registro actual. Si no existe un registro, Forms creará un registro. ** Trigger: Key-Next-Item /* lst_itm recibe el nombre del ultimo ítem del registro. Luego compara al ítem actual con lst_item. Si son iguales avanza al primer ítem del siguiente registro, avanza un registro, no regresa al primer ítem del registro actual, de lo contrario, avanza al siguiente ítem del registro actual. */ DECLARE cur_itm VARCHAR2(80) := :System.Cursor_Item; cur_blk VARCHAR2(80) := :System.Cursor_Block; lst_itm VARCHAR2(80); BEGIN lst_itm := cur_blk||'.'||Get_Block_Property(cur_blk,LAST_ITEM); IF cur_itm = lst_itm THEN Next_Record; ELSE Next_Item; END IF; END; LAST_RECORD: Navega al último registro en la lista de registros del bloque. Si una consulta esta abierta, Forms recoge los datos restantes del bloque y cierra la consulta. -- Trigger: When-Button-Pressed BEGIN /* Si es diferente del ultimo registro, entonces que vaya al último registro */ IF :System.Last_Record <> 'TRUE' THEN Last_Record; END IF; END; GO_RECORD: Navega al registro con el número de registro especificado en el parámetro.

Page 74: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

BEGIN Go_Record( :nombre_bloque.ultimo_numero_registro ); END;

ultimo_numero_registro: es el numero del ultimo registro, puede ser un valor estático o un número retornado de una variable de sistema.

INSERT_RECORD: Al llamarse desde un disparador KEY-CREREC, se inserta el registro actual en la base de datos durante el proceso de transacciones Commit y Post. -- Trigger: On-Insert BEGIN /* Chequea la bandera para iniciar la insercion */ IF flag = 'TRUE' THEN Insert_Record; END IF; END; DELETE_RECORD: Al usar el disparador KEY-DELREC remueve el registro actual y marca al registro como eliminado. Estos registros no se borran instantáneamente, sino que son procesados en el siguiente proceso COMMIT.

Como personalizar la barra de herramientas Oracle Forms provee a las aplicaciones con una barra de herramientas horizontal estándar para la operación y navegación entre registros. Sin embargo, se puede personalizar la barra de herramientas utilizando las mismas técnicas y operabilidad contenida en la estándar. Construya un bloque de datos con el nombre TOOLBAR, éste nombre es opcional puede darle el nombre que crea conveniente. El bloque de datos debe contener una serie de botones con el mismo nombre que corresponde a la función o comando que estaría ejecutando cuando éste sea presionado por el usuario. Como puede observar los nombres de los elementos que que inician desde ENTER-QURY hasta EXIT-FORM, corresponden a el comando de ejecución que cada botón debería realizar si fuese presionado. Los demás elementos permiten mostrar información de interés en tiempo de ejecución, la cual se describe a continuación: ELEMENTO DESCRIPCION DEL ELEMENTO IMAGEN Imagen que desea ser presentada USUARIO Código del usuario que conectado PROGRAMA Nombre físico del programa ejecutado FECHA Fecha de la base de datos EMPRESA Nombre de empresa SISTEMA Nombre del sistema de la aplicación DES_APLICACION Nombre descriptivo de la aplicación

74

Page 75: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

DISEÑO DEL LIENZO DE LA BARRA DE HERRAMIENTAS Cada elemento de tipo botón de la barra de herramientas diseñada en el bloque TOOLBAR, debe tener un ícono que represente la función que éste ejecutaría al ser presionado por el usuario.

La funcionalidad de cada botón se centraliza en una sola unidad de programa, ésta se realiza mediante la ejecución del disparador WHEN-BUTTON-PRESS definido a nivel del bloque de datos y no por cada elemento botón, esto para aprovechar los niveles de definición de algunos disparadores comunes que pueden manejarse en un nivel superior.

75

Page 76: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

76

Procedimiento Ejecuta_Boton Lee el nombre del botón y ejecuta un DO_KEY(item_name),respetando la operación de QUERY: Si hay botones llamados EXECUTE_QUERY y CANCEL_QUERY, esta función los muestra, cuando el botón Enter_query es presionado y los oculta, cuando EXECUTE_QUERY ó CANCEL_QUERY es presionado. Ningún error será retornado, si estos botones no existen. EXIT, QUIT and EXIT_FORM ejecutan un exit_form, aún si la forma se encuentra en modo ENTER_QUERY !!!!! El boton CANCEL_QUERY cancela algún query en estado "open". PROCEDURE ejecuta_botón IS action VARCHAR (80); PROCEDURE oculta_boton (item_name VARCHAR2) IS BEGIN IF NOT ID_NULL (FIND_ITEM (item_name)) THEN SET_ITEM_PROPERTY (item_name, displayed, property_false); END IF; END; FUNCTION muestra_boton (item_name VARCHAR2) RETURN BOOLEAN IS BEGIN IF NOT ID_NULL (FIND_ITEM (item_name)) THEN SET_ITEM_PROPERTY (item_name, displayed, property_true); SET_ITEM_PROPERTY (item_name, enabled, property_true); RETURN TRUE; ELSE RETURN FALSE; END IF; RETURN NULL; END; BEGIN --Obtiene nombre del trigger action := GET_ITEM_PROPERTY (NAME_IN ('SYSTEM.TRIGGER_ITEM'), item_name); IF action = 'ENTER_QUERY' THEN -- Garantiza que si se han realizado cambios en la forma se guarden u omitan -- dichos cambios antes de ingresar a modo enter-query, de este modo se omite -- el mensaje que sale al usuario indicando que existen cambios sin guardar -- en inglés. IF :SYSTEM.form_status = 'CHANGED' THEN gen_mensaje ( 'Ha realizado cambios en la información, debe guardar o eliminar ' || 'los cambios realizados para poder consultar información.' ); RAISE form_trigger_failure; END IF; IF muestra_boton ('EXECUTE_QUERY') AND muestra_boton ('CANCEL_QUERY') THEN oculta_boton ('ENTER_QUERY'); END IF; END IF; -- Si la acción fue disparada por el botón de salida ejecuta -- el comando EXIT-FORM dos veces, si una vez aplicado el primero -- la aplicación queda en modo ENTER-QUERY, lo cual significa que -- el usuario luego de presionar ENTER-QUERY quiso salir de la pantalla IF action IN ('EXIT_FORM', 'EXIT', 'QUIT') THEN action := 'EXIT_FORM'; IF NAME_IN ('SYSTEM.MODE') = 'ENTER-QUERY' THEN DO_KEY ('EXIT_FORM'); END IF; END IF; IF action = 'CANCEL_QUERY' THEN action := 'EXIT_FORM'; END IF; -- Ejecuta KEY-TRIGGER asociado al nombre del botón -- Si la operación es de impresión, valida la rutina que debe -- ejecutarse, dependiendo del sistema activo. IF action = 'PRINT' THEN NULL; -- Corre_Report; ELSE -- Cualquier otra acción. -- Si la acción es eliminar un registro se pregunta antes de efectuar operación IF action IN ('DELETE_RECORD')

Page 77: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

THEN IF gen_confirma_sino ('Está seguro de eliminar la información ?') = 2 THEN RETURN; END IF; END IF; DO_KEY (action); END IF; -- Si la operación es "Eliminar", debe actualizar la información realizando el commit_Form, -- adicionalmente, si se ejecutaron procesos que afectaron la base de datos no relacionada -- con los datos del form, debe realizar la operación commit en la BD. IF action IN ('DELETE_RECORD') THEN -- Se determina si hubo error en triggers que se ejecutan según el flujo normal de FORMS -- para la operación DELETE_RECORD, de modo que no se ejecute la operación de borrado -- si la última operación que FORMS haya ejecutado falla( ej con un raise form_trigger_failure) -- De este modo, es posible segmentar las operaciones y dejar el resto de la operación al toolbar -- se incluye este control pues si se intenta borrar y forms encuentra por ej un Key-Delrec y en -- este se hace fallar la aplicación, Forms seguirá ejecutando el código asociado al botón de -- borrado por lo cual ejecutará este código y si no se controla si hubo o no fallo, se intentará -- eliminar la información, el Form_Failure, determina el resultado de la última operación ejecutada -- en este caso, si el Key-Delrec falla, no se realiza la operación de eliminar originalmente llamada. IF FORM_FAILURE THEN RAISE form_trigger_failure; END IF; :GLOBAL.operacion_borrando := 'S'; END IF; --Muestra botón ENTER_QUERY, oculta EXECUTE_QUERY y CANCEL_QUERY IF NAME_IN ('SYSTEM.MODE') != 'ENTER-QUERY' THEN IF muestra_boton ('ENTER_QUERY') THEN oculta_boton ('EXECUTE_QUERY'); oculta_boton ('CANCEL_QUERY'); END IF; END IF; END;

De ésta forma se observaría la aplicación en tiempo de ejecución. Como puede apreciarse, no necesariamente se visualizan las mismas figuras de la barra de herramientas, en diseño y ejecución, ya que corresponden a archivos diferentes, los cuales para efectos de éste ejemplo se tratan de archivos ICO y GIF respectivamente.

77

Page 78: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

78

Uso de Parámetros Los parámetros son utilizados para inicializar algún valor en el momento de ejecución de la forma. Para trabajar con parámetros desde Forms, se deben añadir objetos en la rama de Parameter en el Navegador de objetos, luego dependiendo de la funcionalidad pueden ser utilizados para trabajar con valores iniciales en cualquier procedimiento o función de la forma. Podemos pasar valores desde un disparador de forma o desde cualquier unidad de programa, de la manera en que se muestra en el siguiente ejemplo, asumiendo que se encuentran definidas las variables globales Global.Par_Num_Empresa, Global.Par_Num_Sucursal y Global.Par_Fec_Sistema. PROCEDURE GEN_LLAMAFORMA (Forma In Varchar2, -- Nombre de la forma a cargar Ocultar In Boolean Default True, -- Oculta forma que ejecuta llamado Lis_Par In Varchar2 Default Null -- Lista de parámetros ) IS /* GENERAL: Esta rutina carga la forma determinada por el parámetro Forma con una posible lista de parámetros a pasar a la forma convocada. */ v_parametro Paramlist; -- Identificador único de la lista de parámetros. BEGIN -- Se Identifica si existe lista de parametros asociada al llamado o no v_parametro := get_parameter_list('Lis_Par'); IF (NOT id_null(v_parametro)) THEN destroy_parameter_list(v_parametro); END IF; v_parametro := create_parameter_list('Lis_Par'); add_parameter(v_parametro, 'par_num_empresa', TEXT_PARAMETER, Name_In('Global.par_num_empresa')); add_parameter(v_parametro, 'par_num_sucursal', TEXT_PARAMETER, Name_In('Global.par_num_sucursal')); add_parameter(v_parametro, 'par_fec_sistema', TEXT_PARAMETER, Name_In('Global.par_fec_sistema')); IF Id_Null(v_parametro) Then IF Ocultar Then Call_Form (Forma, HIDE, DO_REPLACE, NO_QUERY_ONLY , FORMS40_NULL_PARAMLIST); Else Call_Form (Forma, NO_HIDE, DO_REPLACE, NO_QUERY_ONLY , FORMS40_NULL_PARAMLIST); End IF; IF Not Form_Success then Gen_Mensaje('Error cargando la forma '||Forma); End IF; Elsif Not Id_Null(v_parametro) Then IF Ocultar Then Call_Form (Forma, HIDE, DO_REPLACE, NO_QUERY_ONLY ,'Lis_Par'); Else Call_Form (Forma, NO_HIDE, DO_REPLACE, NO_QUERY_ONLY ,'Lis_Par'); End IF; IF Not Form_Success then Gen_Mensaje('Error cargando la forma '||Forma); End IF; End IF; END; Parámetros de la instrucción CALL_FORM formmodule_name El nombre de la forma debe ser encerrado entre comillas simples. Tipo de dato: VARCHAR2.

Page 79: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

79

display HIDE (The default.) Oracle Forms esconderá la forma desde donde se realiza la llamada antes de presentar la forma que está siendo invocada. NO_HIDE Oracle Forms presentará la forma invocada sin ocultar la forma que realiza la llamada. switch_menu NO_REPLACE (The default.) Oracle Forms mantendrá el menu por defecto de Oracle en la forma invocada. DO_REPLACE Oracle Forms sustituirá el menú del modulo asociado a la forma llamada por el CALL_FORM, remplazando el menu por defecto por el que se encuentre definido en la forma. query_mode NO_QUERY_ONLY (El valor por defecto.) las Formas de Oracle ejecutarán la forma indicada en modo normal, permitiéndole al usuario final realizar inserciones, actualizaciones, y supresiones de registros de dentro de la forma llamada. QUERY_ONLY Oracle Forms ejecutará la forma indicada en modo de solo consulta, permitiéndole al usuario final consultar registros, pero si la capacidad de insertar, actualizar o suprimir registros. paramlist_id El identificador de parámetros que asigna cuando crea la lista de parámetros, puede incluir una lista de parámetros adicionales como entrada inicial a la forma llamada. El tipo de datos es PARAMLIST. paramlist_name El nombre que usted dio al objeto de lista de parámetro cuando usted lo definió. Tipo de datos VARCHAR2. Mas sobre Formas CLEAR_FORM: Es un procedimiento que limpia los registros de la forma actual y lleva el punto de entrada de datos al primer ítem del primer bloque. Este procedimiento puede o no recibir parámetros. BEGIN Clear_Form(No_Validate); END; Fecha del sistema operativo $$DATETIME$$ La variable del sistema $$DATETIME$$ recupera la fecha y hora del sistema operativo. Se lo puede utilizar para asignar valores por default. Este valor ($$DATETIME$$) es inicializado en el campo Initial Value del Property Palette para el ítem que llevara la fecha/hora del sistema. Luego puede ser asignado a alguna variable tipo DATE dentro de algún procedimiento o función.

Manejo de Sesiones Forms permite al desarrollador personalizar la ventana de logon a la base de datos desde la aplicación. LOGON: Procedimiento LOGON, es utilizado desde el trigger ON-LOGON. Permite la conexión a la base de datos. DECLARE username VARCHAR2(80); password VARCHAR2(80); cn_string VARCHAR2(80); BEGIN /* Recoje la información de la conexión */ Get_Connect_Info(un,pw,cn);

Page 80: Lenguajes de Cuarta Generacion - Oracle Developer Suite 10g-Libre

80

/* **Si no es base de datos Oracle, salir del intento de conexión */ IF :Global.Non_Oracle_Datasource = 'TRUE' THEN User_Exit('my_logon username='||un||' password='||pw); ELSE IF un IS NULL THEN un:='/'; END IF IF cn IS NOT NULL THEN LOGON(un,pw||'@'||cn); ELSE LOGON(un,pw); END IF; END IF; END; LOGOUT: Desconecta al usuario de la base de datos. Se lo programa en el trigger ON-LOGOUT BEGIN /* Si no es base de datos Oracle , sale de la conexion */ IF :Global.Non_Oracle_Datasource = 'TRUE' THEN User_Exit('my_logout'); ELSE Logout; END IF; END; SYNCHRONIZE: Sincroniza la pantalla con el estado de la forma. Begin Synchronize; Message(‘Hola’); End;