miércoles, 3 de mayo de 2017

Introducción a los Triggers de Oracle Forms

Objetivos:
 Definir los Triggers (Disparadores).
 Identificar las diferentes categorías de Triggers.
 Ver los tipos de Triggers y sus Alcances.
 Describir las propiedades que afectan el comportamiento de los Triggers.

NOTA: Usamos como ejemplo la Base de Datos: ORCL, la cual viene por defecto en cualquier versión de ORACLE.
______________________________________________________________________________________
Los Triggers.
También llamados Desencadenantes o Disparadores, son unos de los mecanismos más importantes utilizados para modificar y/o agregar funcionalidad a una aplicación Forms. En esta publicación, presentaremos propiedades y reglas/directrices esenciales para sacarles el mayor provecho posible al momento de crear aplicaciones.
Definición:
Un Trigger es una Unidad de Programa (Program Unit) que se ejecuta (dispara) debido a un evento. Forms Builder le permite crear potentes módulos o aplicaciones sin tener que recurrir o escribir una sola línea de código. Mediante el uso de Triggers puede agregar y/o modificar la funcionalidad del Forms de una manera procedimental. Como resultado, puede definir los procesos detallados de su aplicación.

En Forms Builder los Triggers son codificados con el lenguaje PL/SQL. Cada Trigger está asociado a un evento específico. Forms Builder define una amplia gama de eventos para los que se puede lanzar/disparar un Trigger. Estos eventos incluyen los siguientes:
 Eventos relacionados con las consultas.
 Entrada y validación de datos.
 Navegación lógica y/o física.
 Interacción del usuario con los Items del Forms.
 Eventos internos del Forms.
 Errores y mensajes.

Los eventos provocan la activación o disparo de ciertos tipos de Triggers. A continuación mostramos las categorías y las condiciones para que estos se disparen.

¿Qué Trigger utilizaría para realizar cálculos complejos después de que un usuario introduzca datos en un Item?

______________________________________________________________________________________
Las Categorías de Triggers.
Los Triggers pueden clasificarse según sus funciones:
Categoría
Dispara
Ejemplos
Procesamiento de bloques.
En respuesta a eventos relacionados con la gestión o manejo de registros en un bloque.
When-Create-Record
When-Clear-Block
When-Database-Record
When-Remove-Record
Evento de Interfaz.
En respuesta a eventos que se producen en la interfaz del Forms.
Key-[all]
When-Button-Pressed
When-[Checkbox | List | Radio]-Changed
When-Image-[Activated | Pressed]
When-Timer-Expired
When-Window-[Activated | Deactivated | Closed | Resized]
Maestro-Detalle.
Para reforzar la coordinación entre registros en un bloque detalle y su correspondiente del bloque maestro.
On-Check-Delete-Master
On-Clear-Details
On-Populate-Details
Manejo de Mensajes.
En respuesta a los mensajes predeterminados.
On-Error
On-Message
Navegación.
En respuesta a los eventos de navegación.
Pre-[Form | Block | Record | Text-Item]
Post-[Form | Block | Record | Text-Item]
When-New-[Form | Block | Record | Item]-Instance
Tiempo de Consulta.

Momentos (antes y después) en que el usuario o la aplicación ejecuta una consulta de un bloque.
Pre-Query
Post-Query
Validación
Después de que el usuario introduce datos y navega fuera del Item o registro en cuestión.
When-Validate-[Item | Record]

