Dúvida trigger para atualizar saldo
Saudações!!!!
Desenvolvi uma trigger onde para cada item inserido na tabela ITENS_CONTA, atualiza-se o valor total da conta (campo VLR_CTA da tabela de CONTAS).
Quando eu a executei, não deu nenhum erro. Fiz um teste no programa, criei uma nova conta, salvei, gerando um código para CD_CTA (código da conta), inclui um item como teste, e ao fazer um select no banco, verifique que o valor da conta não foi atualizado.
Peço uma ajuda a todos para que possar encontrar o erro. Para isso, vejam abaixo a trigger que eu criei no FIREBIRD:
//////
CREATE TRIGGER TRG_ATUALIZA_TOTAL_CTA FOR ITENS_CONTA
ACTIVE AFTER INSERT POSITION 0
as
begin
if (inserting) then
begin
update CONTAS
set VLR_CTA = VLR_CTA + new.TOTAL
where CD_CTA = new.CD_CTA;
end
end
^
SET TERM ; ^
Obs.: Estou usando o Delphi 2006, e os componentes SQLDATASET, DATASETPROVIDER e CLIENTDATASET.
Um abraço a todos, e desde já agradeço pela atenção.
Rogério
Desenvolvi uma trigger onde para cada item inserido na tabela ITENS_CONTA, atualiza-se o valor total da conta (campo VLR_CTA da tabela de CONTAS).
Quando eu a executei, não deu nenhum erro. Fiz um teste no programa, criei uma nova conta, salvei, gerando um código para CD_CTA (código da conta), inclui um item como teste, e ao fazer um select no banco, verifique que o valor da conta não foi atualizado.
Peço uma ajuda a todos para que possar encontrar o erro. Para isso, vejam abaixo a trigger que eu criei no FIREBIRD:
//////
CREATE TRIGGER TRG_ATUALIZA_TOTAL_CTA FOR ITENS_CONTA
ACTIVE AFTER INSERT POSITION 0
as
begin
if (inserting) then
begin
update CONTAS
set VLR_CTA = VLR_CTA + new.TOTAL
where CD_CTA = new.CD_CTA;
end
end
^
SET TERM ; ^
Obs.: Estou usando o Delphi 2006, e os componentes SQLDATASET, DATASETPROVIDER e CLIENTDATASET.
Um abraço a todos, e desde já agradeço pela atenção.
Rogério
Roger1976
Curtidas 0
Respostas
Titanius
07/10/2006
Amigo, verifique duas coisas, primeiramente se você etá dando o ApplyUpdate no ClientDataSet, caso sim, tente mudar o codigo pra deste jeito:
Não vejo o porque do if (inserting), pois se a trigger já está no After Insert, teoricamente sempre vai excutar se estiver inserindo.. :wink:
[]s
update CONTAS set VLR_CTA = COALESCE(VLR_CTA, 0) + COALESCE(new.TOTAL, 0) where CD_CTA = new.CD_CTA;
Não vejo o porque do if (inserting), pois se a trigger já está no After Insert, teoricamente sempre vai excutar se estiver inserindo.. :wink:
[]s
GOSTEI 0
Roger1976
07/10/2006
Amigo, funcionou blz....
Muito obrigado!!!!!!!!!!!
Muito obrigado!!!!!!!!!!!
GOSTEI 0
Titanius
07/10/2006
Disponha...
uma dica... [b:0b20546be1]sempre[/b:0b20546be1] que você for fazer algum cálculo em alguma trigger e Store Procedure em [b:0b20546be1]Firebird[/b:0b20546be1], e o campo em questão pode vir NULL, coloque o COALESCE... pois se o campo for nulo, ele não calcula...
É o que eu faço... em todos os campos que faz parte de algum cálculo eu coloco o Coalesce.. pra evitar este tipo de problema.. :D
[]s
uma dica... [b:0b20546be1]sempre[/b:0b20546be1] que você for fazer algum cálculo em alguma trigger e Store Procedure em [b:0b20546be1]Firebird[/b:0b20546be1], e o campo em questão pode vir NULL, coloque o COALESCE... pois se o campo for nulo, ele não calcula...
É o que eu faço... em todos os campos que faz parte de algum cálculo eu coloco o Coalesce.. pra evitar este tipo de problema.. :D
[]s
GOSTEI 0