TRIGGERS MYSQL - Atualizar as quantidades no estoque
Boa Tarde,
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
Delete
insert
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
Curtidas 0
Melhor post
Luiz Santos
09/02/2017
Mauro.
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
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
GOSTEI 1
Mais Respostas
Mauro Monteiro
09/02/2017
Luiz, sobre o campo "cancelado" já implementei após a sua dica, achei interessante:
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!!!
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
Mauro Monteiro
09/02/2017
Consegui, muito obrigado, com base na sua dica, eu primeiro efetuei um update alterando status de cancelado para S de cada Item da Entrada, depois eu acrescentei um IF na trigguer after update:
aí o resto é com a trigguer direto no banco, muito obrigado!!!
IF (NEW.cancelado = 'S') THEN
aí o resto é com a trigguer direto no banco, muito obrigado!!!
GOSTEI 0