Fórum Como usar Trigger? #57630
10/01/2007
0
SET SQL DIALECT 3; SET NAMES ISO8859_1; SET TERM ^ ; CREATE TRIGGER RESTRICAOVALORTBCONTA FOR TBCONTA ACTIVE BEFORE INSERT POSITION 0 AS begin /* Trigger Para nao ficar valor null*/ if (Exists(Select * from tbconta where valor = ´´) ) then Exception RESTRICAO ´O campo valor nao pode ficar em branco´; end ^ SET TERM ; ^
A ideia eh para criar uma restriçao aonde nao pode incluir valores nulos no campo valor da tabela, a restricao ja criei no [b:f22e41ee56]Exception[/b:f22e41ee56] do IBExpert, entao gostaria de saber se esta certo essa Trigger?
Agradeço a opniao de todos.
Adriano.
[b:f22e41ee56][color=blue:f22e41ee56]E tambem se puderem me explicar, se eh melhor usar trigger, em vez de usar codigos dentro da unit do delphi! Ou seja eu posso muito bem fazer um codigo de restriçao no evento onexit do componente, mais gostaria da opnião do pessoal, se eh mais vantajoso usar na trigger ou no programa mesmo.[/color:f22e41ee56][/b:f22e41ee56]
Abçs;
Adriano_servitec
Curtir tópico
+ 0Posts
10/01/2007
Sremulador
CREATE EXCEPTION RESTRICAO´CAMPO NÃO PODE SER NULO´;
depois ajuste o gatilho
CREATE TRIGGER RESTRICAOVALORTBCONTA FOR TBCONTA ACTIVE BEFORE INSERT POSITION 0 AS begin /* Trigger Para nao ficar valor null*/ if (Exists(Select * from tbconta where valor is null ) then Exception RESTRICAO; end
os gatilhos são como ações assim como ocorre no delphi, tipo onclick, onexit, assim vai, neste caso são antes de inserir, depois, antes de exluir depois, antes de alterar e depois
Gostei + 0
10/01/2007
Adriano_servitec
O mesmo se aplica para esta ação tambem sremulador?
ALTER TRIGGER UNIQSEQCONTA ACTIVE BEFORE INSERT POSITION 0 AS begin if ( Exists(Select * from tbconta WHERE sequencia = NEW.sequencia ) ) then Exception RESTRICAO ´Campo Matrícula Já Existe!´; end
Gostei + 0
10/01/2007
Sremulador
ALTER TRIGGER UNIQSEQCONTA ACTIVE BEFORE INSERT POSITION 0 AS begin if ( Exists(Select * from tbconta WHERE sequencia = NEW.sequencia ) ) then Exception RESTRICAO; end
No caso de seu select não haveria ´Acho´ do * já que e uma comparação sem pegar resultados para um terceiro tratamento, assim ficará mais rapido a ação...
Gostei + 0
10/01/2007
Adriano_servitec
CREATE EXCEPTION RESTRICAO ´´;
Valeu amigo.
Gostei + 0
10/01/2007
Emerson Nascimento
CREATE TRIGGER RESTRICAOVALORTBCONTA FOR TBCONTA ACTIVE BEFORE INSERT POSITION 0 AS begin /* Trigger Para nao ficar valor null*/ if (NEW.VALOR IS NULL) then Exception RESTRICAO; end
Gostei + 0
10/01/2007
Adriano_servitec
CREATE TRIGGER RESTRICAOVALORTBCONTA FOR TBCONTA ACTIVE BEFORE INSERT POSITION 0 AS begin /* Trigger Para nao ficar valor null*/ if (NEW.VALOR IS NULL) then Exception RESTRICAO; end
AS begin if ( Exists(Select * from tbconta WHERE sequencia = NEW.sequencia ) ) then Exception RESTRICAO; end
Gostei + 0
10/01/2007
Sremulador
Gostei + 0
10/01/2007
Sremulador
Gostei + 0
10/01/2007
Adriano_servitec
Mais uma pergunta essas triger ela dispara somente na hora em que vou gravar no banco ou tem como disparar antes? Como faço no evento onexit dentro do delphi.
Ainda mais uma pergunta: Tenho uma tabela com campos assim
tabmovimento
sequencia
conta
descricao
valor
e outra tabdebido(tabela filha)
sequencia (FK) (Refernecia com a tabela tabmovimento)
conta_D
descricao
valor
E na hora em que eu for gravar no form vai gravar na tabmovimento o que eu digitar no form, a pergunta seria como posso gravar tambem os mesmos dados na tabela (filha)? Preciso ao mesmo tempo fazer um codigo para as duas tabelas tipo assim
insert into tabmovimento
....
parambyname(´campos´).AsString:=editConta;
execsql
insert into tabdebito
...
parambyname(´campos´).AsString:=editConta;
execSQL
Ou tem como fazer somente em uma tabela e a outra ja receber o resultado?
Gostei + 0
10/01/2007
Sremulador
Tem a opção Antes e Depois
Belfore Alfter
Diretamente no db somente /se um usuário estiver por vez, mas desconhece...
Gostei + 0
10/01/2007
Adriano_servitec
Supondo que a estrutura da tabela fosse:
Mestre
----------------
Codigo - Integer
Descricao - Varchar(50)
Data - Date
Detalhe
----------------
Cod_Mestre - Integer
Cod_Produto - Integer
Quantidade - Integer
Set term ^ ; create procedure GravaDados( Cod_Mestre Integer, Desc_Mestre varchar(50), Data_Mestre Date, Cod_Produto Integer, Quantidade Integer ) as begin if ( not exists(select codigo from Mestre where codigo = :Cod_Mestre) )then Insert into Mestre Values ( Cod_Mestre, Desc_Mestre, Data_Mestre ); Insert into Detalhe Values (Cod_Mestre, Cod_Produto, Quantidade ); end ^ Set Term ; ^
Gostei + 0
11/01/2007
Adriano_servitec
(Espero que esteja correta) :D
SET TERM ^ ; CREATE PROCEDURE GRAVADADOS ( SEQUENCIA INTEGER, CONTA VARCHAR(15), HISTORICO VARCHAR(100), VALOR NUMERIC(15,2), CONTAD VARCHAR(15)) AS begin if ( not exists(select * from tbconta where sequencia = :sequencia) ) then Insert Into tbconta (sequencia, conta, historico, valor) Values (:sequencia, :conta, :historico, :valor); Insert into debito (sequencia, contad, historico, valor) Values ( :sequencia, :contad, :historico, :valor ); Suspend; end^ SET TERM ; ^ GRANT SELECT,INSERT ON TBCONTA TO PROCEDURE GRAVADADOS; GRANT INSERT ON DEBITO TO PROCEDURE GRAVADADOS; GRANT EXECUTE ON PROCEDURE GRAVADADOS TO SYSDBA;
Agora entao se eu for usar query ou IBStoredProc terei que passar os parametros da SP que eu criei?
Tipo assim:
[b:8c9475a6ae]select * form GRAVADADOS (:SEQUENCIA, :CONTA, :HISTORICO, :VALOR, :CONTAD)[/b:8c9475a6ae]assim da erro [color=red:8c9475a6ae]procedure gravadados does not return any values delphi[/color:8c9475a6ae]
Usando um IBStoredProcedure da o sequinte erro: [color=red:8c9475a6ae]use execproc for procedure use tquery for select procedure delphi[/color:8c9475a6ae] Neste caso eu apontei a propriedade StoredProcName para GRAVADADOS , e apareçe os paramentro da propriedade parametes assim:
0-sequencia
1-conta
2-historico
3-valor
4-contad
O que esta errado pq nao consigo ativar nenhum dois dois modos?
Outra coisa
Pq o que eu quero que essa Stored procedure faça eh incluir dois lançamentos (alias serah 3 lançamentos de uma soh vez, ou seja vai incluir na tabela movimento, debito e credito de uma soh vez).
Grato a ajuda de todos.
Adriano.
Gostei + 0
11/01/2007
Emerson Nascimento
EXECUTE PROCEDURE GRAVADADOS (:SEQUENCIA, :CONTA, :HISTORICO, :VALOR, :CONTAD)
e chamar o método Execute (ou similar). nesse caso não se usa open.
no IBStoredProcedure você deve apenas preencher os parâmetros e executá-la. outra coisa: não sei se tem influência no erro, mas, como sua SP não retorna dados, o [i:ceaaea2395]Suspend[/i:ceaaea2395] é desnecessário.
Gostei + 0
11/01/2007
Emerson Nascimento
CREATE PROCEDURE GRAVADADOS ( SEQUENCIA INTEGER, CONTA VARCHAR(15), HISTORICO VARCHAR(100), VALOR NUMERIC(15,2), CONTAD VARCHAR(15)) AS begin if ( not exists(select sequencia from tbconta where sequencia = :sequencia) ) then begin Insert Into tbconta (sequencia, conta, historico, valor) values (:sequencia, :conta, :historico, :valor); Insert into debito (sequencia, contad, historico, valor) values ( :sequencia, :contad, :historico, :valor ); end; -- Suspend; end^
Gostei + 0
11/01/2007
Adriano_servitec
Soh mais uma pergunta Emerson, eu escrevo:
[b:eab27f7f14]EXECUTE PROCEDURE GRAVADADOS (:SEQUENCIA, :CONTA, :HISTORICO, :VALOR, :CONTAD)[/b:eab27f7f14] dentro da propriedade SQL? ou faço algo tipo assim num button que vou usar para incluir os dados:
with dm.QuerySProc do begin close; SQL.clear; sql.add(´EXECUTE PROCEDURE GRAVADADOS (:SEQUENCIA, :CONTA, :HISTORICO, :VALOR, :CONTAD)´); ExecSQL
[b:eab27f7f14]Obs:A StoredProcedure eu vou arrumar cfe. vc postou.[/b:eab27f7f14]
Desculpe por postar essas perguntas, mais realmente ainda nao sei usar Stored Procedure.
[color=blue:eab27f7f14]Sobre os compoentes IBStoredProc e IBQuery se possivel for prefiro usar o IBQuery.[/color:eab27f7f14]
Obrigado amigo.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)