Date post: | 17-Feb-2016 |
Category: |
Documents |
Upload: | husseingabriel |
View: | 296 times |
Download: | 12 times |
CURSO BASICO DE DEVELOPER FORMS
PREPARADO POR JUAN CARLOS ERAZO M.
Cali, Junio 2002
1. GENERALIDADES 4
2. CREANDO UNA FORMA BÁSICA 5
2.1 CREACIÓN DE UNA FORMA MANUALMENTE 6 2.2 CREACIÓN DE UNA FORMA USANDO EL ASISTENTE 8
2.3 EJERCICIO 10
3. CREANDO RELACIONES ENTRE BLOQUES 10
3.1 EJERCICIO 12
4. DANDO FORMA A LOS MÓDULOS 12
4.1 USANDO EL ASISTENTE DE LAYOUT 12 4.2 CREANDO EL LAYOUT MANUALMENTE 13 4.2.1 CREACIÓN DE ALGUNOS OBJETOS 15 4.2.1.1 Listas de valores (LOV) 15 4.2.1.2 Lienzos como separadores 18 4.2.1.3 Listas desplegables 19 4.2.1.4 Items de no entrada o de DISPLAY 20 4.2.2 EJERCICIO 20 4.3 CREANDO ATRIBUTOS VISUALES 20
5. DESPLEGANDO MENSAJES EN PANTALLA 21
6. USANDO TRIGGERS 23
6.1 ALCANCE DE LOS TRIGGERS 23
7. USO DEL API 25
7. VALIDACIÓN 29
7.1 USANDO PROPIEDADES PARA LAS VALIDACIONES 29 7.2 USANDO TRIGGERS PARA LAS VALIDACIONES 30 7.3 EJERCICIO 31
8. CREACIÓN DE MENÚS 31
8.1 INVOCANDO FORMAS DESDE EL MENÚ 33 8.2 INVOCANDO REPORTES DESDE EL MENÚ 34 8.3 EJERCICIO 35
9. EJERCICIO FINAL 36
1. Generalidades
A lo largo del curso se desarrollará una aplicación completa para la administración
de empleados, usando para ello los objetos del usuario SCOTT. Developer
FORMS ofrece dos formas de hacerlo: usando asistentes y manualmente.
El entorno de FORMS consiste de una pantalla con una barra de herramientas, un
navegador de objetos y una paleta de propiedades, tal como se aprecia en la
figura:
Para agregar un nuevo objeto se debe ubicar el cursor sobre este y presionar el
botón con el símbolo más (+) de la barra de herramientas izquierda. Para
eliminarlo se debe presionar el botón con el símbolo equis (X) en la misma barra
de herramientas.
Cada objeto tiene un conjunto de propiedades visibles en la paleta de
propiedades. Para modificar una propiedad solamente se necesita ubicar el cursor
en la cela junto al nombre de la misma y cambiar su contenido.
Módulo
Lienzo
Bloque
Ítem
FORMS soporta la creación de FORMULARIOS (formas) y MENUS. Sin embargo
dentro de su entorno todos se conocen como módulos.
2. Creando una forma básica
Para crear una forma (o módulo) es necesario conocer la jerarquía de objetos de
FORMS.
El Lienzo es el área de la ventana en la cual se ubicarán los ítems.
El bloque es una agrupación lógica de ítems. Los bloques pueden estar
asociados o no con la base de datos en cuyo caso se llamarán bloques de
datos. También pueden ser usados para controlar la ejecución del módulo,
en cuyo caso se llamarán bloques de control. Estos no están asociados
directamente con objetos de la base de datos.
El ítem es el objeto de interfaz que despliega información. Cada pequeño
objeto susceptible de ser incluido en un lienzo se considera como un ítem.
Es así como podemos encontrar: campos de texto, listas de valores,
imágenes, botones de chequeo, botones comunes, sonidos, controles de
Visual Basic y contenedores OLE, entre otros.
2.1 Creación de una forma manualmente
Para crear una forma se usan estos pasos:
1. Crear un nuevo módulo. Propiedades a tener en cuenta:
a. Nombre
b. Título
c. Ventana
d. Módulo menú: indica el módulo usado para crear el menú. También
indica que la forma será padre para todos los demás módulos. El
nombre del módulo debe incluirse completo (nombre + extensión)
e. Primer bloque de navegación: le indica a la forma que se ubique en
ese módulo al momento de ejecutarse
f. Unidad de validación: indica el orden en que se procesarán los
triggers
g. Modo de interacción: indica cómo el usuario interactuará con la
forma cuando se ejecuta una consulta. Por ejemplo, en modo
BLOCKING el usuario no podrá cambiar el tamaño de la ventana
2. Crear un nuevo lienzo (CANVAS). Propiedades a tener en cuenta:
a. Nombre
b. Tipo: indica la forma como se desplegará en la pantalla. Por ejemplo
CONTENT significa que ocupará toda el área de contenido
c. Visible
d. Ventana: indica en qué ventana se desplegará
e. Ancho y alto
f. Apariencia del borde ( BEVEL)
g. Atributos visuales
3. Crear bloques: Propiedades a tener en cuenta:
a. Nombre
b. Estilo de navegación: indica como se procederá en caso de estar en
el primero o en el último registro del bloque
c. Bloques anterior y siguiente
d. Atributos visuales para el registro actual
e. Longitud del arreglo de consulta. Indica el número de registros que
se traerán en una sola operación de lectura.
f. Número de registros cargados: especifica el número de registros que
se cargarán a memoria durante una consulta sobre el bloque (por
defecto son tres)
g. Número de registros desplegados: especifica el número de registros
que un bloque puede desplegar cada vez. Esta propiedad afecta
directamente la forma como se verá el bloque
h. Consultar todos los registro: indica si al momento de consultar el
bloque se traerán todos los registros o solo la cantidad especificada
en la propiedad Longitud del arreglo de consulta . Se usa
comúnmente cuando hay ítems de resumen (por ejemplo sumas)
i. Bloque de base de datos: especifica el tipo de bloque
j. Consulta, inserción, actualización y eliminación permitida: indican las
operaciones que se pueden ejecutar sobre los registros del bloque
k. Forzar llave primaria: comúnmente FORMS usa el ROWID para
identificar los registros en el bloque. Con esta propiedad se le indica
que use las llaves primarias de la tabla base.
l. Origen de datos
m. Nombre origen de datos
n. Destino de datos
4. Crear ítems: Las propiedades de los ítems varían de acuerdo al tipo de los
mismos. Estas son algunas de las propiedades comunes
a. Nombre
b. Tipo
c. Habilitado
d. Justificación: indica la ubicación en el bloque
e. Restricción del texto: indica la forma como se desplegará el texto
(mayúsculas, minúsculas, etc.)
f. Navegable con el teclado
g. Ítems anterior y siguiente
h. Tipo de dato
i. Requerido
j. Máscara de formato
k. Elemento de base de datos
l. Nombre de columna
m. Consulta, inserción, actualización permitida
n. Visible
o. Lienzo contenedor
p. Visible
2.2 Creación de una forma usando el asistente
Realmente no hay un asistente para crear formas. Solamente para crear los
bloques de datos que la componen. Para crear una forma primero debe crearse un
nuevo módulo y posteriormente invocar al asistente para bloques que se
encuentra en el menú herramientas.
La siguiente es una descripción de los pasos usados para el Asistente para crear
un bloque de datos:
1. Seleccionar el tipo de fuente de datos del bloque: se puede seleccionar
entre tabla o vista y procedimiento PL/SQL. Si se selecciona tabla o vista
posteriormente se deben ingresar las columnas y tablas usadas. Si se
escoge procedimiento se deben seleccionar los procedimientos usados
para las operaciones sobre la base de datos.
2. Escoger tablas o vistas y columnas del bloque. Adicionalmente se debe
chequear la casilla forzar integridad referencial si se desea que FORMS
use los constraints definidos en la base de datos.
3. Crear el bloque solamente o crearlo y abrir el editor de Layout para
organizar su apariencia.
Una vez creado el bloque este aparecerá en el navegador de objetos con el mismo
nombre de la tabla base.
2.3 Ejercicio
En este ejercicio el objetivo es crear una forma básica manualmente y otra usando
el asistente. Ambas formas estarán basadas en la tabla DEPT, se deben mostrar
ocho (8) registros a la vez y debe haber una barra de desplazamiento para ver los
registros siguientes. Para cada objeto se deben establecer los valores de las
propiedades correspondientes:
Título: Ventana manual / automática
Columnas: DEPTNO, DNAME y LOC
También podremos apreciar el uso de los botones para la interacción con la base
de datos. Finalmente se crearán botones para realizar los mismos procesos de
forma manual.
3. Creando relaciones entre bloques
No todas las formas contienen un único bloque sobre el cual interactuar. Muchas
de ellas contienen más de uno (algunos maestro
detalle) los cuales están
relacionados entre si. Para crear una relación entre dos bloques (ya deben estar
creados ambos bloques) se deben seguir los siguientes pasos:
1. Ubicarse sobre el bloque maestro y crear una nueva relación
2. Seleccionar el bloque detalle en la ventana de creación de relaciones
3. Seleccionar las operaciones de eliminación de registros: en cascada para
eliminar los registros hijos junto con el padre, aisladas para no eliminar los
registros hijos cuando se elimine el padre, no aisladas para evitar que se
borre el registro maestro si hay registros hijos
4. Seleccionar la coordinación entre los bloques: diferida para que los
registros hijos no aparezcan cuando se hace la consulta sobre el bloque
maestro; para verlos se necesita hacer la consulta sobre el bloque hijo.
Auto consulta para traer los registros hijos automáticamente cuando se
navega al bloque detalle y prevención de operaciones sin registro maestro
para prevenir que se opere sobre registros hijos cuando no hay un maestro
seleccionado.
5. Escribir la operación de JOIN
6. O seleccione un objeto existente en ambos bloques sobre el cual se basará
la relación.
Una vez creada la relación FORMS adicionará nuevas unidades de programa y
triggers para controlar las operaciones de coordinación entre ambos bloques.
Es posible crear las relaciones de forma automática. Para ello se necesita crear
primero el bloque maestro y luego el detalle usando el Asistente. Una de las
opciones del asistente preguntará si hay o no un bloque maestro para crear la
relación.
3.1 Ejercicio
En este ejercicio el objetivo es crear un bloque adicional en las formas ya
existentes manualmente y usando el asistente. Este bloque estará basado en la
tabla EMP, se deben mostrar cuatro (4) registros a la vez y debe haber una barra
de desplazamiento para ver los registros siguientes. Para cada objeto se deben
establecer los valores de las propiedades correspondientes:
Título: Ventana manual / automática
Columnas: EMPNO, ENAME, JOB , MGR, HIREDATE, SAL, COMM,
DEPTNO.
Posteriormente se debe hacer una relación con el bloque DEPT y probar el
funcionamiento de la forma.
4. Dando forma a los módulos
Una vez la parte funcional de los módulos se encuentre operativa se puede centrar
la atención sobre la interfaz gráfica. La interfaz gráfica constituye una parte
importante del proceso de desarrollo de una aplicación por lo que FORMS cuenta
con un asistente para dar forma a la parte visual. Asimismo existen algunas
propiedades que sirven para cambiar la apariencia de los módulos.
En esta sección veremos como usar el asistente para el layout y como crear
atributos visuales para aplicar sobre los objetos.
4.1 Usando el asistente de layout
Hay dos formas de llegar al asistente de layout: a través del menú herramientas y
a través del submenú asociado al botón derecho del ratón, el cual aparece al
ubicarse sobre un bloque.
Al iniciar el asistente de layout se deben seguir los siguientes pasos:
1. Seleccionar un lienzo existente o crear uno nuevo
2. Seleccionar el bloque de datos y las columnas que aparecerán en el mismo
3. Escribir el texto que acompañará cada columna y el ancho del campo
asociado
4. Seleccionar el estilo de layout: tabular o formulario
5. Escoger un título para el marco, el número de registros a mostrar y la
distancia entre los mismos. También se puede seleccionar si se quiere o no
colocar una barra de desplazamiento de registros.
Una vez finalizado el asistente aparecerá el editor de layout con los registros
ubicados en el lienzo, tal como lo muestra la siguiente figura:
4.2 Creando el layout manualmente
Para crear al layout manualmente se debe invocar el editor y posteriormente
añadir uno a uno los objetos requeridos. Antes de ubicar los objetos se debe tener
cuidado de seleccionar el lienzo y el bloque con el cual se trabajará, de lo contrario
los objetos aparecerán ubicados fuera de lugar. La siguiente tabla muestra la
descripción de algunos de los botones de la barra de herramientas del editor que
se usan para añadir objetos al lienzo.
Añadir ítem texto
Añadir campo de texto
Añadir marco (frame)
Añadir botón de radio
Añadir botón de chequeo
Añadir imagen
Añadir botón
Añadir ítem tipo lista desplegable
Añadir ítem para desplegar texto
Añadir lienzo en forma de separador
Al agregar cada uno de los objetos se debe tener en cuenta modificar sus
propiedades con el fin de ligar la parte visual con la parte funcional del módulo.
Existen adicionalmente algunos botones en la barra de herramientas horizontal
que nos permiten manipular la alineación de los objetos.
Alinear los ítems a la izquierda.
Alinear los ítems al centro vertical
Alinear los ítems a la derecha
Alinear los ítems a la parte superior
Alinear los ítems al centro horizontal
Alinear los ítems a la parte inferior
4.2.1 Creación de algunos objetos
En esta sección veremos la forma de creación de algunos objetos por
considerarlos de vital importancia para el desarrollo de aplicaciones.
4.2.1.1 Listas de valores (LOV)
Las listas de valores desplegables consisten de dos partes: la lista de valores
como tal y el grupo de registros.
Nota: Las listas de valores (LOV) son diferentes de los ítems tipo lista. Estos
últimos pueden tener datos estáticos y dinámicos, pero deben ser llenados de
forma manual.
Para crear una lista de valores se debe primero crear el grupo de registros.
En el grupo de registros se pueden especificar datos estáticos o datos dinámicos
provenientes de una consulta a la base de datos. Comúnmente se consultan
mínimo dos columnas, una de las cuales será desplegada en la lista de valores y
la otra se retornará a la forma cuando se seleccione el ítem.
Una vez creado el grupo de registros se procede a crear la lista de valores. Para
crearla se puede hacer uso del asistente o se puede hacer manualmente.
Creación de una lista de valores manualmente
Al crear la lista de forma manual se debe establecer un valor en las siguientes
propiedades (las demás son opcionales):
a. Nombre
b. Título
c. Grupo de registros
d. Mapeo de columnas. Esto consiste en hacer coincidir las columnas del
grupo de registros con las columnas en la forma.
Aquí se debe especificar un nombre para cada una de las columnas
involucradas en el grupo de registros y el lugar a donde retornarán sus
valores una vez se seleccione el ítem.
Una vez creada la lista se debe asignar esta a un ítem en la propiedad lista de
valores (LOV).
Creación de una lista de valores usando el asistente
Para crear la lista de valores se deben seguir estos pasos
que coinciden con las
pantallas del asistente - :
1. Escoger un grupo de registros o crear uno basado en una consulta
2. Ingresar la consulta para obtener los registros
3. Escoger las columnas del grupo de registros que irán en la lista de valores
4. Colocar un nombre para las columnas de la lista y asignar el ítem al cuál
retornará la selección
5. Escoger el título de la lista, el ancho, el alto y la ubicación
6. Seleccionar el número de registros a recuperar
7. Asignar la lista a un ítem del bloque
4.2.1.2 Lienzos como separadores
Un lienzo separador está constituido de una o más páginas de separadores, que
permiten al desarrollador desplegar una gran cantidad de información relacionada
en un simple objeto.
Para crear un lienzo con separadores se deben seguir estos sencillos pasos:
1. Seleccionar el lienzo en donde se van a alojar
2. Abrir el editor de layout
3. Seleccionar el objeto TAB CANVAS y ubicarlo en el lienzo
4. Modificar sus propiedades
5. Crear los bloques y asignarlos a cada página del lienzo
4.2.1.3 Listas desplegables
Las listas desplegables comúnmente se crean a partir de datos estáticos,
ingresados de forma manual en la lista. Sin embargo es posible llenarlas a partir
de datos provenientes de la base de datos usando un procedimiento como el que
sigue:
PROCEDURE LLENAR_LISTA_POP IS LIST_ID ITEM; the_count number := 1; cursor c1 is select job from emp; BEGIN list_id := FIND_ITEM('block.item_name'); -- recorrer el cursor para llenar la lista FOR v_c1 IN c1 LOOP Add_List_Element(list_id,the_count, v_c1.job, v_c1.job); the_count := the_count + 1; END LOOP; END;
Este procedimiento establece los valores de la lista obteniéndolos de la tabla EMP.
4.2.1.4 Items de no entrada o de DISPLAY
Algunas veces en nuestra forma queremos ubicar ítems que unicamente se
dediquen a mostrar valores, ya sea provenientes de otro ítem o directamente de la
base de datos. Esta funcionalidad la proveen los ítems de DISPLAY.
Un ítem de DISPLAY se crea cuando presionamos el botón de la barra de
herramientas izquierda. Una vez creado se ajustan sus propiedades tal como si
fuera in ítem de texto normal. Si el ítem desplegará información de una tabla de la
base de datos se debe ajustar la propiedad Nombre de columna . Si desplegará
información de otro ítem se debe ajustar las propiedades Copiar valor del ítem o
Sincronizar con el ítem o establecer una fórmula en caso que sea un ítem
calculado.
4.2.2 Ejercicio
El objetivo de este ejercicio es mejorar la apariencia de las formas creadas, para lo
cual se usará el editor de layout. Se debe colocar un color distintivo para los
registros de cada bloque, cambiar el tipo de letra (si se quiere), agregar textos a
las columnas (prompt), cambiar el color de la letra y agregar otros detalles.
4.3 Creando atributos visuales
Los atributos visuales permiten asociar un conjunto de colores y tipos de letra a los
ítems de un módulo. El uso de atributos visuales contribuye a mantener la
modularidad en el desarrollo de la interfaz gráfica de usuario por cuando para
cambiar la forma visual del módulo solo basta con escoger un atributo visual
diferente.
La creación de atributos visuales se hace de igual forma que cualquier otro objeto
del módulo y solamente se debe dar valores a las propiedades deseadas. Las
siguientes son algunas de las propiedades de los atributos visuales:
a. Nombre
b. Color de letra
c. Color de fondo
d. Tipo de relleno
e. Tipo de letra
f. Tamaño
g. Peso
h. Estilo
i. Espacio
Una vez creado un atributo visual puede asignársele a cualquier ítem en la
propiedad atributo visual .
5. Desplegando mensajes en pantalla
Las aplicaciones cliente servidor necesitan constantemente intercambiar
información con el usuario, ya sea solicitándole una entrada de datos o
simplemente desplegando información como advertencias o mensajes de error en
ventanas independientes de los formularios. FORMS soporta esta característica a
través de un objeto llamado ALERTA. Una Alerta es simplemente una forma con
unas características muy particulares, la mayoría de las cuales son asignadas en
tiempo de ejecución, y que permite intercambiar información con el usuario.
Una alerta se crea de igual forma que cualquier otro objeto de FORMS y se le
establecen propiedades como:
a. Nombre
b. Título
c. Mensaje: el mensaje a desplegar.
d. Estilo: pueden crearse alertar de tipo Nota, precaución o parada. Estas
difieren en el icono usado.
e. Etiquetas de los botones
Una alerta se invoca comúnmente desde el código PL/SQL de la forma. Por
ejemplo:
DECLARE
Alert_id alert := find_alert( alerta_error );
Num number;
BEGIN
Set_alert_property(alert_id, ALERT_MESSAGE_TEXT, Error en la forma );
Num := show_alert(alert_id);
END;
Existe una forma alterna de mostrar mensajes usando la función MESSAGE de la
siguiente forma:
MESSAGE( Working... (30%), NO_ACKNOWLEDGE);
MESSAGE( Working... (30%), ACKNOWLEDGE);
MESSAGE( Working... (30%), ACKNOWLEDGE);
Este mensaje se mostrará en la barra de estado de la forma. La propiedad
ACKNOWLEDGE/NO_ACKNOWLEDGE, le dice a FORMS si debe mostrar una
ventana tipo alerta o solamente debe desplegar el mensaje en la barra de estado
respectivamente.
6. Usando triggers
Los triggers son los manejadores de eventos en FORMS. Cada trigger especifica
la ocurrencia de un suceso sobre un ítem. Es así como encontramos por ejemplo
que sobre un botón aplican estos triggers:
WHEN_BUTTON_PRESED
WHEN_NEW_INTEM_INSTANCE
Cada trigger es susceptible de ser programado para que ejecute una tarea
específica usando PL/SQL.
6.1 Alcance de los triggers
En Developer los triggers se pueden definir a nivel de bloque, ítem, registro o
formulario. El alcance del trigger corresponde con el alcance del nivel de la
jerarquía de objetos en que fue definido. Por ejemplo, si se asocia un trigger a
nivel de bloque los eventos de todos los elementos de dicho bloque ejecutarán el
trigger.
Si existe más de un trigger con el mismo nombre (o funcionalidad) en un ámbito
particular Developer lanzará el que está asociado con el elemento más bajo en la
jerarquía. Por ejemplo, si existe un trigger WHEN_NEW_ITEM_INSTANCE
asociado a un bloque y a un ítem, Developer ejecuta el trigger del ítem e ignora el
del bloque. Este comportamiento se puede cambiar modificando la propiedad
Execution Hierarchy del trigger.
Algunos triggers solo tienen validez cuando se definen a un nivel específico. Por
ejemplo WHEN_VALIDATE_RECORD no es aplicable a ítems individuales, por lo
que solo se puede definir a nivel de bloque y de formulario.
Para ver los triggers aplicables a un objeto basta con usar el menú asociado con el
botón derecho del ratón en la opción Smart triggers .
Estos son algunos tipos de triggers que existen en Developer:
De uso de teclas o comandos:
KEY_CLRFRM, KEY_COMMIT, KEY_EDIT, KEY_ENTQRY, KEY_F1, KEY_EXIT,
ON_CLOSE, ON_COMMIT, ON_ERROR, ON_PULATE_DETAILS,
ON_ROLLBACK.
De eventos posteriores al objeto:
POST_QUERY, POST_DELETE, POST_COMMIT, POST_UPDATE,
POST_TEXT_ITEM, POST_BLOCK.
De eventos anteriores al objeto:
PRE_DELETE, PRE_FORM, PRE_QUERY, PRE_TEXT_ITEM, PRE_BLOCK.
De eventos inmediatos:
WHEN_BUTTON_PRESED, WHEN_CREATE_RECORD,
WHEN_LIST_ACTIVATED, WHEN_NEW_ITEM_INSTANCE,
WHEN_VALIDATE_ITEM
Para controlar los errores presentados en un trigger y no permitir que el usuario
avance a los ítems siguientes se debe invocar la excepción predefinida
FORM_TRIGGER_FAILURE.
7. Uso del API
Developer cuenta con un conjunto de variables, funciones, procedimientos
creados para asistir a los desarrolladores en la creación de aplicaciones.
Como ya se ha visto, cada uno de los objetos que componen una aplicación
cuenta con propiedades, las cuales pueden ser manipuladas en tiempo de
ejecución usando el API. Es prácticamente imposible en un curso básico ver todas
las funciones del API, pero abarcaremos las más importantes.
En general existen dos tipos de funciones y procedimientos en el API: los que
establecen una propiedad y los que recuperan su valor. Todas ellas tienen una
estructura genérica aplicable a casi cualquier objeto. La sintaxis es la siguiente:
Para establecer valores en las propiedades de un objeto:
SET_<OBJETO>_PROPERTY(parámetros);
Para obtener valores de las propiedades de un objeto:
GET_<OBJETO>_PROPERTY(parámetros);
Para referenciar los objetos de FORMS se usan estas variables y procedimientos:
Objeto Variable Procedimiento
Bloque BLOCK Find_block( NAME )
Ítem ITEM Find_item( NAME )
Alerta ALERT Find_alert( NAME )
Lista de valores LOV Find_lov( NAME )
Lienzo CANVAS Find_canvas( NAME )
FORMS también permite conocer su estado interno a través variables del sistema.
La siguiente tabla contiene algunas de estas variables y su descripción:
Variable Descripción
SYSTEM.BLOCK_STATUS Representa el estado de un bloque donde el
cursor está ubicado. CHANGED, NEW,
QUERY. Por ejemplo:
IF :System.Block_Status = 'CHANGED'
THEN Commit_Form;
END IF;
SYSTEM.FORM_STATUS Similar al anterior pero a nivel de forma.
SYSTEM.CURSOR_BLOCK
SYSTEM.CURSOR_ITEM
SYSTEM.CURSOR_RECORD
Representan el nombre o el valor del objeto
en donde el cursor está ubicado
actualmente. Por ejemplo:
curblk := :System.Cursor_Block;
IF curblk = 'ORDERS' THEN
Go_Block('ITEMS');
IF :System.Cursor_Record = '1' THEN
Go_Item('orders.total');
ELSE Previous_Item;
END IF;
SYSTEM.CURRENT_BLOCK
SYSTEM.CURRENT_ITEM
Representan el nombre del bloque o el
bloque e ítem del objeto que está enfocado
en el momento.
SYSTEM.LAST_RECORD Retorna TRUE si está en el último registro
del bloque o FALSE si no. Por ejemplo:
IF :System.Last_Record = 'TRUE' THEN
Message('You are on the last row');
END IF;
SYSTEM.MODE Indica cuando FORMS está en estado:
NORMAL, ENTER_QUERY, QUERY. Por
ejemplo:
IF :System.Cursor_Item = 'EMP.EMPNO'
and :System.Mode = 'ENTER-QUERY'
THEN
IF NOT Show_Lov('my_lov') THEN
RAISE Form_Trigger_Failure;
END IF;
Estas son algunos de los procedimientos y propiedades más usadas en la
construcción de aplicaciones:
Ubicar una ventana en la pantalla
SET_WINDOW_PROPERTY( NOMBRE , POSITION, X, Y)
Cambiar el tamaño de una ventana
SET_WINDOW_PROPERTY( NOMBRE , WINDOW_SIZE, X, Y)
Minimizar o maximizar una ventana
SET_WINDOW_PROPERTY( NOMBRE , WINDOW_STATE,
MINIMIZE|MAXIMIZE);
Cambiar las propiedades de un ítem
SET_ITEM_PROPERTY( BLOQUE.NOMBRE , PROPERTY, VALOR)
Donde PROPERTY puede ser: alignment, background_color, border_bevel,
case_restriction, enabled (PROPERTY_TRUE, PROPERTY_FALSE)
Cambiar las propiedades de un bloque
SET_BLOCK_PROPERTY( BLOQUE , PROPERTY, VALOR)
Donde PROPERTY puede ser: current_record_attribute, default_where,
delete_allowed, next_navigation_block, order_by.
Ir a un bloque, ítem o registro
GO_BLOCK( NOMBRE )
GO_ITEM( NOMBRE )
GO_RECORD( NOMBRE )
Navegar por los bloques, ítems o registros
PREVIOUS_BLOCK NEXT_BLOCK
PREVIOUS_ITEM NEXT_ITEM
PREVIOUS_RECORD NEXT_RECORD
Cerrar una forma
Exit_form (ASK_COMMIT | NO_COMMIT | DO_COMMIT | NO_VALIDATE);
Ejecutar una tecla o botón
DO_KEY(LIST_VALUES | ENTER_QUERY | EXECUTE_QUERY |
CREATE_RECORD | DELETE RECORD | COMMIT_FORM )
7. Validación
Forms valida los ítems asegurando que cumpla con sus propiedades establecidas.
Las validaciones ocurren cuando:
Se navega fuera de una unidad de navegación: esto ocurre cuando un
usuario presiona ciertas teclas de función o presiona el ratón fuera de una
unidad de validación.
Cuando se invoca la función ENTER o el usuario presiona ENTER
Cuando se invoca el procedimiento COMMIT_FORM: en este caso se
valida la forma sin tener encuentra cada unidad de validación
El proceso de validación consiste en verificar primero el estado del ítem o registro;
si este es inválido entonces se hace la validación estándar (contra las
propiedades) y luego se ejecuta el trigger WHEN_VALIDATE. La validación a nivel
de bloque o forma se hace para todos los registros del bloque o todos los bloques
de la forma respectivamente.
7.1 Usando propiedades para las validaciones
Algunas propiedades de los ítems proveen un tipo de validación estándar para los
valores que se han de capturar. Es así como existen propiedades para restringir el
formato de entrada de un ítem, restringir las operaciones permitidas, permitir la
navegación hacia él, restringir un rango de valores, etc.
Para ítems de tipo texto
Propiedad Descripción Cómo se usa
Máscara de formato Restringe el formato de
entrada de un valor
dd-mm-rrrr
dd-mon-rr
9999
$9999.99
Valor mínimo permitido Establece el valor mínimo 1
que puede tomar 100
Valor máximo permitido Establece el valor máximo
que puede tomar
100
200
Validar de la lista Obliga a que el valor
pertenezca a la LOV
7.2 Usando triggers para las validaciones
Otra forma de realizar validaciones es usando el trigger WHEN_VALIDATE
(aplicable solo a ítems y a registros). Este trigger se dispara una vez el usuario
sale de la unidad de validación, ya sea que haga clic sobre otra área en la forma o
que simplemente intente pasar a otra unidad. Para programar este trigger basta
con incluir el código PL/SQL necesario para realizar la validación. El siguiente
ejemplo muestra el código necesario para validar que el salario de un empleado
no sea mayor que el del presidente:
DECLARE sal_pres number;
BEGIN select sal into sal_pres from emp where job='PRESIDENT'; IF :emp.sal >= sal_pres then
message('El salario debe ser menor que el del presidente', ACKNOWLEDGE);
raise form_trigger_failure; end if;
EXCEPTION when too_many_rows then
message('No se puede validar porque se encontraron demasiados registros', ACKNOWLEDGE);
raise form_trigger_failure; when others then
message('No se puede validar porque ocurrió un error', ACKNOWLEDGE);
raise form_trigger_failure; END;
Para controlar los errores presentados en un trigger y no permitir que el usuario
avance a los ítems siguientes se debe invocar la excepción predefinida
FORM_TRIGGER_FAILURE.
7.3 Ejercicio
Este ejercicio consiste en agregar una validación sobre el campo JOB para que los
cargos que el usuario ingrese estén dentro de la lista de JOBS permitidos.
8. Creación de menús
Como se explicó al inicio, un menú es también un módulo en Oracle FORMS.
La forma más rápida de crear un menú es usando el Editor. El editor de menús es
una herramienta de FORMS que permite crear menús y menús desplegables.
Para invocar el Editor puede hacerse por la opción existente en el menú
Herramientas o directamente por el submenú asociado al botón derecho del ratón
al hacer clic sobre el módulo.
La pantalla inicial del editor de menú muestra la primera opción disponible. Cada
opción puede tener asociado un submenú el cual se creará usando el mismo
editor.
El editor de menú cuenta con los siguiente botones para la creación de menús y
submenús.
Crear un submenú
Crear otro menú
Eliminar un menú o submenú
Cada opción del menú o submenú debe ser programada para ejecutar una acción
específica, de lo contrario, al compilar el módulo aparecerán errores. Comúnmente
estas acciones hacen referencia a invocar otras formas o reportes existentes en la
aplicación.
8.1 Invocando formas desde el menú
Para invocar una forma desde una opción de menú basta con incluir el siguiente
código en la opción deseada:
CALL_FORM( NOMBRE );
Una vez establecidas todas las opciones del menú y programado su código se
debe compilar el menú. Esto se puede lograr usando la combinación de teclas
CTRL+T o directamente en el menú archivo, opción administración, opción
compilar archivo.
Cuando el menú se haya compilado y no tenga errores se debe asignar a la forma
en la propiedad módulo menú . En esta propiedad se debe escribir el nombre del
módulo menú.
8.2 Invocando reportes desde el menú
De igual forma en que se invocan formas desde el menú es posible invocar
también módulos de otros componentes de Developer como REPORTS y
GRAPHICS. Para hacerlo se usa la siguiente instrucción:
RUN_PRODUCT (PRODUCTO, MODULO, MODO_COMUNICACIÓN,
MODO_EJECUCIÓN, UBICACION,
LISTA_PARAMETROS , DISPLAY);
Donde:
PRODUCTO: indica el producto a invocar. Puede ser: REPORTS, FORMS o
GRAPHIS.
MODULO: es el nombre del módulo a invocar.
MODO_COMUNICACIÓN: especifica el modo de comunicación entre FORMS y el
producto a ejecutar. Puede ser SYNCHRONOUS para que el control vuelva a
FORMS solo cuando se deje de ejecutar el otro producto o ASYNCHRONOUS
para que el control retorne a FORMS una vez se haya lanzado el nuevo producto.
MODO_EJECUCIÓN: indica el modo de ejecución usado por el producto
invocado. Puede ser BATCH o RUNTIME.
UBICACIÓN: indica la ubicación del archivo. Puede ser FILESYSTEM o DB.
LISTA_PARÁMETROS: contiene la lista de parámetros que se pasarán al reporte
en caso de necesitarlos. Si no se pasan parámetros debe enviarse la lista vacía.
DISPLAY: especifica el nombre del ítem tipo CHART en el cual se desplegará el
resultado de la invocación del producto GRAPHICS.
Por ejemplo, para invocar un reporte llamado REP_EMP se usaría el siguiente
código:
DECLARE
List_par paramlist;
BEGIN
List_par := create_parameter_list( lista );
RUN_PRODUCT(REPORTS, REP_EMP , SYNCHRONOUS, RUNTIME,
FILESYSTEM, list_par, NULL);
END;
8.3 Ejercicio
Este ejercicio consiste simplemente en crear un menú con dos opciones
principales: Departamentos, Salir. La primera opción debe tener un submenú con
una opción llamada mantenimiento la cual invocará la forma para tal fin. La opción
salir solamente debe cerrar las formas.
9. Ejercicio final
El ejercicio final pretende poner en práctica todo lo visto hasta el momento y
despertar las aptitudes investigativas con el fin de encontrar funcionalidades no
contenidas en el curso.
Los requerimientos de este ejercicio son los siguientes:
La universidad Santiago de Cali desea contar con una aplicación para mantener la
información de sus departamentos y empleados. Deben existir pantallas
exclusivas para el ingreso de departamentos y de rangos salariales de los
empleados. Debe tener también la posibilidad de consultar un departamento a la
vez, con sus respectivos empleados en donde pueda observarse toda la
información del departamento, toda la información del empleado, el grado de
rango salarial que tiene y la suma total de los salarios para tal departamento. Al
ingresar un empleado nuevo o modificar uno existente debe validarse que el Jefe
(Manager) exista, que el salario no sea mayor que el salario del presidente y que
no exceda los límites para su rango. Es deseable que para cada validación
necesaria se muestren las alertas respectivas con el fin de informar al usuario el
problema ocurrido. En lo posible deben existir botones para agregar registros,
navegar entre los bloques (en caso de ser necesario) y guardar los datos
ingresados.