- Este tópico contém 0 resposta, 1 voz e foi atualizado pela última vez 14 anos, 4 meses atrás por
antoniox.
-
AutorPosts
-
7 de novembro de 2011 às 2:54 pm #101506
antoniox
ParticipanteOlá, 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 -
AutorPosts
- Você deve fazer login para responder a este tópico.