Está en la página 1de 40

Oracle Developer Build Forms 1 SW-ORA-20110126

Repuestas a Práctica del Capítulo 20


Revisión: 1
Fecha: 26/01/2011

Oracle Developer Build Forms 1


Respuestas a Práctica del Capítulo 20
1. Introducción a la Práctica del Capítulo 20:

Esta práctica cubre los tópicos siguientes:


• Completa automáticamente los IDs de órdenes usando una secuencia
• Completa automáticamente los IDs de items agregando id de órden actual
mas alto
• Personaliza los mensajes de confirmación en el formulario “CUSTOMERS”
• Personaliza la pantalla de acceso y autenticación de usuario en el formulario
“CUSTOMERS”

En esta práctica, agrega disparadores transaccionales al formulario “ORDG01”


para proporcionar automáticamente números de secuencia a los registros-filas en
el momento de almacenamiento. También personaliza los mensajes de
confirmación y la pantalla de acceso en el formulario “CUSTG01”.
• Completa automáticamente los IDs de órdenes usando una secuencia
• Completa automáticamente los IDs de items agregando el ID de órden
actual mas alto
• Personaliza los mensajes de confirmación en el formulario “CUSTOMERS”
• Personaliza la pantalla de acceso en el formulario “CUSTOMERS”

2. Proceso: Práctica del Capítulo 20

2.1. En el formulario “ORDG01” escriba un disparador transaccional sobre el


bloque de datos “S_ORD” que complete “S_ORD.ID” con el valor siguiente de
la secuencia “S_ORD_ID_SK”.
Cree un disparador “Pre-Insert” que asigne un valor desde esta secuencia. Si
ocurre una excepción en el disparador, éste falla con un mensaje.

1/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

Respuesta 1:

En Windows 7 Ultimate 32 Bits, click en:


“Inicio → Todos los programas → Oracle Forms 6i → Form Builder”

2.1 - “Oracle Forms Builder” - ORDG01.fmb


1

Seleccionar “Open an existing form” y click en [ OK ]

2/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.1 - “Oracle Forms Builder” - ORDG01.fmb


2

Seleccionar el archivo de módulo de formulario “ORDG01.fmb” y click en [ Abrir ]

3/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.1 - “Oracle Forms Builder” - ORDG01.fmb


3

Click en “File → Connect...”


Ingresar el “User Name”, “Password”, “Database” y click en [ Connect ]
Mediante la aplicación de símbolo de sistema, utilizar “sqlplus” para conectarse a la Base de
Datos y crear la secuencia “S_ORD_ID_SK”:

SQL> CREATE SEQUENCE S_ORD_ID_SK
INCREMENT BY 1
START WITH 1

4/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.1 - “Oracle Forms Builder” - ORDG01.fmb


4

Seleccionar el nodo “Triggers” correspondiente al bloque de datos “S_ORD” y click en


“Create”

5/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.1 - “Oracle Forms Builder” - ORDG01.fmb


5

Seleccionar el disparador “PRE-INSERT” y click en [ OK ]

6/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.1 - “Oracle Forms Builder” - ORDG01.fmb


6

En el Editor PL/SQL escribir las sentencias:



SELECT S_ORD_ID_SK.NEXTVAL
INTO :S_ORD.ID
FROM SYS.DUAL;
EXCEPTION
WHEN OTHERS THEN
MESSAGE('Failed to assign Order Id');
RAISE FORM_TRIGGER_FAILURE;

Cerrar el Editor PL/SQL

2.2. En el bloque de datos “S_ORD”, configure la propiedad “Enabled” para


el item “ID” con el valor “No”.

7/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

Respuesta 2:

2.2 - “Oracle Forms Builder” - ORDG01.fmb


1

En el Navegador de Objetos seleccionar el nodo del item “S_ORD.ID” y click en


“Tools → Property Palette”
En la Paleta de Propiedades del item “S_ORD.ID” configurar:
• “Enabled” con el valor “No”
Cerrar la Paleta de Propiedades

2.3. Guarde, Compile, y Ejecute el formulario para testear los cambios.


Inserte una órden nueva. El ID único para la órden debería aparecer cuando lo
guarda.

8/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

Respuesta 3:

2.3 - “Oracle Forms Builder” - ORDG01.fmb


1

En el Navegador de Objetos seleccionar el nodo del formulario “ORDERS”


