Está en la página 1de 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


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

2
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

3
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
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
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:

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

6
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
Seleccionar y cambiar al disk 1 y aceptar:

Finalizada la instalación de Oracle


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

8
Iniciando el contenedor de Oracle para J2EE (OC4J)

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

9
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


10
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:

Seleccionar Configuración del nombre del


servicio de red local y

Seleccionar Agregar y siguiente para agregar


un nuevo servicio de red

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

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.

12
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
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
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
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
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
18
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
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
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
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}.

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.

22
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…

23
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
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.

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

25
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
¾ 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.

27
¾ 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)

28
¾ 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

Para definir una pantalla debe crear un nuevo


módulo de pantalla, posicionándose en el
componente Pantallas y presionando para
crear un nuevo módulo de pantalla.

Una vez creado el módulo de la nueva


pantalla, 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.

29
Al presentarse la pantalla de bienvenida al
asistente de bloques de datos presione el
botón Siguiente para definir el bloque de
datos.

Seleccione Tabla o Vista para definir el tipo


bloque de datos que se desea crear.

Seleccione la tabla y las columnas que se desean utilizar y presentar en el bloque de datos. No
necesariamente 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).

30
Seleccione la tabla Departments para crear el
bloque de datos y presione Aceptar.

Seleccione todas las columnas disponibles


mediante el botón con doble signo mayor

para elegir todas las columnas como


elementos de base de datos que conformarán
el bloque de datos.

Utilice el mismo nombre de la tabla para


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

31
Ha concluido el diseño del bloque de datos,
seleccione 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 del ejemplo seleccione el primer
botón.

Al presentarse la pantalla de bienvenida al


asistente de diseño de lienzos presione el
botón Siguiente para definir el bloque de
datos.

Diseño del Lienzo Son los lienzos de trabajo para realizar el diseño gráfico de las formas. Los elementos
que lo conforman son los Gráficos (Graphics). Existen varios tipos de LienzosCanvas.

¾ Contenido: Lienzo contenedor, en este se depositarán los objetos del diseño, incluyendo otros
lienzos de tipo apilados.

¾ Apilado: es un lienzo que se coloca sobre el lienzo de contenido, se lo utiliza cuando se requieren
lienzos sobrepuestos para continuar cierto ingreso / presentación de la información (opcional).

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


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

¾ Barra de Herramienta Horizontal: es un lienzo utilizado para diseñar barra de herramientas con
orientación horizontal.

¾ Barra de Herramienta Vertical: es un lienzo utilizado para diseñar barra de herramientas con
orientación vertical.

32
Seleccione Nuevo Lienzo para crear el lienzo
donde 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.

Si selecciona un lienzo de tipo separador, debe


seleccionar las páginas donde desea diseñar los
elementos del bloque de datos.

Seleccione el bloque de datos y los elementos de


éste que desea presentar en el lienzo.

Ingrese el nombre de la etiqueta que desea que


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

33
Seleccione el estilo de diseño que desea para la
pantalla, el cual debe ser elegido según la
presentación que se quiera dar a los datos.

Si se desea registrar información muy completa


en 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.

Ingrese el título que desea para el marco que


encierra los elementos en el lienzo.
Indique el número de registros que desea mostrar
en 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 desea ver la barra de desplazamiento,
la cual puede ser vertical u horizontal según el
sentido de orientación de los datos el bloque.

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


lienzo. Para crear el marco y diseñar los
elementos seleccionados presione el botón
Terminar.

El asistente de diseño mostrará el marco nuevo


en 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.

34
Esta es la pantalla resultante del diseño
anterior. El diseño es básico, sin embargo
puede ajustarse a medida que se identifican
los elementos de ajuste necesarios.

Esta aplicación esta preparada para


ejecutarse. 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.

Si el servicio del contenedor OC4J está


levantado puede ejecutarse la aplicación
diseñada, sino levante el servicio tal y como
se explicó anteriormente.

La pantalla que se presenta inicialmente


está en modo de inserción de datos, si se
desea consultar la información debe
presionar los botones de Introducir
consulta y Ejecutar consulta.

35
Una vez consultados los datos, éstos
pueden 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
de dirección con la flecha ↓ sin guardar el cambio, modificamos otra descripción y luego guardamos
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.

36
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.

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.

37
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.
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.

38
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

39
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.

40
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
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.

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

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.

43
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

44
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
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
Ordenar datos
por columnas

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.

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.

47
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
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
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.

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 >

50
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.

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 >

51
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.

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.

52
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.
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.

53
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.

54
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,

55
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.

56
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

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.

57
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;

58
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
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
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.

61
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

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.

Cree el bloque de datos manualmente con el nombre


B_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.

62
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
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

64
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
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

66
-- 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
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.
68
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.

69
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)

70
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);

71
- 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’);

72
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.


73
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
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
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')

76
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
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.

78
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);
79
/*
**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;

80

También podría gustarte