También puede categorizarlos de acuerdo a sus nombres:
Categoría
Descripción
When-Event
Punto en el que el procesamiento predeterminado de Forms puede ser alterado con tareas u operaciones adicionales.
On-Event
Punto en el que se puede sustituir el procesamiento predeterminado de Forms.
Pre-Event
Punto justo antes de la ocurrencia de un evento When o un evento On; Se utilizan para preparar los objetos o datos antes del posterior evento.
Post-Event
Punto justo después de la ocurrencia de un evento When o un evento On; Se utilizan para validar o realizar tareas de auditoría basadas en el evento anterior.
Key Triggers
Se activa cuando el operador pulsa una tecla o una secuencia de teclas específicas.
______________________________________________________________________________________
Componentes.
Hay tres componentes principales a tener en cuenta al diseñar un Trigger en Forms Builder:
 Tipo de Trigger (Trigger Type): Define el evento específico que provocará el disparo del disparador.
 Código del Trigger (Trigger Code): Es el cuerpo escrito en PL/SQL que define las acciones del Trigger.
 Alcance del Trigger (Trigger Scope): Es el nivel en un módulo Forms en el que se define el Trigger, determinando el alcance de los eventos que serán detectados por el mismo.
______________________________________________________________________________________
Tipo de Trigger.
El tipo de Trigger determina qué tipo de evento se activa. Hay más de 100 Triggers integrados, cada uno identificado por un nombre específico. Los Triggers son en su mayoría disparados por eventos dentro de un módulo Forms. Los módulos de menú pueden iniciar un evento en un Form, pero dicho módulo es el que posee el Trigger que se activa.
El nombre de un Trigger identifica su tipo. Todos los tipos de Triggers incorporados de Forms están asociados con un evento, y sus nombres siempre contienen un guión (-). Por ejemplo:
 When-Validate-Item se activa cuando Forms valida el contenido de un Item.
 Pre-Query dispara antes de que Forms emita una consulta para un bloque.

Nota: Los eventos de Base de Datos que se producen en nombre de un Forms pueden activar determinados Triggers, pero estos (de Base de Datos) son diferentes de los Triggers de Forms Builder.

Forms Builder admite los Triggers nombrados o creados por el usuario, similares a los Triggers incorporados de Forms. Un Trigger creado por el usuario es uno que es nombrado por el programador. Estos Triggers disparan sólo si son llamados por otro activador o Unidad de Programa (Program Unit) que utiliza ciertas herramientas incorporadas en Forms.

En un Trigger, la primera parte del nombre (antes del primer guión) sigue una convención estándar; Esto le ayuda a comprender la naturaleza general de su tipo y a planificar cual de estos usar.
Prefijo (Prefix)
Descripción
Key-
Dispara en lugar de ejecutar la acción estándar de una tecla de función.
On-
Dispara en lugar de ejecutar el procesamiento estándar (utilizado para reemplazar o evitar procesos).
Pre-
Se activa justo antes de la acción nombrada en el tipo de Trigger (por ejemplo, antes de ejecutar una consulta (Pre-Query))
Post-
Se dispara justo después de la acción denominada en el tipo de Trigger (por ejemplo, después de ejecutar una consulta (Post-Query)).
When-
Dispara de lado del procesamiento estándar (utilizado para aumentar la funcionalidad).
______________________________________________________________________________________
Código del Trigger.
El código del Trigger define las acciones a ejecutar cuando este se dispara. Escriba este código como un bloque PL/SQL anónimo mediante el Editor de PL/SQL. Necesita ingresar la estructura BEGIN. . . END en el texto del disparador sólo si inicia el bloque con una sentencia DECLARE o si necesita codificar subbloques.
Las sentencias que se escriben en un Trigger pueden incluir las siguiente:
• Construcciones PL/SQL estándar (asignaciones, sentencias de control, etc.).
• Sentencias SQL legales en un bloque PL/SQL; Estas se pasan al servidor.
• Puede Invocar/Llamar subprogramas (procedimientos y funciones) definidos por el usuario en el Form, en una Librería o en la Base de Datos.
• Puede hacer llamadas a subprogramas integrados así como también a subprogramas contenidos en paquetes.

