lunes, 14 de mayo de 2018

La Navegación en Oracle Forms

Objetivos:

 Distinguir entre navegación interna y externa.
 Controle la navegación con propiedades.
 Describir y utilizar Triggers para controlar la navegación.
 Usar built-ins de navegación en Triggers.

______________________________________________________________________________________
Descripción General de Navegación.
Las siguientes secciones presentan varios conceptos de navegación para ayudarlo a comprender el proceso de navegación.

¿Qué es la unidad de navegación?
La unidad de navegación es un objeto interno invisible que determina el estado de navegación de un Form. Forms usa la unidad de navegación para realizar un seguimiento del objeto que actualmente es el foco de un proceso de navegación. La unidad de navegación puede ser uno de los objetos en la siguiente jerarquía:
 Outside the form (Fuera del Form).
 Form.
 Block.
 Record.
 Item.
Cuando Forms navega, cambia la unidad de navegación moviéndose a través de esta jerarquía de objetos hasta que se alcanza el Item de destino.

Entrando y Saliendo de objetos.
Durante la navegación, Forms sale y entra en los objetos. Entrar en un objeto significa cambiar la unidad de navegación del objeto anterior en la jerarquía (De Arriba hacia Abajo). Dejar un objeto significa cambiar la unidad de navegación al objeto anterior (De Abajo hacia Arriba).

Relación del Cursor con la Unidad de Navegación.
El cursor es un objeto externo visible que indica el foco de entrada actual. Forms no moverán el cursor hasta que la unidad de navegación se haya convertido con éxito en el Item de destino. En este sentido, la unidad de navegación actúa como una sonda.

¿Qué Sucede si Falla la Navegación?
Si la navegación falla, Forms invierte la ruta de navegación e intenta mover la unidad de navegación a su ubicación inicial. Tenga en cuenta que el cursor aún está en su posición inicial. Si Forms no puede mover la unidad de navegación a su ubicación inicial, se cierra el Form.
______________________________________________________________________________________
Entendiendo la Navegación Interna.
La navegación ocurre cuando el usuario o un Trigger hace que el foco de entrada se mueva a otro objeto. La navegación implica cambiar la ubicación del foco de entrada en la pantalla. Además de la navegación visible que se produce, se lleva a cabo una navegación lógica. Esta navegación lógica también se conoce como navegación interna.

Ejemplo:
Cuando ingresa a un módulo Form, el foco de entrada se ubica en el primer Item editable del primer bloque de navegación. De igual manera ocurren eventos de navegación interna no visibles los cuales hacen que el foco de entrada ingrese al primer Item. Estos eventos de navegación interna son los siguientes:
 Entry to form.
 Entry to block.
 Entry to record.
 Entry to item.

Ejemplo:
Cuando hace COMMIT a sus inserciones, actualizaciones y eliminaciones en la base de datos, no ve que se mueva el foco de entrada. Sin embargo, internamente, los siguientes eventos de navegación deben ocurrir antes de que comience el proceso de confirmación de los cambios (COMMIT):
 Exit current item.
 Exit current record.
 Exit current block.

Nota de Rendimiento
Forms usa paquetes de eventos inteligentes: todos los eventos que se desencadenan mediante la navegación entre dos objetos se entregan en forma de paquete a Forms Services en el nivel intermedio para su posterior procesamiento.
______________________________________________________________________________________
Uso de Propiedades para Controlar la Navegación.
Puede controlar la ruta a través de una aplicación controlando el orden en que el usuario navega hacia los objetos.

Propiedades para bloques y Items:
Objecto
Propiedad
Block
Navigation Style
Previous Navigation Block
Next Navigation Block
Item
Enabled
Keyboard Navigable
Mouse Navigate
Previous Navigation Item
Next Navigation Item
Nota: Puede usar el mouse para navegar a cualquier Item habilitado independientemente de su posición en la orden de navegación.

Propiedades del Módulo Forms
Propiedad
Función
Mouse Navigation Limit
Determina que tan lejos del Item actual puede navegar el usuario con el mouse.
First Navigation Block
Especifica el nombre del bloque al cual Forms debe navegar al momento de iniciar el módulo Forms (Este propiedad no anula/sobreescribe el orden usado para confirmar los cambios (Commit)).
Propiedad Mouse Navigate
La propiedad Mouse Navigate es válida para los siguientes Items:
 Push Button.
 Check box.
 List item.
 Radio group.
 Hierarchical tree item.
 Bean Area Item.

Nota: Por defecto la propiedad Mouse Navigate está establecida en Sí.
Opción
Funcionamiento:
Yes
Forms puede navegar al nuevo Item. (Esto hace que los Triggers de navegación y validación se disparen).
No
Forms no navegan al nuevo Item ni lo valida cuando el usuario hace clic sobre él.
______________________________________________________________________________________
Triggers de Navegación.
Estos Triggers pueden ser subdivididos en dos grupos generales:
 Triggers de Navegación PRE- y POST-.
 Triggers WHEN-NEW- <object>-INSTANCE.

¿Cuándo son activados los Triggers de navegación PRE- y POST-?
Estos son disparados durante la navegación, justo antes de la entrada (PRE-) o justo después de salir (POST-) del objeto.

Ejemplo: El Trigger Pre-Text-Item se dispara justo antes de ingresar un Text Item.

¿Bajo que condiciones no son disparados los Triggers de navegación PRE- y POST-?
Estos Triggers no se activan si pertenecen a una unidad que está más abajo en la jerarquía que la unidad de validación actual. Por ejemplo, si la unidad de validación es Record, los Triggers (de Items) PRE- y POST-TEXT no se disparan.

¿Cuándo se disparan los Triggers WHEN-NEW-<object>-INSTANCE?
Estos se disparan inmediatamente después de la navegación al objeto especificado.

Ejemplo:
El Triggers WHEN-NEW-ITEM-INSTANCE se dispara inmediatamente después de la navegación a una nueva instancia de un ítem.

¿Qué sucede cuando un Trigger de Navegación falla?
Ante una eventual falla, el foco de entrada vuelve a su ubicación inicial (donde estaba antes de disparar el Trigger). Para el usuario, luciría como si el foco de entrada no se ha movido en absoluto.

Nota: Asegúrese de que los Triggers de navegación PRE- y POST- muestren un mensaje en caso de fallar. La falla de uno de estos Triggers puede causar un error fatal. Por ejemplo, una falla de Pre-FormPre-BlockPre-Record o Pre-Text-Item al ingresar al Form cancelaría la ejecución del mismo.

Triggers WHEN-NEW-<Object>-INSTANCE.
Si incluye rutas de navegación complejas a través de su aplicación, es posible que desee comprobar o establecer las condiciones iniciales cuando el foco de entrada llegue a un bloque, registro o item en particular. Use los siguientes Triggers para hacer esto:

Trigger

Dispara

When-New-Form-Instance
Cada vez que se ejecuta un Form, después de una navegación exitosa en el mismo.
When-New-Block-Instance
Después de una navegación exitosa al bloque.
When-New-Record-Instance
Después de una navegación exitosa al registro.
When-New-Item-Instance
Después de una navegación exitosa a una nueva instancia del item.
______________________________________________________________________________________
Inicializando los Objetos de Forms Builder.
Utilice los Triggers WHEN-NEW-<object>-INSTANCE, junto con los built-ins SET_<object>_PROPERTY para inicializar los objetos de Forms Builder. Estos Triggers son particularmente útiles si requiere condicionar una configuración predeterminada.

Ejemplo:
El siguiente ejemplo de un Trigger WHEN-NEW-BLOCK-INSTANCE establece condicionalmente la propiedad DELETE ALLOWED en FALSE.
IF GET_APPLICATION_PROPERTY(username) = 'SCOTT' THEN
SET_BLOCK_PROPERTY('ORDER_ITEMS',DELETE_ALLOWED, PROPERTY_FALSE);
END IF;

Ejemplo:
Puede realizar una consulta de todos los pedidos, cuando se ejecuta el Form FRM_ORDERS, incluyendo el siguiente código en su Trigger WHEN-NEW-FORM-INSTANCE:
BEGIN
EXECUTE_QUERY;
END;

Ejemplo:
Registre el Selector de color JavaBean en el Item bean area Control.Colorpicker cuando se ejecute el Form FRM_CLIENTES incluyendo el siguiente código en su Trigger WHEN-NEW-FORM-INSTANCE:
BEGIN
FBean.Register_Bean('control.colorpicker', 1,'oracle.forms.demos.beans.ColorPicker');
END;
En tiempo de ejecución, Forms buscará la clase Java contenida en el nivel medio o en los archivos de almacenamiento con la ruta especificada en el código. Si abre colorpicker.jar en WinZip, encontrará que la ruta a ColorPicker.class es oracle\forms\demos\beans. 

Otros Ejemplos:
SET_FORM_PROPERTY(FIRST_NAVIGATION_BLOCK, 'ORDER_ITEMS');
/*Esta sentencia establecería el ORDER_ITEMS como el primer bloque de navegación del Form en cuestión, por ende al iniciar el módulo form el cursor se colocaría en el primer item navegable de ese bloque.*/
SET_BLOCK_PROPERTY('ORDERS', ORDER_BY, 'CUSTOMER_ID');
/*Esta sentencia establecería la propiedad ORDER BY CLAUSE con la columna CUSTOMER_ID. De esta forma una posterior consulta ordenaría los resultados por esta columna en forma ascendente.*/
SET_RECORD_PROPERTY(3, 'ORDER_ITEMS', STATUS, QUERY_STATUS);
/*Esta sentencia marca el tercer registro en el bloque ORDER_ITEMS como si fuera un registro consultado.*/
SET_ITEM_PROPERTY('CONTROL.stock_button', ICON_NAME, ’stock’);
/*Esta sentencia especifica el archivo 'stock' como el icono asociado con un Botón stock_button, dicho botón debe tener la propiedad Iconic establecida en SÍ*/
______________________________________________________________________________________
Los Triggers PRE- y -POST.
Puede definir los Triggers PRE- y POST-TEXT a nivel de Item, PRE- POST-BLOCK a nivel de bloque, y PRE- POST-FORM a nivel de FORM. Los Triggers PRE- POST-TEXT-ITEM solo disparan para en Text Items.

Tipo de Trigger

Usado para

PRE-FORM
·          Validar
-        El usuario (User).
-        La Fecha y Hora (SYSDATE).
·          Initializar Bloques de Control.
·          Llamar a otro Form para que despliegue informaciones.
POST-FORM
·          Realizar gestiones internas, como eliminar variables Globales.
·          Mostrar mensajes antes de salir.
PRE-BLOCK 
·          Autorizar/desautorizar acceso al bloque.
·          Establecer variables Globales.
POST-BLOCK 
·          Validar el último registro que tuvo el foco de entrada.
·          Probar condiciones y impedir al usuario que pueda dejar el bloque.
PRE-RECORD
·          Establecer variables Globales.
POST-RECORD
·          Limpiar variables Globales.
·          Establecer un Atributo Visual (Visual Attribute) para un Item a medida que el usuario navegue (Scrolls) a través de un conjunto de registros.
·          Realizar validaciones en la cual intervienen varios campos.
PRE-TEXT-ITEM
·          Derivar valores predeterminados con cierta complejidad.
·          Guardar el valor anterior de algún Text Item.
POST-TEXT-ITEM
·          Calcular o cambiar los valores de los Items.
______________________________________________________________________________________
La Trampa de Navegación.
Los Triggers PREPOSTdisparan durante la navegación, y cuando estos fallan, el cursor interno intenta regresar al Item actual (SYSTEM.CURSOR_ITEM).
El diagrama en la imagen ilustra la trampa de navegación. Esto puede ocurrir cuando falla un Trigger de navegación PREPOST- e intenta devolver el cursor lógico a su Item inicial. Sin embargo, si el Item inicial tiene un Trigger PRE-TEXT-ITEM que también falla, el cursor no tiene dónde ir y se produce un error fatal.

Nota: asegúrese de codificar Triggers a prueba de falla en la navegación.
______________________________________________________________________________________
Los Built-ins de Navegación.
Los built-ins a continuación permiten gestionar la navegación a través de Triggers de forma programática.

Built-Ins de Navigación
Funcionamiento
GO_FORM
Navega a un Form independiente en una aplicación de múltiples Forms (Formularios).
GO_BLOCK/ITEM/RECORD
Navega al Bloque, Registro o Item especificado.
NEXT_BLOCK/ITEM/KEY
Se desplaza al siguiente Bloque, Item o Item de clave primaria que sea navegable.
NEXT/PREVIOUS_RECORD
Se desplaza al primer item navegable del siguiente (NEXT) o anterior (PREVIOUS) registro,
NEXT_SET
Extrae otro conjunto de registros de la base de datos y luego navega al primer registro extraído.
UP, DOWN
Navega a la instancia del item actual en el anterior/posterior registro.
PREVIOUS_BLOCK/ITEM
Navega al anterior bloque o item navegable.
SCROLL_UP/DOWN
Desplaza el bloque de manera que se muestren los primeros (UP) o últimos (DOWN) registros.
Llamando Built-ins desde Trigger de Navegación.
No puede utilizar un built-in restringido desde un Trigger que dispara durante el proceso de navegación (Triggers PRE- y POST-). Esto se debe a que las built-ins restringidos realizan algún tipo de navegación y, por lo tanto, no pueden invocarse hasta que se complete la navegación Forms.

Puede invocar built-ins restringido desde Triggers como WHEN-NEW-ITEM-INSTANCE, porque dicho Trigger se dispara después de que Forms haya movido el foco de entrada al nuevo item.


Ejemplo:
BEGIN
IF CHECKBOX_CHECKED('ORDERS.order_mode') --Online
  THEN --order
ORDERS.order_status := 4; --Credit order
GO_ITEM('ORDERS.order_status');
END IF;
END;
/*Este es un ejemplo de una trigger WHEN-NEW-ITEM-INSTANCE, si al llegar al item en cuestión el item order_mode contiene un CHECK entonces se establecería el campo order_status en 4 y se colocaría el cursor en este último item*/
______________________________________________________________________________________
Resumen.
En esta publicación, debes haber aprendido que:
 La navegación externa es visible para el usuario, mientras que la navegación interna ocurre detrás de escenas (A través de códigos).
 Puede controlar la navegación con las propiedades del Form, Bloque o Item:
--Sección de navegación de la paleta de propiedades.
O
--Usando SET_[FORM | BLOCK | ITEM]_PROPERTY.
 Triggers de navegación:
--Aquellos que disparan durante la navegación (cuidado con la trampa de navegación): [PRE | POST] - [FORM | BLOCK | ITEM].
--Aquellos que disparan después de la navegación: WHEN-NEW-[FORM | BLOCK | RECORD | ITEM] -INSTANCE.
 Puede usar built-ins de navegación en Triggers (excepto en Triggers que se disparan durante la navegación):
--GO_[FORM | BLOCK | RECORD | ITEM]
--NEXT_[BLOCK | RECORD | ITEM | KEY | SET]
--UP
--DOWN
--PREVIOUS_[BLOCK | RECORD | ITEM]
--SCROLL_[UP | DOWN]
______________________________________________________________________________________
Fuente: Oracle Forms Developer 10g: Build Internet Applications.