Ajuda com Trigger de edição
estou fazendo um trigger de edição ... Quando se edita os dados em uma tabela os dados de outra tabela são atualizados...
O Problema é que estes calculos envolvem um divisor e na situação que este dividor é zero eu estou obtendo um erro de divisão por zero
Gostaria de fazer que minha trigger execute um UpdateSet somente no caso do divisor diferente de zero
[b:7e7f79b991][color=darkred:7e7f79b991]Meu problema esta aqui[/color:7e7f79b991][/b:7e7f79b991]
Mais precisamente nesta Linha :arrow: :arrow:
[b:7e7f79b991]materia_prima.saldo - old.quantidade[/b:7e7f79b991]
O que gostaria de fazer é algo tipo isto
Fui claro...
[color=green:7e7f79b991]Movido de Delphi para Interbase/Firebird[/color:7e7f79b991]
O Problema é que estes calculos envolvem um divisor e na situação que este dividor é zero eu estou obtendo um erro de divisão por zero
Gostaria de fazer que minha trigger execute um UpdateSet somente no caso do divisor diferente de zero
AS begin if (new.descricao = old.descricao) then begin update materia_prima set materia_prima.valor= ( materia_prima.saldo * materia_prima.valor + (new.quantidade*new.valor_unitario - old.quantidade*old.valor_unitario))/ ( materia_prima.saldo + (new.quantidade - old.quantidade)), materia_prima.saldo=materia_prima.saldo + (New.quantidade - old.quantidade), materia_prima.data=historico_entradas.data where materia_prima.descricao=historico_entradas.descricao; end else begin update materia_prima set materia_prima.valor=(materia_prima.valor * materia_prima.saldo + new.valor_unitario * new.quantidade)/ (materia_prima.saldo + new.quantidade), materia_prima.saldo=materia_prima.saldo+new.quantidade where materia_prima.descricao=new.descricao; update materia_prima set materia_prima.valor=(materia_prima.valor * materia_prima.saldo - old.valor_unitario * old.quantidade)/ (materia_prima.saldo - old.quantidade), materia_prima.saldo=materia_prima.saldo - old.quantidade where materia_prima.descricao=old.descricao; end
[b:7e7f79b991][color=darkred:7e7f79b991]Meu problema esta aqui[/color:7e7f79b991][/b:7e7f79b991]
update materia_prima set materia_prima.valor=(materia_prima.valor * materia_prima.saldo - old.valor_unitario * old.quantidade)/ (materia_prima.saldo - old.quantidade), materia_prima.saldo=materia_prima.saldo - old.quantidade where materia_prima.descricao=old.descricao;
Mais precisamente nesta Linha :arrow: :arrow:
[b:7e7f79b991]materia_prima.saldo - old.quantidade[/b:7e7f79b991]
O que gostaria de fazer é algo tipo isto
Se materia_prima.saldo = old.quantidade o Update Ficaria assim
materia_prima.valor=0,
materia_prima.saldo=0,
Para materia_prima.saldo > old.quantidade then ai sim eu realizo os calculo..
.Fui claro...
[color=green:7e7f79b991]Movido de Delphi para Interbase/Firebird[/color:7e7f79b991]
Marco Salles
Curtidas 0
Respostas
Micheus
19/07/2006
Que banco vc está utilizando?
Se for Firebird, vc não poderia utilizar um case para retornar a operação correta? Algo assim não funcionaria:
Se for Firebird, vc não poderia utilizar um case para retornar a operação correta? Algo assim não funcionaria:
update materia_prima set materia_prima.valor = case when (materia_prima.saldo - old.quantidade) = 0 then 0 else (materia_prima.valor * materia_prima.saldo - old.valor_unitario * old.quantidade)/ (materia_prima.saldo - old.quantidade) end, materia_prima.saldo = case when (materia_prima.saldo - old.quantidade) = 0 then 0 else materia_prima.saldo - old.quantidade end where materia_prima.descricao=old.descricao;
GOSTEI 0
Marco Salles
19/07/2006
Beleza micheus , eu ja tinha tentado com case , inclusive , efetuando uma pesquisa aqui no forum .. Mas não estava conseguindo colocar a sintase para faze-lo commitar... Muito agradecido mesmo :P :P :P
Estou tb com dificuldade no topico abaixo
http://forum.clubedelphi.net/viewtopic.php?t=79003&highlight=
Tb Pequisei aqui no forum e tentei colocar a instrução no Banco
A ideia é gerar uma exceção , para que possa trata-la no evento OnReconcileError do ClientDataSet. Porem , não sei porque , não consigo captutar este Erro para que trasmita uma mensagem mais amigável
Tem Alguma idíea .. Muito obrigado
Estou tb com dificuldade no topico abaixo
http://forum.clubedelphi.net/viewtopic.php?t=79003&highlight=
Tb Pequisei aqui no forum e tentei colocar a instrução no Banco
AS begin if (exists(select 1 from composicao where DESCRICAO=new.descricao)) then exception ERROR_CHAVE_DUPLICADA_COMPOSICA ; else begin insert into materia_prima (descricao,Saldo,data,Valor,Unidades) values (new.descricao,0,CURRENT_DATE,0,new.unidade); end end
A ideia é gerar uma exceção , para que possa trata-la no evento OnReconcileError do ClientDataSet. Porem , não sei porque , não consigo captutar este Erro para que trasmita uma mensagem mais amigável
Tem Alguma idíea .. Muito obrigado
GOSTEI 0