Pular para o conteúdo
Visualizando 1 post (de 1 do total)
  • Autor
    Posts
  • #101506
    antoniox
    Participante

      Olá, Td bem?
      Tenho a seguinte dúvida e gostaria de alguma solução, pois estou travado na parte do INVENTÁRIO tenho as seguintes tabelas triggers e até uma lógica mas não consigo implementar.
      Alguem se dispõe em me ajudar?

      Tenho as seguintes tabelas:

      CREATE TABLE Motivo(
      id_motivo INT NOT NULL ,
      descricao VARCHAR(40) NOT NULL,
      tipo_motivo CHAR(1),
      PRIMARY KEY (id_motivo));

      CREATE TABLE Movimento(
      id_movimento INT NOT NULL,
      data_movimento DATE NOT NULL,
      nota DECIMAL(9,2),
      valor DECIMAL(9,2) NULL,
      fornecedor INT,
      cliente INT,
      desconto DECIMAL(9,2),
      situacao CHAR(1),
      tipo CHAR(1),
      endereco_estoque INT,
      outrosvalores DECIMAL(9,2),
      PRIMARY KEY (id_movimento),
      FOREIGN KEY (fornecedor )
      REFERENCES Fornecedor (id_fornecedor ),
      FOREIGN KEY (motivo)
      REFERENCES Motivo (id_motivo),
      motivo INT NULL,
      FOREIGN KEY (cliente )
      REFERENCES Cliente (id_cliente ),
      FOREIGN KEY (endereco_estoque )
      REFERENCES Endereco_estoque (id_endereco_estoque ));

      CREATE TABLE ItemMovimento (
      id_itemmovimento INT NOT NULL ,
      endereco_estoque INT,
      movimento INT NOT NULL ,
      produto INT NOT NULL,
      qtde INT NOT NULL,
      preco INT NOT NULL,
      grupo INT NOT NULL,
      PRIMARY KEY (id_itemmovimento),
      FOREIGN KEY (produto)
      REFERENCES Produto (id_produto),
      FOREIGN KEY(movimento)
      REFERENCES Movimento (id_movimento));

      CREATE TABLE Saldo(
      id_saldo INT NOT NULL,
      produto INT,
      ano INT,
      mes INT,
      estoque INT,
      endereco_estoque INT ,
      PRIMARY KEY (id_saldo),
      FOREIGN KEY (produto )
      REFERENCES Produto (id_produto ),
      FOREIGN KEY (endereco_estoque )
      REFERENCES Endereco_estoque (id_endereco_estoque ));

      CREATE TABLE Inventario (
      id_inventario INT NOT NULL ,
      data DATE NULL ,
      obs VARCHAR(50),
      produto INT ,
      PRIMARY KEY (id_inventario) ,
      FOREIGN KEY (produto )
      REFERENCES Produto (id_produto ));

      A minha trigger atualiza saldo:
      CREATE OR REPLACE TRIGGER ALTERA_ESTOQUE
      AFTER INSERT OR UPDATE OR DELETE ON ITEMMOVIMENTO FOR EACH ROW
      DECLARE
      CURSOR C_TIPO_MOVIMENTO(P_ID_MOVIMENTO INTEGER) IS
      SELECT TIPO_MOTIVO
      FROM MOVIMENTO M,
      MOTIVO MT
      WHERE M.MOTIVO = MT.ID_MOTIVO
      AND M.ID_MOVIMENTO = P_ID_MOVIMENTO;

      V_TIPO_MOVIMENTO C_TIPO_MOVIMENTO%ROWTYPE;
      BEGIN
      IF (DELETING) THEN
      OPEN C_TIPO_MOVIMENTO(:OLD.MOVIMENTO);
      FETCH C_TIPO_MOVIMENTO INTO V_TIPO_MOVIMENTO;
      CLOSE C_TIPO_MOVIMENTO;
      ELSE
      OPEN C_TIPO_MOVIMENTO(:NEW.MOVIMENTO);
      FETCH C_TIPO_MOVIMENTO INTO V_TIPO_MOVIMENTO;
      CLOSE C_TIPO_MOVIMENTO;
      END IF;

      IF (INSERTING) THEN
      IF UPPER(V_TIPO_MOVIMENTO.TIPO_MOTIVO) = ‘S’ THEN
      UPDATE SALDO
      SET ESTOQUE = NVL(ESTOQUE, 0) – :NEW.QTDE
      WHERE PRODUTO = :NEW.PRODUTO;
      ELSE
      UPDATE SALDO
      SET ESTOQUE = NVL(ESTOQUE, 0) + :NEW.QTDE
      WHERE PRODUTO = :NEW.PRODUTO;
      END IF;
      ELSIF (DELETING) THEN
      IF UPPER(V_TIPO_MOVIMENTO.TIPO_MOTIVO) = ‘S’ THEN
      UPDATE SALDO
      SET ESTOQUE = NVL(ESTOQUE, 0) + :OLD.QTDE
      WHERE PRODUTO = :OLD.PRODUTO;
      ELSE
      UPDATE SALDO
      SET ESTOQUE = NVL(ESTOQUE, 0) – :OLD.QTDE
      WHERE PRODUTO = :OLD.PRODUTO;
      END IF;
      ELSE
      IF UPPER(V_TIPO_MOVIMENTO.TIPO_MOTIVO) = ‘S’ THEN
      UPDATE SALDO
      SET ESTOQUE = NVL(ESTOQUE, 0) + :OLD.QTDE
      WHERE PRODUTO = :NEW.PRODUTO;

      UPDATE SALDO
      SET ESTOQUE = NVL(ESTOQUE, 0) – :NEW.QTDE
      WHERE PRODUTO = :NEW.PRODUTO;
      ELSE
      UPDATE SALDO
      SET ESTOQUE = NVL(ESTOQUE, 0) – :OLD.QTDE
      WHERE PRODUTO = :NEW.PRODUTO;

      UPDATE SALDO
      SET ESTOQUE = NVL(ESTOQUE, 0) + :NEW.QTDE
      WHERE PRODUTO = :NEW.PRODUTO;
      END IF;
      END IF;
      END;

      A lógica da trigger inventário:
      Segue a lógica que falamos sobre o estoque (as linhas em vermelho é a lógica de buscar o saldo do mês anterior para compor o saldo inicial do mes que está sendo criado a partir da movimentação):

      – Para cada movimentação de produto:
      – Buscar o saldo referente ao produto da movimentação e ano/mes igual a data da movimentação
      – Se não existir o saldo então
      – Cria o registro na tabela de saldo
      [color=red]- Busca o saldo referente ao mes/ano anterior ao mes/ano da movimentação
      – Se exitir o saldo refente ao mes/ano anterior entao
      – T_SALDO = T_SALDO_INICIAL + ENTRADAS – SAIDAS
      – Senao
      – T_SALDO = 0
      – Saldo inicial do mes/ano igual a data de movimentação = T_SALDO[/color]
      – Se a movimentação for de entrada entao
      – SALDOS.ENTRADAS = SALDOS.ENTRADAS + MOVIMENTACAO.QUANTIDADE
      – Senao
      – SALDOS.SAIDAS = SALDOS.SAIDAS + MOVIMENTACAO.QUANTIDADE.
      – Senao
      – Se a movimentação for de entrada entao
      – SALDOS.ENTRADAS = SALDOS.ENTRADAS + MOVIMENTACAO.QUANTIDADE
      – Senao
      – SALDOS.SAIDAS = SALDOS.SAIDAS + MOVIMENTACAO.QUANTIDADE.
      FimPara

    Visualizando 1 post (de 1 do total)
    • Você deve fazer login para responder a este tópico.