Forms – Block – Transactional Triggers
Olá pessoal, tudo bem?
Bom, faz um tempo que não posto nada em meu blog, mas aqui vai mais um para quem interessar.
Apenas um exemplo de um Forms com um bloco usando Transactional Triggers que em alguns casos é muito útil. Este exemplo usa algumas triggers de bloco onde é executado um cursor e também faz DML.
Passo 1
Criar um bloco e informar na propriedade Query Data Source Type: Transactional Triggers
Observe que quando o bloco for realizar consulta e alteração, ou seja, query e dml, informar nos dois lugares como no exemplo. Ou, em um dos lugares conforme a necessidade da tua aplicação.
Passo 2
Criar uma Program Units do tipo Package com as seguintes procedures como apresentadas no exemplo abaixo:
Primeiro cria-se a Specification:
PACKAGE teste IS
procedure pr_select;
procedure pr_fetch;
procedure pr_close;
procedure pr_update;
procedure pr_insert;
procedure pr_delete;
procedure pr_lock;
END;
Depois cria-se a Body:
PACKAGE BODY teste IS
cursor c_clie is
select ltrim(rtrim(nom_cliente)) nom_cliente
, cod_cgc
, cod_cpf
, num_rg
, id_cliente
from clientes_vendas
order by nom_cliente;
procedure pr_select is
begin
if c_clie%isopen then
close c_clie;
end if;
open c_clie;
exception
when others then
message('Selecionando dados: '||sqlerrm);
end pr_select;
procedure pr_fetch is
begin
create_queried_record;
fetch c_clie
into :clientes_vendas.nom_cliente
, :clientes_vendas.cod_cgc
, :clientes_vendas.cod_cpf
, :clientes_vendas.num_rg
, :clientes_vendas.id_cliente;
exception
when others then
message('Carregando dados: '||sqlerrm);
end pr_fetch;
procedure pr_close is
begin
if c_clie%isopen then
close c_clie;
end if;
exception
when others then
message('Concluindo: '||sqlerrm);
end pr_close;
procedure pr_update is
begin
update clientes_vendas
set nom_cliente = :clientes_vendas.nom_cliente
, cod_cgc = :clientes_vendas.cod_cgc
, cod_cpf = :clientes_vendas.cod_cpf
, num_rg = :clientes_vendas.num_rg
where id_cliente = :clientes_vendas.id_cliente;
exception
when others then
message('Atualizando: '||sqlerrm);
end pr_update;
procedure pr_insert is
begin
insert into clientes_vendas
( nom_cliente
, cod_cgc
, cod_cpf
, num_rg
, id_cliente )
values ( :clientes_vendas.nom_cliente
, :clientes_vendas.cod_cgc
, :clientes_vendas.cod_cpf
, :clientes_vendas.num_rg
, :clientes_vendas.id_cliente );
exception
when others then
message('Inserindo: '||sqlerrm);
end pr_insert;
procedure pr_delete is
begin
delete clientes_vendas
where id_cliente = :clientes_vendas.id_cliente;
exception
when others then
message('Excluindo: '||sqlerrm);
end pr_delete;
procedure pr_lock is
begin
null;
exception
when others then
message('Controle: '||sqlerrm);
end pr_lock;
END;
Passo 3
Adicionar as triggers ao bloco.
Adicionar nas triggers a chamada de cada procedure da package
Pronto! Agora é só executar o forms e assim os dados serão carregados e ao realizar alguma alteração disparará as triggers.
Abraços