Fórum Ajuda com Trigger de edição #56575

19/07/2006

0

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

Responder

Posts

19/07/2006

Micheus

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;



Responder

Gostei + 0

20/07/2006

Marco Salles

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar