Fórum TRIGGERS MYSQL - Atualizar as quantidades no estoque #574794
09/02/2017
0
preciso saber qual a melhor forma para efetuar a atualização nas quantidades do estoque ao efetuar o cancelamento da nota de entrada, já está funcionado uma rotina de 3 TRIGGERS para atualizar as quantidade no estoque (cadastro de produtos mesmo), só que elas funcionam na tela de manutenção de itens, para incluir, alterar ou excluir, o problema é quando eu preciso cancelar a nota, e retirar vários itens ao mesmo tempo, Como a minha Tabela de entrada no estoque está em modo deletar em cascata os produtos inseridos na tabela de detalhe de itens(detalhe_nota_e), eu achei que o gatilho de deletar ocorreria automaticamente, mais não foi o que ocorreu, resumindo, eu preciso saber como retirar as entradas do cadastro de produto ao efetuar o cancelamento da Nota de entrada ?
Segue abaixo, os gatilhos funcionando bem na manutenção de Itens da nota de entrada:
Update
CREATE TRIGGER `projnovo`.`Trigger_Nota_Update` AFTER UPDATE ON `projnovo`.`detalhe_nota_e` FOR EACH ROW BEGIN IF (NEW.quant_item < OLD.quant_item) THEN UPDATE produtos SET quant_estoq = quant_estoq - OLD.quant_item + NEW.quant_item where codigo = OLD.codigo_item; END IF; IF (NEW.quant_item > OLD.quant_item) THEN UPDATE produtos SET quant_estoq = quant_estoq - OLD.quant_item + NEW.quant_item where codigo = NEW.codigo_item; END IF; END;
Delete
CREATE TRIGGER `projnovo`.`Trigger_NotaE_Del` AFTER DELETE ON `projnovo`.`detalhe_nota_e` FOR EACH ROW BEGIN UPDATE produtos SET quant_estoq = quant_estoq - OLD.quant_item where codigo = OLD.codigo_item; END;
insert
BEGIN UPDATE produtos SET quant_estoq = quant_estoq + NEW.quant_item where codigo = NEW.codigo_item; END;
Mauro Monteiro
Curtir tópico
+ 0Post mais votado
09/02/2017
Acho que a forma que você está fazendo não é a melhor.
O mais correto seria pensar no seu estoque como uma conta corrente, com laçamentos positivos (entrada de material no estoque) e lançamentos negativos (vendas)
No caso de um cancelamento, você não precisaria necessariamente excluir o registro, mas apenas marcá-lo como cancelado.
Da mesma forma que uma devolução geraria um lançamento positivo.
Assim a quantidade total do seu estoque seria um SUM() dessa tabela.
Espero ter ajudado.
Grande abs
Luiz Santos
Gostei + 1
Mais Posts
13/02/2017
Mauro Monteiro
with Dm2.ZQ_DETALHE_E do
begin // atualizar Status de cancelado do produto
Close;
SQL.Clear;
SQL.Add('UPDATE detalhe_nota_e');
SQL.Add('SET cancelado = :newStatus');
SQL.Add('where id_nota_e = :idnota and cancelado = :Status');
if not prepared then prepare;
params[0].asstring := 'S';
params[1].asstring := DM2.Z_TB_NOTA_Eid.Text;
params[2].asstring := 'N';
ExecSQL;Porém eu ainda não consigo retirar as quantidade do estoque no cancelamento da nota, deixando claro, que a parte de Insert, Delete e update por trigger individualmente não é o meu problema, a questão é cancelar a nota com vários itens fazer com que suas quantidades sejam retiradas do estoque, estou com dificuldade!!!
Gostei + 0
13/02/2017
Mauro Monteiro
IF (NEW.cancelado = 'S') THEN
aí o resto é com a trigguer direto no banco, muito obrigado!!!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)