Este documento contiene la documentación y código de varios formularios y procedimientos de una aplicación de gestión comercial desarrollada en Oracle Forms. Incluye la descripción y código de los formularios de clientes, pedidos, proveedores y otros, así como los procedimientos y disparadores asociados para realizar funciones como creación, edición, eliminación y consulta de registros.
1. Base de datos Ing. Edwin Calle Terrazas
S I S T E M A C O M E R C I A L
FORMULARIO CLIENTE
WHEN-WINDOW- ACTIVATED : (Tambien para cuando cargue sus datos del form: do_key('execute_query' );
set_item_property('GUARDAR',enabled,property_true);
WHEN-NEW-FORM-INSTANCE
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,window_state,maximize);
SET_WINDOW_PROPERTY('MCLIENTE',window_state,maximize);
PRE-INSERT
select contador_cliente.nextval
into :CLIENTE.CODCLIENTE
from sys.dual;
exception
when others then message('Falla en asignación de Cliente.CodCliente..!!');
raise form_trigger_failure;
PRE-QUERY
:Cliente.codcliente:=:parameter.codigo;
KEY-ENTQRY
do_key('execute_query');
2. Base de datos Ing. Edwin Calle Terrazas
-------------------------Botones----------------------------
BT_NUEVO WHEN-BUTTON-PRESSED
go_block('CLIENTE');
create_record;
set_item_property('NUEVO',enabled,property_false);
set_item_property('GUARDAR',enabled,property_True);
set_item_property('MODIFICAR',enabled,property_false);
set_item_property('ELIMINAR',enabled,property_false);
BT_GRABAR
go_block('CLIENTE');
commit_form;
set_item_property('NUEVO',enabled,property_True);
set_item_property('GUARDAR',enabled,property_false);
MODIFICAR
if :System.Mode = 'NORMAL' then
go_block('Cliente');
commit_form;
end if;
clear_block(No_Validate);
do_key('enter_query');
ELIMINAR
go_block('cliente');
delete_record;
commit_form;
BUSCAR
IF SHOW_LOV('LISTA_CLIENTE') then null; //Hay q crear un LOV’s llamado: LISTA_CLIENTE, que retorne
end if; //valor en el campo codcliente
:parameter.codigo:=:cliente.codcliente;
clear_block(No_Validate);
if :system.mode <> 'Enter-query' then
do_key('enter_query');
end if;
CREACIÓN DE MENUS
SALIR
exit_form;
CONSULTAR
go_block('CLIENTE');
execute_query;
set_item_property('MODIFICAR',enabled,property_true);
set_item_property('ELIMINAR',enabled,property_True);
set_item_property('GUARDAR',enabled,property_false);
set_item_property('NUEVO',enabled,property_true);
PRIMERO
go_block('CLIENTE');
FIRST_RECORD;
ANTERIOR
go_block('CLIENTE');
PREVIOUS_RECORD;
SIGUIENTE
go_block('CLIENTE');
NEXT_RECORD;
ULTIMO
go_block('CLIENTE');
LAST_RECORD;
3. Base de datos Ing. Edwin Calle Terrazas
FORMULARIO PRINCIPAL
(Ambos en modo diseño)
WHEN-WINDOW-ACTIVATED
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,window_stat
e,maximize);
Read_Image_File('D:ProyimgSTART.bmp', 'ANY',
'CONTROL.PANTALLA');
WHEN-NEW-FORM-INSTANCE (op)
SET_WINDOW_PROPERTY('PRINCIPAL',window_state,maximize);
CREACIÓN DE MENU PRINCIPAL
(Quedaría de esta forma)
open_form('d:proyfrmcliente');
Antes de crearlo o compilarlo tenemos q introducir codigo a todos los
submenu, no debe haber ninguno sueldo.
Luego hacemos:
File – Administración – Compile File
Para insertarlo en el formulario
clic Der en Form PRINCIPAL – Paleta de Propiedades
Menu Module: d:proymenmenu.mmx
4. Base de datos Ing. Edwin Calle Terrazas
FORMULARIO PEDIDOS ( MAESTRO / DETALLE )
Creamos el bloque pedido y luego añadimos el text NOM_EMP, APE_EMP y NOM_CLI, APE_CLI
NOM_EMP, APE_EMP, NOM_CLI y APE_CLI, no son item de la base de datos, o sea Database item= No
Crear los LOV, luego en la paleta de Prop colocar los LOVs en CODEMP,CODCLIENTE y CODPRO .
ON-CLEAR-DETAILS, se crea por la relacion Maestro / Detalle
También, ON-POPULATE-DETAILS y ON-CHECK-DELETE-MASTER
WHEN-NEW-FORM- INSTANCE (mejor colocarlo en Nuevo)
:pedido.fecha:=sysdate; o también para cambiarle formato
--:pedido.fecha:=TRUNC(TO_DATE(sysdate,'DD/MM/YY'), 'MONTH');
WHEN-VALIDATE-ITEM (CODEMP)
declare cod number;
begin
cod:=:PEDIDO.CODEMP;
select nombre, apellidos
into :PEDIDO.NOM_EMP, :PEDIDO.APE_emp
from empleado
where codemp=cod;
end;
WHEN-VALIDATE-ITEM (CODCLIENTE)
declare cod number;
begin
cod:=:PEDIDO.CODCLIENTE;
select nombre, apellidos
into :PEDIDO.NOM_CLI, :PEDIDO.APE_CLI
from CLIENTE
where codcliente=cod;
end;
KEY-ENTQRY
go_block('Pedido');
do_key('execute_query');
go_block('Detalle_Pedido');
do_key('execute_query');
PRE-QUERY
:Pedido.nroped:=:parameter.codven;
PRE-INSERT
select contador_pedido.nextval
into :PEDIDO.NROPED
from sys.dual;
exception
when others then
message('Falla en asignación de
PEDIDO.NROPED..!!');
raise form_trigger_failure;
POST-QUERY: Después de consultar cada registro de
pedido, permite mostrar los nombres y apellidos de Cliente
y Empleado (si usamos siguiente, anterior, etc)
select nombre, apellidos
into :PEDIDO.NOM_CLI, :PEDIDO.APE_CLI
from CLIENTE
where codcliente=:pedido.codcliente;
select nombre, apellidos
into :PEDIDO.NOM_emp, :PEDIDO.APE_emp
from empleado
where codemp=:pedido.codemp;
5. Base de datos Ing. Edwin Calle Terrazas
Luego crear con el asistente el bloque DETALLE_PEDIDO (relacionar con PEDIDO)
Añadir el text DESCRIPCION y SUBTOTAL(database item=No), Crear si no lo creado y en Prop de CODPRO añadir el LOV (L_PRO)
Luego colocar los siguientes disparadores:
Propiedades de SUBTOTAL
Clic der Prop al Item SUBTOTAL:
nvl(:detalle_pedido.preciov*:detalle_pedido.cantidad,0)
Para el total, crear un nuevo bloque de forma manual: TOTALES
Item type : Display item
Data type : Number
Maximun Length : 16
Cuando pierda el enfoque, pero validando sobre el item
WHEN-VALIDATE-ITEM (Para el campo CODPRO)
select descripcion
into :detalle_pedido.descripcion
from producto
where codpro=:detalle_pedido.codpro;
select precio
into :detalle_pedido.preciov
from producto
where codpro = :detalle_pedido.codpro;
--Cuando colocamos el item CODPRO hace le calculo
:detalle_pedido.SUBTOTAL:= nvl(:detalle_pedido.preciov *
:detalle_pedido.cantidad,0);
POST-QUERY: Para q al consultar cada registro de los
productos muestre su descripción y precio.
Basta con esto:
select descripcion
into :detalle_pedido.descripcion
from producto
where codpro=:detalle_pedido.codpro;
WHEN-VALIDATE-ITEM para CANTIDAD
declare cant number;
begin
select stock into cant from Producto
where codpro = :detalle_pedido.codpro;
if :detalle_pedido.cantidad > cant then
:detalle_pedido.cantidad:=cant;
message('No existe la cantidad de produtos');
end if;
end;
select descripcion, precio
into :detalle_pedido.descrip, :detalle_pedido.preciov
from producto where codpro = :detalle_pedido.codpro;
:detalle_pedido.subtotal:= nvl(:detalle_pedido.preciov *
:detalle_pedido.cantidad,0);
6. Base de datos Ing. Edwin Calle Terrazas
Crear un Canvas (lienzo), de tipo Horizontal Toolbar, con el nombre de BARRA
Luego crear un Bloque manualmente, con el nombre: BOTONES
Después poner los botones en BARRA, sobre el Lienzo, pero tiene q colocarse en los item del bloque BOTONES.
NUEVO WHEN-BUTTON-PRESSED
go_block('botones');
create_record;
clear_form;
set_item_property('NUEVO',enabled,property_false);
set_item_property('GUARDAR',enabled,property_True);
:pedido.fecha:=sysdate;
GUARDAR
go_block('Pedido');
commit_form;
go_block('Detalle_Pedido');
commit_form;
set_item_property('NUEVO',enabled,property_true);
set_item_property('GUARDAR',enabled,property_false);
MODIFICAR
go_block('Detalle_Pedido');
if :system.form_status = 'CHANGED' then
commit_form;
end if;
set_item_property('NUEVO',enabled,property_true);
set_item_property('GUARDAR',enabled,property_false);
ELIMINAR
go_block('DETALLE_PEDIDO');
delete_record;
go_block('PEDIDO');
delete_record;
commit_form;
7. Base de datos Ing. Edwin Calle Terrazas
WHEN-WINDOW-ACTIVATED
go_block('proveedor');
do_key('execute_query');
activarbotones;
KEY-ENTQRY
do_key('execute_query');
PRE-QUERY
:proveedor.codproveedor:=:parameter.codigo;
FORMULARIO PROVEEDOR
Después de crear el bloque con el asistente, coloca un Tab Canvas, y dentro de el coloca los Text Item
(El Tab Cambas no es necesario usar aquí porque es cuando queremos ver varias fichas de formularios, solo usaremos la ficha REGISTRAR)
Después colocamos los siguientes procedimientos que permite activar y desactivas los botones
Después creamos una alerta con el nombre ALERTA, luego Prop: Title : Mensaje
Default Button Alert : Button2
Para cambiar el text item por un Combo Box, Propiedades del Text item PAIS
Item Type : List item Element list : Colocar los elementos y un List item value
List style : PopList Column name : PAIS
También creamo una lista llamada: L_PROVEEDOR para el campo CODPROVEEDOR
PROCEDURE ActivarBotones IS
it_nuevo item;
it_guardar item;
it_modificar item;
it_eliminar item;
it_buscar item;
it_salir item;
BEGIN
go_block('proveedor');
it_nuevo:=find_item('nuevo');
it_guardar:=find_item('guardar');
it_eliminar:=find_item('eliminar');
it_modificar:=find_item('modificar');
it_buscar:=find_item('buscar');
Set_Item_Property(it_nuevo,enabled,property_true);
Set_Item_Property(it_guardar,enabled,property_false);
Set_Item_Property(it_modificar,enabled,property_true);
Set_Item_Property(it_buscar,enabled,property_true);
Set_Item_Property(it_eliminar,label,'&ELIMINAR');
END;
PROCEDURE DesactivarBotones IS
it_nuevo item;
it_guardar item;
it_eliminar item;
it_modificar item;
it_buscar item;
it_salir item;
BEGIN
go_block('proveedor');
it_nuevo:=find_item('nuevo');
it_guardar:=find_item('guardar');
it_eliminar:=find_item('eliminar');
it_modificar:=find_item('modificar');
it_buscar:=find_item('buscar');
Set_Item_Property(it_nuevo,enabled,property_false);
Set_Item_Property(it_guardar,enabled,property_true);
Set_Item_Property(it_modificar,enabled,property_false);
Set_Item_Property(it_buscar,enabled,property_false);
Set_Item_Property(it_eliminar,label,'&DESCARTAR');
END;
8. Base de datos Ing. Edwin Calle Terrazas
Seguidamente introducimos código a los botones
NUEVO
declare
it_eliminar item;
begin
it_eliminar:=find_item('ELIMINAR');
:parameter.codigo:=:proveedor.codproveedor;
do_key('create_record');
:proveedor.codproveedor:=0;
DesactivarBotones;
:parameter.estado:='Nuevo';
end;
ELIMINAR
declare
idalerta alert;
boton number;
begin
idalerta:=find_alert('alerta');
set_alert_property(idalerta,alert_message_text,'Seguro de Salir');
boton:=show_alert(idalerta);
if boton=alert_button1 then
do_key('delete_record');
do_key('commit_form');
select max(codproveedor) into :parameter.codigo
from proveedor;
do_key('enter_query');
end if;
end;
GUARDAR
begin
--como Tiene contador lo llamamos si el
estado es Nuevo
if :parameter.estado='Nuevo' then
select contador_proveedor.nextval
into :proveedor.codproveedor
from dual;
end if;
do_key('commit_form');
ActivarBotones;
end;
MODIFICAR
begin
DesactivarBotones;
:parameter.codigo:=:proveedor.
codproveedor;
:parameter.estado:='Modificar';
do_key('enter_query');
end;