Click en “Save” y en “Run Form Client/Server”

9/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.3 - “Oracle Forms Builder” - ORDG01.fmb


2

Se observa el entorno de tiempo de ejecución del formulario “ORDG01”


Se ingresa un registro nuevo con los siguientes valores:
• Order Id: deshabilitado, valorizado por secuencia
• Date Ordered: 26-JAN-2011
• Date Shipped:
• Customer Id: 204
• Customer Name: Womansport
• Sales Rep Id: 11
• Sales Rep Name: Magee
• Payment Type: Cash
• Order Filled: Sí
• Item Id: 1
• Product Id: 10011
• Description: Boot
• Price: 135
• Quantity: 2
• Quantity Shipped: 2
Click en “Save”

10/
10/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.3 - “Oracle Forms Builder” - ORDG01.fmb


3

Se observa un mensaje de error y no se puede guardar


Se cierra el entorno de tiempo de ejecución y no se realiza otra modificación al formulario

2.4. Cree un disparador similar en el bloque de datos “S_ITEM” que asigne el


item “ITEM_ID” cuando se guarda un registro-fila nuevo.
Derive este número agregando al “ITEM_ID” actual más alto para la órden.
Efectúe la acción en un disparador “Pre-Insert”. Configure la propiedades
“Required” y “Enabled” con el valor “No” para el item “ITEM_ID”.

11/
11/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

Respuesta 4:

2.4 - “Oracle Forms Builder” - ORDG01.fmb


1

En el Navegador de Objetos seleccionar el nodo “Triggers” correspondiente al bloque de


datos “S_ITEM” y click en “Create”

12/
12/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.4 - “Oracle Forms Builder” - ORDG01.fmb


2

Seleccionar el disparador “PRE-INSERT” y click en [ OK ]

13/
13/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.4 - “Oracle Forms Builder” - ORDG01.fmb


3

En el Editor PL/SQL escribir las sentencias:



SELECT NVL( MAX( ITEM_ID ), 0 ) + 1
INTO :S_ITEM.ITEM_ID
FROM S_ITEM
WHERE :S_ITEM.ORD_ID = ORD_ID;

Cerrar el Editor PL/SQL

14/
14/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.4 - “Oracle Forms Builder” - ORDG01.fmb


4

Doble click sobre el nodo del item “S_ITEM.ITEM_ID” y configurar en la Paleta de


Propiedades:
• “Required” con el valor “No”
• “Enabled” con el valor “No”
Cerrar la Paleta de Propiedades

2.5. Guarde, Compile, y Ejecute el formulario para testear los cambios.


Inserte un registro-fila nuevo de línea de item, en el bloque “S_ITEM”, luego
guardelo.
Nota del Instructor:
La solución 20:4 no es la forma mas segura. La mejor solución es mantener el
número total de registros-filas en otra tabla que pueda bloquear, pero esta
solución es demasiado avanzada para esta fase de aprendizaje.

15/
15/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

Respuesta 5:

2.5 - “Oracle Forms Builder” - ORDG01.fmb


1

En el Navegador click en “Save”, y en “Run Form Client/Server”


Click en “Next Block” y click en “Insert Record”
Introducir los siguientes valores:
• Seleccionar de la Lista de Valores el “Product Id”: 10022
• Ingresar las cantidades de: 2
Click en “Save”

16/
16/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.5 - “Oracle Forms Builder” - ORDG01.fmb


2

Se observa otro mensaje de error causado por el disparador “WHEN-VALIDATED-ITEM” en


el campo “S_ITEM.ITEM_ID”
Cerrar el entorno de tiempo de ejecución

2.6. Abra el módulo de formulario “CUSTG01”. Cree tres variables globales


llamadas “GLOBAL.INSERT”, “GLOBAL.UPDATE”, y “GLOBAL.DELETE”.
Estas variables indican respectivamente el número de inserciones,
actualizaciones, y eliminaciones. Necesita escribir disparadores
“POST-INSERT”, “POST-UPDATE”, y “POST-DELETE” para inicializar e
incrementar el valor de cada variable global.

17/
17/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

Respuesta 6:

2.6 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


1

En el Navegador de Objetos click en “Open”


Seleccionar el archivo de módulo de formulario “CUSTG01.fmb”
Seleccionar el nodo “Triggers” correspondiente al bloque de datos “S_CUSTOMER” y click
en “Create”

18/
18/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.6 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


2

Seleccionar el disparador “POST-INSERT” y click en [ OK ]

19/
19/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.6 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


3

En el Editor PL/SQL escribir las sentencias:



DEFAULT_VALUE('0', 'GLOBAL.INSERT');
:GLOBAL.INSERT := TO_CHAR( TO_NUMBER( :GLOBAL.INSERT ) + 1 );

Cerrar el Editor PL/SQL

20/
20/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.6 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


4

En el Navegador de Objetos seleccionar el nodo “Triggers” correpondiente al bloque de


datos “S_CUSTOMER” y click en “Create”

21/
21/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.6 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


5

Seleccionar el disparador “POST-UPDATE” y click en [ OK ]

22/
22/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.6 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


6

En el Editor PL/SQL escribir las sentencias:



DEFAULT_VALUE('0', 'GLOBAL.UPDATE');
:GLOBAL.UPDATE := TO_CHAR( TO_NUMBER( :GLOBAL.UPDATE ) + 1 );

Cerrar el Editor PL/SQL

23/
23/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.6 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


7

En el Navegador de Objetos seleccionar el nodo “Triggers” correspondiente al bloque de


datos “S_CUSTOMER” y click en “Create”

24/
24/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.6 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


8

Seleccionar el disparador “POST-DELETE” y click en [ OK ]

25/
25/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.6 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


9

En el Editor PL/SQL escribir las sentencias:



DEFAULT_VALUE('0', GLOBAL.DELETE);
:GLOBAL.DELETE := TO_CHAR( TO_NUMBER( :GLOBAL.DELETE ) + 1 );

Cerrar el Editor PL/SQL

2.7. Cree un procedimiento llamado “HANDLE_MESSAGE”. Importe el


archivo “pr20_10.txt”. Este procedimiento recibe dos argumentos. El primero
es un número de mensaje, y el segundo es un indicador de error Booleano.
Este procedimiento usa las tres variables globales para mostrar un mensaje de
confirmación personalizado y entonces borra las variables globales.

26/
26/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

PROCEDURE handle_message( message_number IN NUMBER, IS_ERROR IN BOOLEAN ) IS


BEGIN
IF message_number IN (40400, 40406, 40407 ) THEN
DEFAULT_VALUE( '0', 'GLOBAL.INSERT' );
DEFAULT_VALUE( '0', 'GLOBAL.UPDATE' );
DEFAULT_VALUE( '0', 'GLOBAL.DELETE' );
MESSAGE( 'Save Ok: ' ||
:GLOBAL.INSERT || 'records inserted, ' ||
:GLOBAL.UPDATE || 'records updated, ' ||
:GLOBAL.DELETE || 'records deleted!!!'
);
ELSIF IS_ERROR = TRUE THEN
MESSAGE('ERROR: ' || ERROR_TEXT );
ELSE
MESSAGE( MESSAGE_TEXT );
END IF;
END;

Invoque el procedimiento cuando ocurra un error. Pase el código de error y


“TRUE”. Invoque al procedimiento cuando ocurra un mensaje. Pase el código
de mensaje y “FALSE”.

27/
27/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

Respuesta 7:

2.7 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


1

En el Navegador de Objetos seleccionar el nodo “Program Units” y click en “Create”


Seleccionar “Procedure”, ingresar el nombre “HANDLE_MESSAGE” y click en [ OK ]

28/
28/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.7 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


2

En el Editor PL/SQL escribir las sentencias para el procedimiento:



PROCEDURE handle_message( message_number IN NUMBER, IS_ERROR IN
BOOLEAN ) IS
BEGIN
IF message_number IN (40400, 40406, 40407 ) THEN
DEFAULT_VALUE( '0', 'GLOBAL.INSERT' );
DEFAULT_VALUE( '0', 'GLOBAL.UPDATE' );
DEFAULT_VALUE( '0', 'GLOBAL.DELETE' );
MESSAGE( 'Save Ok: ' ||
:GLOBAL.INSERT || 'records inserted, ' ||
:GLOBAL.UPDATE || 'records updated, ' ||
:GLOBAL.DELETE || 'records deleted!!!'
);
ELSIF IS_ERROR = TRUE THEN
MESSAGE('ERROR: ' || ERROR_TEXT );
ELSE
MESSAGE( MESSAGE_TEXT );
END IF;
END;

