sábado, 4 de marzo de 2017

Crear un Form Maestro-Detalle (Master-Detail)

Objetivos:
 Crear bloques de datos con relaciones.
 Modificar un bloque de datos.
 Explicar las Propiedades Básicas de una Relación.
 Ejemplo de un Form Maestro-Detalle.

NOTA: Usamos como ejemplo la Base de Datos: ORCL, la cual viene por defecto en cualquier versión de ORACLE.
______________________________________________________________________________________
Form Maestro-Detalle.
Son comunes las aplicaciones en las cuales se requiere mostrar un registro o registros de una tabla junto con registros asociados de otra tabla. Forms Developer le da la posibilidad de crear varios bloques de datos y definir relaciones entre ellos. A continuación detallamos como.

Un módulo Form puede contener uno o más bloques de datos. Cada bloque de datos puede estar solo o estar relacionado con otro bloque de datos.

Relación Maestro-Detalle.
Una relación maestro-detalle es una asociación entre dos bloques de datos que refleja una relación de llave primaria-llave foránea entre las tablas de Base de Datos en las que se basan los dos bloques de datos. El bloque de datos maestro se basa en la tabla con una llave primaria y el bloque de datos de detalle se basa en la tabla con una llave foránea. Una relación maestro-detalle equivale a la relación uno-a-muchos en el diagrama de relación de entidad.
Eje:
Master-Detail: Departamentos (Departments)-Empleados (Employees) en el esquema HR.

Bloque de Detalle y Maestro a la vez.
Puede crear relaciones de bloques en las que el detalle de un enlace maestro-detalle sea el maestro para otro enlace.
Eje:
Master-Master/Detail-Detail: Locaciones (Locations)-Departamentos (Departments)-Empleados (Employees) en el esquema HR.

Un bloque Maestro con varios Detalles.
Puede crear más de un bloque de detalle para un bloque maestro.
Eje:
Master-2*DetailClientes (Customers)-Ordenes (Orders) y Clientes (Customers)-Oficial de Cuenta (Account Reps) en el esquema OE.

______________________________________________________________________________________
Creando un Form Maestro-Detalle.

Con el Asistente para Bloque de Datos.
Puede crear un módulo Form Maestro-Detalle mediante una relación explícita  entre un bloque maestro y un detalle o implícitamente utilizando el Asistente para bloques de datos.
Pasos:
1. Cree un primer bloque el cual será el bloque maestro.
2. Crear un segundo bloque el cual servirá como bloque detalle.
3. Los pasos de creación de cada bloque son similares, a excepción que a partir del segundo veras la pagina: Maestro-Detalle (Master-Detail) en la cual puede definir relaciones entro los bloques existentes del Form.
Una vez en esta página:
 Seleccione la casilla de verificación "Auto-Union de bloque de Datos (Auto-join data blocks)" y haga clic en Crear relación...
Nota: Si la casilla de verificación "Auto-join data blocks" está desactivada, se muestra un cuadro de diálogo con una lista de todos los bloques de datos del Form sin ningún nombre de restricción de llave Foránea.
4. En el ya mencionado cuadro de diablo que aparece al presionar Crear Relación debemos seleccionar el Bloque de Datos que se desea usar como Maestro, una vez seleccionado haga clic en Aceptar. Al hacerlo, el asistente crea automáticamente la condición de unión entre el bloque maestro y detalle.
Nota: Si no selecciona la casilla de verificación "Auto-join data blocks", el asistente no crea automáticamente la condición de unión entre los bloques, por esta razón debe utilizar las listas pop-up Maestro-Detalles para crear una condición de combinación manualmente.
5. En lo adelante, complete los pasos del asistente.
Nota: El bloque de datos maestro debe existir en el módulo Form antes de crear el bloque de detalles.

Nueva Relación.
Una vez creado un módulo Form Maestro-Detalle, el Asistente para Bloque de Datos automáticamente crea un objeto tipo Relation que maneja la relación entre dos bloques de datos asociados.
Las tareas siguientes se realizan automáticamente:
 El nuevo objeto tipo Relation se crea bajo el nodo del bloque de datos Maestro en el Navegador de Objetos con propiedades predeterminadas.
 El nombre de la relación se crea de acuerdo al siguiente patron: MasterDataBlock_DetailDataBlock, por ejemplo DEPARTMENTS_EMPLOYEES.
 Se generan TRIGGERS y Unidades de Programa (Program Units) para mantener la coordinación entre los dos bloques de datos.

Creando una Relación manualmente.
Puede crear una relación implícitamente con el Asistente para bloque de datos o explícitamente en el Navegador de Objetos.

