duvida com trigger
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?
desde ja agradeço
obrigado...
Delphi 7.0 e Firebird 2.1
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);
Marcus Braga
Curtidas 0
Respostas
Rafael Mattos
08/07/2011
vc vei ter que fazer a opção reversa aoinves de usar NEW. usa o OLD. voltando para o estoque
GOSTEI 0
Marcus Braga
08/07/2011
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...
GOSTEI 0
Emerson Nascimento
08/07/2011
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;
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;
GOSTEI 0
Marcus Braga
08/07/2011
Obrigado rafmattos, e emersom eu tinha entendido mas nao compreendido com a esplicaçao do emerson ficou tudo claro funcionou perfeitamente. Valeu....
GOSTEI 0