Ajuda com Trigger de edição

Firebird

19/07/2006

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

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

Marco Salles

Curtidas 0

Respostas

Micheus

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:

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

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

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
POSTAR