Aunque puede incluir sentencias SQL en un Trigger , tenga en cuenta las siguientes reglas:
• Las sentencias INSERT, UPDATE y DELETE se pueden colocar en Triggers transaccionales. Estos Triggers se disparan durante el proceso de COMMIT.
• Las sentencias de control de transacciones (COMMIT, ROLLBACK, SAVEPOINT) no deben incluirse directamente como sentencias de desencadenamiento de SQL. Estas acciones son realizadas automáticamente por Forms como resultado de comandos o procedimientos incorporados que emita. Si se incluyen en los Triggers, estos comandos se redirigen para ser manejados por Forms. Por ejemplo, COMMIT emitirá un COMMIT_FORM.
______________________________________________________________________________________
Alcance del Trigger.
El alcance de un Trigger está determinado por su posición en la jerarquía de objetos de Forms, es decir, el tipo de objeto bajo el que se crea. Hay tres niveles posibles:
• Nivel de Form: El Trigger pertenece al Módulo Form y puede dispararse debido a eventos en todo el Form .
• Nivel de Bloque: El Trigger pertenece a un bloque y sólo se dispara cuando dicho bloque es el actual.
• Nivel de Item: El Trigger pertenece a un Item individual y se dispara sólo cuando este Item es el actual.

Algunos Triggers no se pueden definir debajo de cierto nivel. Por ejemplo, los Triggers Post-Query no se pueden definir en el Nivel de Item, porque se disparan debido a una consulta global o restringida en un bloque.

Por defecto, sólo se activa el Trigger mas cercano o específico para la ubicación actual del cursor.

Considere el siguiente ejemplo:
Al hacer doble click en el Item SALES_REP_ID (Vendedor), se activa el Trigger WHEN-MOUSE-DOUBLECLICK de dicho Item (Nivel Item), esto porque es más específico que los otros Triggers de este tipo.

Al hacer doble click en otra parte del bloque ORDERS (Ordenes), se dispara el Trigger WHEN-MOUSE-DOUBLECLICK del Nivel Block, porque su alcance es más específico que el Trigger del Nivel Form y está fuera del alcance del Trigger del Nivel Item.

Al hacer doble click en el bloque ORDER_ITEMS (Productos de la Orden), se dispara el ya mencionado Trigger pero ahora del Nivel Form, esto porque el cursor está fuera del alcance de los otros dos Triggers.

Nota: Al final de esta publicación esta el link del Módulo correspondiente a este tema, dicho Módulo escenifica el ejemplo previamente explicado. A continuación mostramos algunas alertas que personalizamos de acuerdo al Nivel del Trigger:
______________________________________________________________________________________
Jerarquía de Ejecución.
Como ya se ha indicado, cuando hay más de un Trigger del mismo tipo, Forms normalmente dispara el más específico de la ubicación del cursor. Puede modificar la secuencia de disparo de un disparador estableciendo la propiedad de disparo de la jerarquía de ejecución (EH).
El diagrama anterior muestra cómo el ajuste EH afecta el orden de disparo de los disparadores:
1. Dispara primero.
2. Dispara en segundo lugar.
3. Dispara de tercero.
4. Se dispara de forma independiente.

Nota: Las líneas quebradas indican la ruta de análisis antes de disparar. EH significa execution hierarchy.

La jerarquía de ejecución (EH) es una propiedad del Trigger que especifica cómo debe ejecutarse el código del Trigger actual si hay otro con el mismo nombre definido en un nivel superior en la jerarquía de objetos. Establecer EH para Triggers de nivel Form no tiene ningún efecto, ya que no hay ningún Trigger de nivel superior.

Los valores para la jerarquía de ejecución:
• Override: Sólo se dispara el Trigger más específico de la ubicación del cursor. Este es el valor predeterminado.
 After: El Trigger se dispara después de disparar otro del mismo tipo, si lo hay, en el siguiente nivel más alto.
 Before: El Trigger se dispara antes de disparar otro del mismo tipo, si lo hay, en el siguiente nivel más alto.

En los casos de Before After, puede disparar más de un Trigger del mismo tipo como resultado de un solo evento. Sin embargo, debe definir cada Trigger en un nivel diferente.

______________________________________________________________________________________
Ajunto el Módulo Form creado para esta práctica: Link.
______________________________________________________________________________________
Fuente: Oracle Forms Developer 10g: Build Internet Applications.