TRIGGERS MYSQL - Atualizar as quantidades no estoque

MySQL

Delphi

Banco de Dados

09/02/2017

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

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

Mauro Monteiro

Curtidas 0

Melhor post

Luiz Santos

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
GOSTEI 1

Mais Respostas

Mauro Monteiro

Mauro Monteiro

09/02/2017

Luiz, sobre o campo "cancelado" já implementei após a sua dica, achei interessante:

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

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:

IF (NEW.cancelado = 'S') THEN


aí o resto é com a trigguer direto no banco, muito obrigado!!!
GOSTEI 0
POSTAR