Fórum duvida com trigger #404603

08/07/2011

0

Amigos criei uma trigger q altera o volume e a quantidade de madeiras serradas de acordo com um tipo de romaneio, mas estou tendo alguns problemas, quando faço alteraçoes.   Ex: Se faco alteraçoes sem alterar o produto a espessura a largura e comprimento q sao as condiçoes q coloco no FOR SELECT da tudo certo, mas se altero o produto ou uma das outras condiçoes gostaria q ele descontasse todo o volume e a quantidade velha   do produto velho e colocasse o volume e a quantidade no produto novo, pois o q ele ta fazendo é apenas incluir a diferenca do volume no produto novo, alguem sera q pode me dar uma luz de como faço isso?        
 CREATE TRIGGER SALDO_PRODMADDETLCSAI_EDIT FOR ROMEXPSERRSAIDET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable vSaldoProdutosDet decimal(15,3);
BEGIN
for Select produtosmaddet.volume From produtosmaddet 
where produtosmaddet.idprodutomad = new.idproduto 
AND produtosmaddet.larg = new.larg2 
AND produtosmaddet.comp = NEW.comp  
AND produtosmaddet.exp = NEW.esp
into vSaldoProdutosDet
do

update produtosmaddet set produtosmaddet.volume =((produtosmaddet.volume + old.tot2) - NEW.tot2) 
where (produtosmaddet.idprodutomad = NEW.idproduto 
AND produtosmaddet.larg = NEW.larg2 
AND produtosmaddet.comp = NEW.comp 
AND produtosmaddet.exp = NEW.esp);

update produtosmaddet set produtosmaddet.quantidade =((produtosmaddet.quantidade + old.q2) - NEW.q2) where (produtosmaddet.idprodutomad = NEW.idproduto 
AND produtosmaddet.larg = NEW.larg2 
AND produtosmaddet.comp = NEW.comp 
AND produtosmaddet.exp = NEW.esp);
      desde ja agradeço     obrigado...   Delphi 7.0 e Firebird 2.1    
Marcus Braga

Marcus Braga

Responder

Posts

08/07/2011

Rafael Mattos

vc vei ter que fazer a opção reversa aoinves de usar NEW. usa o OLD. voltando para o estoque
Responder

Gostei + 0

08/07/2011

Marcus Braga

No caso seriam duas situações   quando o produto  o comprimento a espessura e a largura forem iguais  eu usaria o .old para remover o valor  antigo do volumetotal do produto 'A' e o .new para colocar o novo valor no volumetotal do produto 'A' nesse caso esta funcionando perfeitamente do jeito q ta.     o problema é outra situaçao é quando o produto ou comprimento ou a espessura ou a largura um deles forem diferentes  (neste caso ela teria q remover o valor antigo do volumetotal do produto 'A'  e adicionar o novo valor no Volumetotal do produto 'B', é isso q ta me dando problema nao sei como usar essas situaçoes na trigger como usar um 'for select' com 'else', espero q tenha sido claro     obrigado...       
Responder

Gostei + 0

08/07/2011

Emerson Nascimento

o rafmattos está correto.

quando você tira do estoque, use OLD, quando inclui, use NEW, visto que você está fazendo uma alteração.

CREATE TRIGGER SALDO_PRODMADDETLCSAI_EDIT FOR ROMEXPSERRSAIDET
ACTIVE AFTER UPDATE POSITION 0
AS
  declare variable vSaldoProdutosDet decimal(15,3);
BEGIN
  -- volta o volume e a quantidade ao valor anterior
  update produtosmaddet set
    produtosmaddet.volume = (produtosmaddet.volume - OLD.tot2),
    produtosmaddet.quantidade = (produtosmaddet.quantidade - OLD.q2)
  where produtosmaddet.idprodutomad = OLD.idproduto
  AND produtosmaddet.larg = OLD.larg2
  AND produtosmaddet.comp = OLD.comp
  AND produtosmaddet.exp = OLD.esp;

  -- incrementa o volume e a quantidade no produto
  update produtosmaddet set
    produtosmaddet.volume = (produtosmaddet.volume + NEW.tot2),
    produtosmaddet.quantidade = (produtosmaddet.quantidade + NEW.q2)
  where produtosmaddet.idprodutomad = NEW.idproduto
  AND produtosmaddet.larg = NEW.larg2
  AND produtosmaddet.comp = NEW.comp
  AND produtosmaddet.exp = NEW.esp;

 
Responder

Gostei + 0

08/07/2011

Marcus Braga

Obrigado rafmattos, e emersom eu tinha entendido mas nao compreendido com a esplicaçao do emerson ficou tudo claro funcionou perfeitamente. Valeu....
Responder

Gostei + 0

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

Aceitar