Relaciones Explícitas.
Si no se establece una relación cuando se crean los bloques, puede crearlas usted mismo mediante el Navegador de Objetos.
Para crear explícitamente una relación, realice los siguientes pasos:
1. Seleccione el nodo Relaciones (Relations) debajo del bloque Maestro en el Navegador de Objetos.
2. Haga clic en el icono Crear (Create) para que aparezca la ventana Nueva Relación (New Relation).
3. Especifique el nombre del bloque de detalle.
4. Elija su propiedad Master-Delete.
5. Elija su propiedad de coordinación.
6. Especifique la condición de Unión.
7. Haga clic en Aceptar.

La relación, los TRIGGERS y las nuevas Unidades de Programa son mostrados en la anterior imagen. Es prudente destacar que son creadas las mismas Unidades de Programas PL/SQL y TRIGGERS cuando definimos una relación implícita como explícita, en ambos casos es usado el mismo patron para el nombre de la relación.

Condición de Unión.
 Utilice una condición de Unión para:
---Crear enlaces/vínculos entre bloques utilizando SQL.
---Alterar enlaces entre bloques utilizando SQL.

 Directrices:
---Utilice la Sintaxis equijoin usual de SQL (necesaria porque Forms copia el valor del bloque maestro al elemento relacionado en el bloque detalle).
---Use los nombres de bloque en lugar de los nombres de la tabla base (sin los dos pintos al inicio).
---Utilice solo nombres de Items que existan en el módulo Form en lugar de los nombres de columnas de la tabla base.

Propiedades de Eliminación.
Nota: La imagen anterior muestra las propiedades por defecto de una relación.

Master Deletions.
Con la propiedad Delete Record Behavior puede evitar, propagar o aislar la eliminación de un registro en un bloque Maestro cuando existen registros correspondientes en el bloque Detalle. Por ejemplo, puede eliminar todos los empleados de un departamento X al eliminar dicho departamento.

Propiedad
Uso
Non-Isolated
Impide la eliminación de un registro padre cuando existen registros detalle; permite eliminar un registro padre solo si no existen registros detalle.
Cascading
Elimina el/los registros detalle cuando el registro padre es suprimido.
Isolated
Elimina solo el registro padre.

Nota: Aunque la supresión de un registro padre(con la propiedad en cascada) puede eliminar muchos registros detalle, el mensaje de confirmación muestra sólo el número de registros eliminados del bloque maestro.

Modificando una Relación.
Puede modificar las propiedades de una relación para cambiar la coordinación de bloques y forma de eliminación.
¿Qué sucede cuando se modifica una relación?
Si cambia la propiedad Delete Record Behavior de Non-Isolated a Cascading, el TRIGGER On-Check-Delete-Master se reemplaza con el TRIGGER Pre-Delete.
Si cambia la propiedad Delete Record Behavior de Non-Isolated a Isolated, se elimina el TRIGGER On-Check-Delete-Master.

Propiedad de Coordinación.
La propiedad de coordinación (coordination) controla cómo se muestran los registros detalle cuando se consulta un bloque maestro. Por ejemplo, puede postergar la consulta de los registros del bloque EMPLOYEES (detalle) de un DEPARTMENT para que se ejecute al momento que el operador navegue hasta algún item del bloque detalle.
Propiedad
Función
Default
La coordinación de bloques ocurre cuando el registro maestro es cambiado por el usuario o por un TRIGGER.
Deferred with Automatic Query
Pospone posible consulta masiva (en el bloque detalle) hasta que el cursor visita el bloque detalle.
Deferred without Automatic Query
Permite introducir algún otro criterio de consulta en el bloque detalle antes de ejecutarse dicha consulta.
Prevent Masterless Operations
Asegura que el bloque de detalle no pueda consultarse o utilizarse para insertar registros cuando no se muestra un registro maestro.
Ejecución de un Form Maestro-Detalle.
Cuando ejecute un Form Maestro-Detalle encontrará que:
 La consulta del bloque de datos maestro recupera inmediatamente los registros de detalle correspondientes.
 La eliminación de un registro maestro se evita si existen registros detallados.
Nota: Puede cambiar el comportamiento anterior modificando las propiedades del objeto de relación.
 La inserción de un registro de detalle lo asocia automáticamente con el maestro actualmente visualizado.
______________________________________________________________________________________
Ajunto el Master-Detail creado para esta práctica: Link.

Nota: En este Form agregamos un Trigger: WHEN-NEW-FORM-INSTANCE para que aparezcan los registros de la tabla employees tan pronto como se ejecute en Form. Esto seria igual a:
• Presionar Consulta (Query)-> Ejecutar (Execute) una vez ejecutado el Form.
______________________________________________________________________________________
Fuente: Oracle Forms Developer 10g: Build Internet Applications.