Cerrar el Editor PL/SQL

29/
29/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.7 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


3

En el Navegador de Objetos seleccionar el nodo “Triggers” correspondiente al formulario


“CUSTOMERS” y click en “Create”

30/
30/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.7 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


4

Seleccionar el disparador “ON-ERROR” y click en [ OK ]

31/
31/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.7 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


5

En el Editor PL/SQL escribir la sentencia:



HANDLE_MESSAGE( ERROR_CODE , TRUE );

Cerrar el Editor PL/SQL

32/
32/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.7 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


6

En el Navegador de Objetos seleccionar el nodo “Triggers” correspondiente al bloque de


datos “S_CUSTOMER” y click en “Create”

33/
33/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.7 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


7

Seleccionar el disparador “ON-MESSAGE” y click en [ OK ]

34/
34/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.7 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


8

En el Editor PL/SQL escribir la sentencia:



HANDLE_MESSAGE( MESSAGE_CODE, FALSE );

Cerrar el Editor PL/SQL

2.8. Abra el módulo de formulario “CUSTG01”. Escriba un disparador


“ON-LOGON” para controlar el número de intentos de conexión. Use la función
incorporada “LOGON_SCREEN” para simular la pantalla de acceso predefinida
y acceda para conectarse a la Base de Datos. Puede importar el archivo
“pr20_11.txt”.
“ON-LOGON” a nivel de formulario

35/
35/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

DECLARE
connected BOOLEAN := FALSE;
tries NUMBER := 3;
un VARCHAR2(30);
pw VARCHAR2(30);
cs VARCHAR2(30);
BEGIN
SET_APPLICATION_PROPERTY( CURSOR_STYLE, 'DEFAULT');
WHILE connected = FALSE AND tries > 0 LOOP
LOGON_SCREEN;
un := GET_APPLICATION_PROPERTY( USERNAME );
pw := GET_APPLICATION_PROPERTY( PASSWORD );
cs := GET_APPLICATION_PROPERTY( CONNECT_STRING );
LOGON( un, pw || '@' || cs, FALSE );
IF FORM_SUCCES THEN
connected := TRUE;
END IF;
tries := tries – 1;
END LOOP;
IF NOT CONNECTED THEN
MESSAGE('Too many tries!');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;

36/
36/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

Respuesta 8:

2.8 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


1

En el Navegador de Objetos seleccionar el nodo “Triggers” correspondiente al formulario


“CUSTOMERS” y click en “Create”

37/
37/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.8 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


2

Seleccionar el disparador “ON-LOGON” y click en [ OK ]

38/
38/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.8 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


3

En el Editor PL/SQL escribir las sentencias:



DECLARE
connected BOOLEAN := FALSE;
tries NUMBER := 3;
un VARCHAR2(30);
pw VARCHAR2(30);
cs VARCHAR2(30);
BEGIN
SET_APPLICATION_PROPERTY( CURSOR_STYLE, 'DEFAULT');
WHILE connected = FALSE AND tries > 0 LOOP
LOGON_SCREEN;
un := GET_APPLICATION_PROPERTY( USERNAME );
pw := GET_APPLICATION_PROPERTY( PASSWORD );
cs := GET_APPLICATION_PROPERTY( CONNECT_STRING );
LOGON( un, pw || '@' || cs, FALSE );
IF FORM_SUCCES THEN
connected := TRUE;
END IF;
tries := tries – 1;
END LOOP;
IF NOT CONNECTED THEN
MESSAGE('Too many tries!');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;

39/
39/40
Oracle Developer Build Forms 1 SW-ORA-20110126
Repuestas a Práctica del Capítulo 20
Revisión: 1
Fecha: 26/01/2011

2.8 - “Oracle Forms Builder” - ORDG01.fmb y CUSTG01.fmb


Cerrar el Editor PL/SQL
Cerrar los módulos de formulario
Desconectar de la Base de Datos
Salir del Constructor de Formularios de Oracle

3. Referencias:

Item Referencia y URL


1 Oracle Developer: Build Forms 1
Volume 2 – Instructor Guide
43112GC10
Production 1.0
April 1999
M08605

Historia de Cambios

Revisión Autor Fecha Descripción


Ezequiel Hernán
1 26/01/2011 Creación del documento.
Villanueva

40/
40/40