Trigger Controle de Estoque

03/01/2017

0

Como que faço para soma a quantidade de um produto quando lança o mesmo produto no banco de dados?
estou usando o firebird..
Rg Ltda

Rg Ltda

Responder

Posts

05/01/2017

Ermesom Lourenco

Não possuo tanto conhecimento em Firebird (trabalho com Oracle), mas como faria o que propõe:

1. Construiria uma tabela para armazenar os estoques, separados por empresa. Nesta tabela teria uma coluna de estoque original e estoque disponível, além de endereço de estoque, local de estoque e lote.
2. Construiria uma tabela de estoque no qual armazenaria um registro de produto por cada empresa, no qual teria a quantidade total de produtos em uma determinada empresa, além de outros detalhes pertinentes aos requisitos.
3. Construiria uma trigger para todas as vezes que fizesse insert, delete ou update na tabela quer armazena os estoques (item 1), eu refletiria isso na tabela de estoque de produtos (item 2). Por não possuir conhecimento técnico em triggers no Firebird, deixo este artigo da dev media para que possa consultar como criar uma trigger. Já adianto que terá de usar Universal Triggers, te aconselho a procurar na própria documentação do Firebird.

Ficaria mais ou menos assim:

  SET TERM !;
  CREATE TRIGGER ESTOQUES_DETALHES_IUD_BR
  FOR ESTOQUES_DETALHES -- Item 1 na resposta
  ACTIVE
  BEFORE INSERT
  POSITION 0
  AS
  BEGIN
	UPDATE ESTOQUES SET ESTOQUE_DISPONIVEL = ESTOQUE_DISPONIVEL + NEW.ESTOQUE_DISPONIVEL WHERE PRODUTO_ID = NEW.PRODUTO_ID AND EMPRESA_ID = OLD.PRODUTO_ID;
  END;
  
  SET TERM !;
  CREATE TRIGGER ESTOQUES_DETALHES_IUD_BR
  FOR ESTOQUES_DETALHES -- Item 1 na resposta
  ACTIVE
  BEFORE UPDATE
  POSITION 0
  AS
  BEGIN
    IF (NEW.ESTOQUE_DISPONIVEL) > (OLD.ESTOQUE_DISPONIVEL) THEN BEGIN
      UPDATE ESTOQUES SET ESTOQUE_DISPONIVEL = ESTOQUE_DISPONIVEL + (NEW.ESTOQUE_DISPONIVEL - OLD.ESTOQUE_DISPONIVEL) WHERE PRODUTO_ID = NEW.PRODUTO_ID AND EMPRESA_ID = NEW.EMPRESA_ID;
	ELSE IF (NEW.ESTOQUE_DISPONIVEL) < (OLD.ESTOQUE_DISPONIVEL) THEN BEGIN
      UPDATE ESTOQUES SET ESTOQUE_DISPONIVEL = ESTOQUE_DISPONIVEL - (OLD.ESTOQUE_DISPONIVEL - NEW.ESTOQUE_DISPONIVEL) WHERE PRODUTO_ID = NEW.PRODUTO_ID AND EMPRESA_ID = NEW.EMPRESA_ID;
	END;
  END;
  
  SET TERM !;
  CREATE TRIGGER ESTOQUES_DETALHES_IUD_BR
  FOR ESTOQUES_DETALHES -- Item 1 na resposta
  ACTIVE
  BEFORE DELETE
  POSITION 0
  AS
  BEGIN
	UPDATE ESTOQUES SET ESTOQUE_DISPONIVEL = ESTOQUE_DISPONIVEL - OLD.ESTOQUE_DISPONIVEL WHERE PRODUTO_ID = OLD.PRODUTO_ID AND EMPRESA_ID = OLD.EMPRESA_ID;
  END;


Considerações a serem feitas:
1. Dividi as triggers em 3 para facilitar a lógica, porém poderá ser feita usando apenas uma (Universal Trigger).
2. Terá de criar toda uma estrutura de validação não especificada aqui, utilizando checagens e outras triggers para validação.

No mais, espero ter ajudado de alguma forma.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar