Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CUARTA GENERACIÓN
Primera Edición
Primera Edición
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).
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.
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
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:
7
Seleccionar y cambiar al disk 1 y aceptar:
8
Iniciando el contenedor de Oracle para J2EE (OC4J)
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.
Ejemplo: FORMS_PATH=D:\APPS\Curso\lib;
D:\APPS\Curso\bin;
config=sepwin IE=JInitiator
11
Seleccionar el nombre de la instancia de la
base de datos, el cual corresponde a un
nombre de base de datos global.
12
Probar la conexión, para validar que la
configuración del nuevo servicio de red local
se haya realizado correctamente.
13
Una vez suministrado el usuario y clave
correcta, la prueba de configuración del nuevo
servicio de red local es exitosa.
14
El asistente le indicará que concluyó la
configuración del servicio.
15
Configuración del servidor de reportes
16
Para finalizar la creación del servidor de
reportes, indicamos el nombre con el que
deseamos se visualice el acceso directo.
17
18
Subir los servicios: START
OC4J Instante Servicio de
reportes:
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.
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.
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:
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.
25
2
PROGRAMACION CON FORMS DEVELOPER DE ORACLE
Componentes de la herramienta
¾ 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.
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.
¾ 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..
¾ 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.
¾ 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.
¾ MENÚES Son listas de items que los usuarios utilizan para seleccionar funciones específicas u
operaciones.
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.
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 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.
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.
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).
¾ 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.
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.
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.
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.
37
Objetos de trabajo
Ventanas
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.
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.
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.
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.
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
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.
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:
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
46
Ordenar datos
por columnas
47
Ordenamiento de datos
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
Para una mejor presentación del nombre del empleado, realice la siguiente modificación a la consulta
generada:
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.
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.
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.
52
Creando listas de valores manualmente
Alertas
Una alerta es una ventana modal que despliega un mensaje el cual notifica al operador sobre alguna
condición de la aplicación.
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.
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.
Disparadores para eventos de interfaz.- Son disparados en los eventos que ocurren en la interfaz de la
forma.
54
When-Window-Closed Inicia una acción cuando un operador cierra una ventana con el
comando Close del administrador de ventana.
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.
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 :
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.
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.
Otros Disparadores
56
Implementación de Disparadores más comunes
POST-QUERY
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.
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;
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.
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.
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.
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.
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.
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.
BEGIN
:Parameter.Par_TotNodos := Get_Group_Row_Count(p_NomRG);
END;
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;
IF p_totelementos = 0
THEN
RETURN;
END IF;
-- 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;
IF p_totelementos = 0
THEN
RETURN;
END IF;
-- 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;
RETURN;
END;
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.
*/
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');
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;
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:
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;
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;
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.
: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.
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.
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.
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
- 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
- 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:
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.
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);
/* 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.
** 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;
** 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;
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.
-- Trigger: On-Insert
BEGIN
/*
Chequea la bandera para iniciar la insercion */
IF flag = 'TRUE' THEN
Insert_Record;
END IF;
END;
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.
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;
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;
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.
*/
BEGIN
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;
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.
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;
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
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