/*================*/ /* Versão: 2.21 */ /*==============================================================*/ /* View: REL_ENTRADAS */ /*==============================================================*/ CREATE VIEW REL_ENTRADAS ( ANO, MES, DIA, NRO_DOCTO, COD_PRODUTO, QTD_PROD, VLR_UNIT, VLR_TOTAL, VLR_ICMS, VLR_IPI, RAT_VALOR, RAT_ICMS, CMV_UNIT, CMV_TOTAL) AS SELECT EXTRACT(YEAR from ENT.DT_CHEGADA) AS ANO, EXTRACT(MONTH from ENT.DT_CHEGADA) AS MES, EXTRACT(DAY from ENT.DT_CHEGADA) AS DIA, IET.DOCUMENTO AS NRO_DOCTO, IET.COD_PRODUTO, IET.QTD_PROD, (IET.VLR_TOTAL_ITEM / IET.QTD_PROD) AS VLR_UNIT, IET.VLR_TOTAL_ITEM AS VLR_TOTAL, IET.VLR_ICMS, IET.VLR_IPI, IET.RAT_VALOR, IET.RAT_ICMS, ((IET.VLR_TOTAL_ITEM - IET.VLR_ICMS + IET.VLR_IPI + IET.RAT_VALOR - IET.RAT_ICMS) / IET.QTD_PROD) AS CMV_UNIT, (IET.VLR_TOTAL_ITEM - IET.VLR_ICMS + IET.VLR_IPI + IET.RAT_VALOR - IET.RAT_ICMS) AS CMV_TOTAL FROM ENTRADAS ENT INNER JOIN ITENS_ENTRADA IET ON (ENT.COD_EMPRESA = IET.COD_EMPRESA AND ENT.TIPO_CONTROL = IET.TIPO_CONTROL AND ENT.SEQ_INCLUSAO = IET.SEQ_INCLUSAO AND ENT.DOCUMENTO = IET.DOCUMENTO) WHERE ENT.DT_CHEGADA > '2005-12-31'; COMMIT WORK; /*==============================================================*/ /* View: REL_SAIDAS */ /*==============================================================*/ CREATE VIEW REL_SAIDAS ( ANO, MES, DIA, NRO_FATURA, NRO_ROMANEIO, COD_PRODUTO, QTD_PROD, VLR_UNIT, CMV_UNIT, VLR_TOTAL, CMV_TOTAL) AS SELECT EXTRACT(YEAR from FAT.DT_FATURA) AS ANO, EXTRACT(MONTH from FAT.DT_FATURA) AS MES, EXTRACT(DAY from FAT.DT_FATURA) AS DIA, IFT.NRO_FATURA, IFT.NRO_ROMANEIO, IFT.COD_PRODUTO, IFT.QTD_PROD, IFT.VLR_VENDA AS VLR_UNIT, IFT.VLR_CMV AS CMV_UNIT, (IFT.QTD_PROD * IFT.VLR_VENDA) AS VLR_TOTAL, (IFT.QTD_PROD * IFT.VLR_CMV) AS CMV_TOTAL FROM ACERTO_FATURA FAT INNER JOIN ROMANEIOS_FATURA RFT ON (FAT.COD_EMPRESA = RFT.COD_EMPRESA AND FAT.TIPO_CONTROL = RFT.TIPO_CONTROL AND FAT.NRO_FATURA = RFT.NRO_FATURA) INNER JOIN ITENS_FATURA IFT ON (RFT.COD_EMPRESA = IFT.COD_EMPRESA AND RFT.TIPO_CONTROL = IFT.TIPO_CONTROL AND RFT.NRO_ROMANEIO = IFT.NRO_ROMANEIO AND RFT.NRO_FATURA = IFT.NRO_FATURA) WHERE FAT.DT_FATURA > '2005-12-31'; COMMIT WORK; /*==============================================================*/ /* Table: SALDO_PRODUTOS */ /*==============================================================*/ ALTER TABLE SALDO_PRODUTOS ADD CMV_ANTERIOR NUMERIC(15,5); ALTER TABLE SALDO_PRODUTOS ADD CMV_ATUAL NUMERIC(15,5); COMMIT WORK; ALTER TRIGGER TG_EXCLUIR_MOVTO_ESTOQUE INACTIVE; COMMIT WORK; DELETE FROM MOVTO_ESTOQUE WHERE ANO_REF <= 2004; DELETE FROM SALDO_PISCOFINS WHERE ANO_REF <= 2004; DELETE FROM SALDO_PRODUTOS WHERE ANO_REF <= 2004; COMMIT WORK; ALTER TRIGGER TG_EXCLUIR_MOVTO_ESTOQUE ACTIVE; COMMIT WORK; /*==============================================================*/ /* Trigger: TG_INSERIR_MOVTO_ESTOQUE */ /*==============================================================*/ SET TERM ^; ALTER TRIGGER TG_INSERIR_MOVTO_ESTOQUE ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE varSALDO_ANT NUMERIC(15,3); DECLARE VARIABLE varCUSTO_ANT NUMERIC(15,5); DECLARE VARIABLE varSALDO_ANT_ATUAL NUMERIC(15,3); DECLARE VARIABLE varCUSTO_ANT_ATUAL NUMERIC(15,5); DECLARE VARIABLE varCMV_ANT NUMERIC(15,5); DECLARE VARIABLE varCMV_ATUAL NUMERIC(15,5); DECLARE VARIABLE varCMV_ANT_ATUAL NUMERIC(15,5); DECLARE VARIABLE varMES INTEGER; DECLARE VARIABLE varANO INTEGER; DECLARE VARIABLE varINI INTEGER; DECLARE VARIABLE varTIPO_OPER CHAR(1); DECLARE VARIABLE varQTD_MOV NUMERIC(15,3); DECLARE VARIABLE varVLR_LCTO NUMERIC(15,2); DECLARE VARIABLE varVLR_CMV NUMERIC(15,5); DECLARE VARIABLE varSOMA_E NUMERIC(15,3); DECLARE VARIABLE varSOMA_S NUMERIC(15,3); DECLARE VARIABLE varULT_CUSTO NUMERIC(15,5); DECLARE VARIABLE varULT_CMV NUMERIC(15,5); DECLARE VARIABLE varSALDO_ATUAL NUMERIC(15,3); DECLARE VARIABLE varCUSTO_NOVO NUMERIC(15,5); DECLARE VARIABLE varCMV_NOVO NUMERIC(15,5); DECLARE VARIABLE varANO_REF SMALLINT; DECLARE VARIABLE varMES_REF SMALLINT; DECLARE VARIABLE varDIA_REF SMALLINT; DECLARE VARIABLE varSEQ_DIA SMALLINT; BEGIN /* SELECIONA O SALDO E CUSTO ANTERIOR */ SELECT SALDO_ANTERIOR, CUSTO_ANTERIOR, CMV_ANTERIOR FROM SALDO_PRODUTOS WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = NEW.ANO_REF AND MES_REF = NEW.MES_REF INTO :varSALDO_ANT, :varCUSTO_ANT, :varCMV_ANT; /* SE NÃO EXISTIR, SERÁ GERADO AUTOMATICAMENTE PELA TRIGGER */ IF (varSALDO_ANT IS NULL) THEN BEGIN varSALDO_ANT = 0; varCUSTO_ANT = 0; varCMV_ANT = 0; varMES = 1; WHILE (varMES <= 12) DO BEGIN INSERT INTO SALDO_PRODUTOS (COD_EMPRESA, COD_PRODUTO, ANO_REF, MES_REF, SALDO_ANTERIOR, QTD_ENTRADA, QTD_SAIDA, CUSTO_ANTERIOR, CUSTO_ATUAL, CMV_ANTERIOR, CMV_ATUAL) VALUES (NEW.COD_EMPRESA, NEW.COD_PRODUTO, NEW.ANO_REF, :varMES,0,0,0,0,0,0,0); varMES = varMES + 1; END END /* PERCORRE O MOVIMENTO DO ESTOQUE PARA ACHAR O SALDO ATÉ O ULTIMA LANÇAMENTO */ varSOMA_E = 0; varSOMA_S = 0; FOR SELECT TIPO_OPEREST, QTD_MOV, VLR_CUSTO, VLR_ULTCMV FROM MOVTO_ESTOQUE WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = NEW.ANO_REF AND MES_REF = NEW.MES_REF AND (DIA_REF < NEW.DIA_REF OR (DIA_REF = NEW.DIA_REF AND SEQ_DIA < NEW.SEQ_DIA)) ORDER BY MES_REF, DIA_REF, SEQ_DIA INTO :varTIPO_OPER, :varQTD_MOV, :varULT_CUSTO, :varULT_CMV DO BEGIN IF (varTIPO_OPER = 'E') THEN varSOMA_E = varSOMA_E + varQTD_MOV; IF (varTIPO_OPER = 'S') THEN varSOMA_S = varSOMA_S + varQTD_MOV; END /* APROVEITA O EMBALO E PEGA O CUSTO DO ULTIMA LANCAMENTYO ANTES DO ATUAL */ IF ((varULT_CUSTO IS NULL) OR (varULT_CUSTO = 0)) THEN varULT_CUSTO = varCUSTO_ANT; IF ((varULT_CMV IS NULL) OR (varULT_CMV = 0)) THEN varULT_CMV = varCMV_ANT; varSALDO_ATUAL = (varSOMA_E - varSOMA_S) + varSALDO_ANT; IF (varSALDO_ATUAL IS NULL) THEN varSALDO_ATUAL = varSALDO_ANT; /* CALCULA O NOVO CUSTO SE FOR ENTRADA, NA SAIDA MANTEM */ IF (NEW.TIPO_OPEREST = 'E') THEN BEGIN IF (((varSALDO_ATUAL + NEW.QTD_MOV) = 0) OR (varSALDO_ATUAL < 0)) THEN varCUSTO_NOVO = varULT_CUSTO; ELSE varCUSTO_NOVO = ((varSALDO_ATUAL * varULT_CUSTO) + NEW.VLR_LCTO) / (varSALDO_ATUAL + NEW.QTD_MOV); /* QUAL A DIFERENÇA: varCUSTO_NOVO = (((varSALDO_ATUAL + NEW.QTD_MOV) * varULT_CUSTO) + NEW.VLR_LCTO) / (varSALDO_ATUAL + NEW.QTD_MOV); */ END ELSE varCUSTO_NOVO = varULT_CUSTO; IF (varCUSTO_NOVO < 0) THEN varCUSTO_NOVO = varCUSTO_NOVO * -1; IF ((NEW.VLR_ULTCMV IS NOT NULL) AND (NEW.VLR_ULTCMV > 0)) THEN varCMV_NOVO = NEW.VLR_ULTCMV; ELSE varCMV_NOVO = varULT_CMV; /* ATUALIZA SE FOR ENTRADA OU SAIDA NO SALDO DO PRODUTO ATUAL */ IF (NEW.TIPO_OPEREST = 'E') THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_ENTRADA = (QTD_ENTRADA + NEW.QTD_MOV), CUSTO_ATUAL = :varCUSTO_NOVO, CMV_ATUAL = :varCMV_NOVO WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = NEW.ANO_REF AND MES_REF = NEW.MES_REF; varSALDO_ATUAL = varSALDO_ATUAL + NEW.QTD_MOV; END IF (NEW.TIPO_OPEREST = 'S') THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_SAIDA = (QTD_SAIDA + NEW.QTD_MOV), CUSTO_ATUAL = :varCUSTO_NOVO WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = NEW.ANO_REF AND MES_REF = NEW.MES_REF; varSALDO_ATUAL = varSALDO_ATUAL - NEW.QTD_MOV; END NEW.VLR_CUSTO = varCUSTO_NOVO; NEW.VLR_ULTCMV = varCMV_NOVO; varINI = 0; /* COMEÇA A PERCORRER OS REGISTROS SUPERIORES AO LANÇAMENTO ATUAL ATE O FINAL DO MES, E RECALCULAR OS CULSTOS */ FOR SELECT ANO_REF, MES_REF, DIA_REF, SEQ_DIA, TIPO_OPEREST, QTD_MOV, VLR_LCTO, VLR_ULTCMV FROM MOVTO_ESTOQUE WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND (ANO_REF = NEW.ANO_REF AND MES_REF = NEW.MES_REF AND (DIA_REF > NEW.DIA_REF OR (DIA_REF = NEW.DIA_REF AND SEQ_DIA > NEW.SEQ_DIA))) ORDER BY ANO_REF, MES_REF, DIA_REF, SEQ_DIA INTO :varANO_REF, :varMES_REF, :varDIA_REF, :varSEQ_DIA, :varTIPO_OPER, :varQTD_MOV, :varVLR_LCTO, :varVLR_CMV DO BEGIN /* RECALCULA O NOVO CUSTO PARA O LANÇAMENTO SELECIONADO */ varULT_CUSTO = varCUSTO_NOVO; varULT_CMV = varCMV_NOVO; IF (varTIPO_OPER = 'E') THEN BEGIN IF (((varSALDO_ATUAL + varQTD_MOV) = 0) OR (varSALDO_ATUAL < 0)) THEN varCUSTO_NOVO = varULT_CUSTO; ELSE varCUSTO_NOVO = ((varSALDO_ATUAL * varULT_CUSTO) + varVLR_LCTO) / (varSALDO_ATUAL + varQTD_MOV); varCMV_NOVO = varVLR_CMV; END IF (varTIPO_OPER = 'S') THEN BEGIN varCUSTO_NOVO = varULT_CUSTO; varCMV_NOVO = varULT_CMV; END /* ATUALIZA O CUSTO MEDIO NO LANÇAMENTO DO MOVIMENTO ESTOQUE */ UPDATE MOVTO_ESTOQUE SET VLR_CUSTO = :varCUSTO_NOVO, VLR_ULTCMV = :varCMV_NOVO WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF AND DIA_REF = :varDIA_REF AND SEQ_DIA = :varSEQ_DIA; /* INCREMENTO DA VARIAVEL SALDO ATUAL COM O LANÇAMENTO SELECIONADO */ IF (varTIPO_OPER = 'E') THEN varSALDO_ATUAL = varSALDO_ATUAL + varQTD_MOV; IF (varTIPO_OPER = 'S') THEN varSALDO_ATUAL = varSALDO_ATUAL - varQTD_MOV; varINI = 1; END IF (varINI = 1) THEN BEGIN /* ATUALIZO O CUSTO DO MES DO MOVIMENTO */ UPDATE SALDO_PRODUTOS SET CUSTO_ATUAL = :varCUSTO_NOVO, CMV_ATUAL = :varCMV_NOVO WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = NEW.ANO_REF AND MES_REF = NEW.MES_REF; END /* SELECIONA OS SALDO E CUSTOS ATUAIS PRA SEREM USADOS COMO ANTERIORES NO PROXIMO MES */ SELECT SALDO_FINAL, CUSTO_ATUAL, CMV_ATUAL FROM SALDO_PRODUTOS WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = NEW.ANO_REF AND MES_REF = NEW.MES_REF INTO :varSALDO_ANT_ATUAL, :varCUSTO_ANT_ATUAL, varCMV_ANT_ATUAL; /* ================================================================================= */ /* VAI PERCOREER TODOS OS SALDOS ACIMA DO MES DE LANÇAMNEOT RECELCULANDO O MOVIMENTO */ FOR SELECT ANO_REF, MES_REF FROM SALDO_PRODUTOS WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF >= NEW.ANO_REF AND MES_REF > NEW.MES_REF ORDER BY ANO_REF, MES_REF INTO :varANO_REF, :varMES_REF DO BEGIN /* ATUALIZA O CUSTO E SALDO ANTERIOR DO MES SEGUINTE COMS OS DO ULTIMO MES */ UPDATE SALDO_PRODUTOS SET CUSTO_ANTERIOR = :varCUSTO_ANT_ATUAL, SALDO_ANTERIOR = :varSALDO_ANT_ATUAL, CMV_ANTERIOR = :varCMV_ANT_ATUAL WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF; varSALDO_ATUAL = varSALDO_ANT_ATUAL; varCUSTO_NOVO = varCUSTO_ANT_ATUAL; varULT_CUSTO = varCUSTO_ANT_ATUAL; varULT_CMV = varCMV_ANT_ATUAL; varCMV_NOVO = varCMV_ANT_ATUAL; /* SELECIONA O MOVIMENTO PARA O MES A ANO DO SALDO SELECIOANDO */ FOR SELECT DIA_REF, SEQ_DIA, TIPO_OPEREST, QTD_MOV, VLR_LCTO, VLR_ULTCMV FROM MOVTO_ESTOQUE WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF ORDER BY ANO_REF, MES_REF, DIA_REF, SEQ_DIA INTO :varDIA_REF, :varSEQ_DIA, :varTIPO_OPER, :varQTD_MOV, :varVLR_LCTO, :varVLR_CMV DO BEGIN /* RECALCULA O NOVO CUSTO PARA O LANÇAMENTO SELECIONADO */ IF (varTIPO_OPER = 'E') THEN BEGIN IF (((varSALDO_ATUAL + varQTD_MOV) = 0) OR (varSALDO_ATUAL < 0)) THEN varCUSTO_NOVO = varULT_CUSTO; ELSE varCUSTO_NOVO = ((varSALDO_ATUAL * varULT_CUSTO) + varVLR_LCTO) / (varSALDO_ATUAL + varQTD_MOV); varCMV_NOVO = varVLR_CMV; END IF (varTIPO_OPER = 'S') THEN BEGIN varCUSTO_NOVO = varULT_CUSTO; varCMV_NOVO = varULT_CMV; END varULT_CUSTO = varCUSTO_NOVO; varULT_CMV = varCMV_NOVO; /* ATUALIZA O CUSTO MEDIO NO LANÇAMENTO DO MOVIMENTO ESTOQUE */ UPDATE MOVTO_ESTOQUE SET VLR_CUSTO = :varCUSTO_NOVO, VLR_ULTCMV = :varCMV_NOVO WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF AND DIA_REF = :varDIA_REF AND SEQ_DIA = :varSEQ_DIA; /* INCREMENTO DA VARIAVEL SALDO ATUAL COM O LANÇAMENTO SELECIONADO */ IF (varTIPO_OPER = 'E') THEN varSALDO_ATUAL = varSALDO_ATUAL + varQTD_MOV; IF (varTIPO_OPER = 'S') THEN varSALDO_ATUAL = varSALDO_ATUAL - varQTD_MOV; END UPDATE SALDO_PRODUTOS SET CUSTO_ATUAL = :varCUSTO_NOVO, CMV_ATUAL = :varCMV_NOVO WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF; /* SELECIONA OS SALDO E CUSTOS ATUAIS PRA SEREM USADOS COMO ANTERIORES NO PROXIMO MES */ SELECT SALDO_FINAL, CUSTO_ATUAL, CMV_ATUAL FROM SALDO_PRODUTOS WHERE COD_EMPRESA = NEW.COD_EMPRESA AND COD_PRODUTO = NEW.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF INTO :varSALDO_ANT_ATUAL, :varCUSTO_ANT_ATUAL, :varCMV_ANT_ATUAL; END END^ SET TERM ;^ COMMIT WORK; /*==============================================================*/ /* Trigger: TG_EXCLUIR_MOVTO_ESTOQUE */ /*==============================================================*/ SET TERM ^; ALTER TRIGGER TG_EXCLUIR_MOVTO_ESTOQUE ACTIVE BEFORE DELETE POSITION 0 AS DECLARE VARIABLE varSALDO_ANT NUMERIC(15,3); DECLARE VARIABLE varCUSTO_ANT NUMERIC(15,5); DECLARE VARIABLE varSALDO_ANT_ATUAL NUMERIC(15,3); DECLARE VARIABLE varCUSTO_ANT_ATUAL NUMERIC(15,5); DECLARE VARIABLE varCMV_ANT NUMERIC(15,5); DECLARE VARIABLE varCMV_ANT_ATUAL NUMERIC(15,5); DECLARE VARIABLE varMES INTEGER; DECLARE VARIABLE varANO INTEGER; DECLARE VARIABLE varINI INTEGER; DECLARE VARIABLE varTIPO_OPER CHAR(1); DECLARE VARIABLE varQTD_MOV NUMERIC(15,3); DECLARE VARIABLE varVLR_LCTO NUMERIC(15,2); DECLARE VARIABLE varVLR_CMV NUMERIC(15,5); DECLARE VARIABLE varSOMA_E NUMERIC(15,3); DECLARE VARIABLE varSOMA_S NUMERIC(15,3); DECLARE VARIABLE varULT_CUSTO NUMERIC(15,5); DECLARE VARIABLE varULT_CMV NUMERIC(15,5); DECLARE VARIABLE varSALDO_ATUAL NUMERIC(15,3); DECLARE VARIABLE varCUSTO_NOVO NUMERIC(15,5); DECLARE VARIABLE varCMV_NOVO NUMERIC(15,5); DECLARE VARIABLE varANO_REF SMALLINT; DECLARE VARIABLE varMES_REF SMALLINT; DECLARE VARIABLE varDIA_REF SMALLINT; DECLARE VARIABLE varSEQ_DIA SMALLINT; BEGIN /* SELECIONO O SALDO E CUSTO ANTERIOR DO MES DO MOVIMENTO */ SELECT SALDO_ANTERIOR, CUSTO_ANTERIOR, CMV_ANTERIOR FROM SALDO_PRODUTOS WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = OLD.ANO_REF AND MES_REF = OLD.MES_REF INTO :varSALDO_ANT, :varCUSTO_ANT, :varCMV_ANT; varSOMA_E = 0; varSOMA_S = 0; /* ACHO O SALDO ATUAL ATÉ O DIA DA EXCLUSÃO DO LANÇAMENTO */ FOR SELECT TIPO_OPEREST, QTD_MOV, VLR_CUSTO, VLR_ULTCMV FROM MOVTO_ESTOQUE WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = OLD.ANO_REF AND MES_REF = OLD.MES_REF AND (DIA_REF < OLD.DIA_REF OR (DIA_REF = OLD.DIA_REF AND SEQ_DIA < OLD.SEQ_DIA)) ORDER BY MES_REF, DIA_REF, SEQ_DIA INTO :varTIPO_OPER, :varQTD_MOV, :varULT_CUSTO, :varULT_CMV DO BEGIN IF (varTIPO_OPER = 'E') THEN varSOMA_E = varSOMA_E + varQTD_MOV; IF (varTIPO_OPER = 'S') THEN varSOMA_S = varSOMA_S + varQTD_MOV; END IF (varULT_CUSTO IS NULL) THEN varULT_CUSTO = varCUSTO_ANT; varSALDO_ATUAL = (varSOMA_E - varSOMA_S) + varSALDO_ANT; IF (varSALDO_ATUAL IS NULL) THEN varSALDO_ATUAL = varSALDO_ANT; IF ((varULT_CMV IS NULL) OR (varULT_CMV = 0)) THEN varULT_CMV = varCMV_ANT; varCUSTO_NOVO = varULT_CUSTO; varCMV_NOVO = varULT_CMV; /* ATUALIZO AS QUNT. DE ENTRADA E SAIDA TIRANDO O VALOR EXCLUIDO */ IF (OLD.TIPO_OPEREST = 'E') THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_ENTRADA = (QTD_ENTRADA - OLD.QTD_MOV), CUSTO_ATUAL = :varCUSTO_NOVO, CMV_ATUAL = :varCMV_NOVO WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = OLD.ANO_REF AND MES_REF = OLD.MES_REF; END IF (OLD.TIPO_OPEREST = 'S') THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_SAIDA = (QTD_SAIDA - OLD.QTD_MOV) WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = OLD.ANO_REF AND MES_REF = OLD.MES_REF; END varINI = 0; /* COMEÇA A PERCORRER OS REGISTROS SUPERIORES AO LANÇAMENTO ATUAL ATE O FINAL DO MES, E RECALCULAR OS CULSTOS */ FOR SELECT ANO_REF, MES_REF, DIA_REF, SEQ_DIA, TIPO_OPEREST, QTD_MOV, VLR_LCTO, VLR_ULTCMV FROM MOVTO_ESTOQUE WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND (ANO_REF = OLD.ANO_REF AND MES_REF = OLD.MES_REF AND (DIA_REF > OLD.DIA_REF OR (DIA_REF = OLD.DIA_REF AND SEQ_DIA > OLD.SEQ_DIA))) ORDER BY ANO_REF, MES_REF, DIA_REF, SEQ_DIA INTO :varANO_REF, :varMES_REF, :varDIA_REF, :varSEQ_DIA, :varTIPO_OPER, :varQTD_MOV, :varVLR_LCTO, :varVLR_CMV DO BEGIN /* RECALCULA O NOVO CUSTO PARA O LANÇAMENTO SELECIONADO */ IF (varTIPO_OPER = 'E') THEN BEGIN IF (((varSALDO_ATUAL + varQTD_MOV) = 0) OR (varSALDO_ATUAL < 0)) THEN varCUSTO_NOVO = varULT_CUSTO; ELSE varCUSTO_NOVO = ((varSALDO_ATUAL * varULT_CUSTO) + varVLR_LCTO) / (varSALDO_ATUAL + varQTD_MOV); varCMV_NOVO = varVLR_CMV; END IF (varTIPO_OPER = 'S') THEN BEGIN varCUSTO_NOVO = varULT_CUSTO; varCMV_NOVO = varULT_CMV; END varULT_CUSTO = varCUSTO_NOVO; varULT_CMV = varCMV_NOVO; /* ATUALIZA O CUSTO MEDIO NO LANÇAMENTO DO MOVIMENTO ESTOQUE */ UPDATE MOVTO_ESTOQUE SET VLR_CUSTO = :varCUSTO_NOVO, VLR_ULTCMV = :varCMV_NOVO WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF AND DIA_REF = :varDIA_REF AND SEQ_DIA = :varSEQ_DIA; /* INCREMENTO DA VARIAVEL SALDO ATUAL COM O LANÇAMENTO SELECIONADO */ IF (varTIPO_OPER = 'E') THEN varSALDO_ATUAL = varSALDO_ATUAL + varQTD_MOV; IF (varTIPO_OPER = 'S') THEN varSALDO_ATUAL = varSALDO_ATUAL - varQTD_MOV; varINI = 1; END IF (varINI = 1) THEN BEGIN /* ATUALIZO O CUSTO DO MES DO MOVIMENTO */ UPDATE SALDO_PRODUTOS SET CUSTO_ATUAL = :varCUSTO_NOVO, CMV_ATUAL = :varCMV_NOVO WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = OLD.ANO_REF AND MES_REF = OLD.MES_REF; END /* SELECIONA OS SALDO E CUSTOS ATUAIS PRA SEREM USADOS COMO ANTERIORES NO PROXIMO MES */ SELECT SALDO_FINAL, CUSTO_ATUAL, CMV_ATUAL FROM SALDO_PRODUTOS WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = OLD.ANO_REF AND MES_REF = OLD.MES_REF INTO :varSALDO_ANT_ATUAL, :varCUSTO_ANT_ATUAL, :varCMV_ANT_ATUAL; /* ================================================================================= */ /* VAI PERCOREER TODOS OS SALDOS ACIMA DO MES DE LANÇAMNEOT RECELCULANDO O MOVIMENTO */ FOR SELECT ANO_REF, MES_REF FROM SALDO_PRODUTOS WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF >= OLD.ANO_REF AND MES_REF > OLD.MES_REF ORDER BY ANO_REF, MES_REF INTO :varANO_REF, :varMES_REF DO BEGIN /* ATUALIZA O CUSTO E SALDO ANTERIOR DO MES SEGUINTE COMS OS DO ULTIMO MES */ UPDATE SALDO_PRODUTOS SET CUSTO_ANTERIOR = :varCUSTO_ANT_ATUAL, SALDO_ANTERIOR = :varSALDO_ANT_ATUAL, CMV_ANTERIOR = :varCMV_ANT_ATUAL WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF; varSALDO_ATUAL = varSALDO_ANT_ATUAL; varCUSTO_NOVO = varCUSTO_ANT_ATUAL; varULT_CUSTO = varCUSTO_ANT_ATUAL; varCMV_NOVO = varCMV_ANT_ATUAL; varULT_CMV = varCMV_ANT_ATUAL; /* SELECIONA O MOVIMENTO PARA O MES A ANO DO SALDO SELECIOANDO */ FOR SELECT DIA_REF, SEQ_DIA, TIPO_OPEREST, QTD_MOV, VLR_LCTO, VLR_ULTCMV FROM MOVTO_ESTOQUE WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF ORDER BY ANO_REF, MES_REF, DIA_REF, SEQ_DIA INTO :varDIA_REF, :varSEQ_DIA, :varTIPO_OPER, :varQTD_MOV, :varVLR_LCTO, :varVLR_CMV DO BEGIN /* RECALCULA O NOVO CUSTO PARA O LANÇAMENTO SELECIONADO */ IF (varTIPO_OPER = 'E') THEN BEGIN IF (((varSALDO_ATUAL + varQTD_MOV) = 0) OR (varSALDO_ATUAL < 0)) THEN varCUSTO_NOVO = varULT_CUSTO; ELSE varCUSTO_NOVO = ((varSALDO_ATUAL * varULT_CUSTO) + varVLR_LCTO) / (varSALDO_ATUAL + varQTD_MOV); varCMV_NOVO = varVLR_CMV; END IF (varTIPO_OPER = 'S') THEN BEGIN varCUSTO_NOVO = varULT_CUSTO; varCMV_NOVO = varULT_CMV; END varULT_CUSTO = varCUSTO_NOVO; varULT_CMV = varCMV_NOVO; /* ATUALIZA O CUSTO MEDIO NO LANÇAMENTO DO MOVIMENTO ESTOQUE */ UPDATE MOVTO_ESTOQUE SET VLR_CUSTO = :varCUSTO_NOVO, VLR_ULTCMV = :varCMV_NOVO WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF AND DIA_REF = :varDIA_REF AND SEQ_DIA = :varSEQ_DIA; /* INCREMENTO DA VARIAVEL SALDO ATUAL COM O LANÇAMENTO SELECIONADO */ IF (varTIPO_OPER = 'E') THEN varSALDO_ATUAL = varSALDO_ATUAL + varQTD_MOV; IF (varTIPO_OPER = 'S') THEN varSALDO_ATUAL = varSALDO_ATUAL - varQTD_MOV; END UPDATE SALDO_PRODUTOS SET CUSTO_ATUAL = :varCUSTO_NOVO, CMV_ATUAL = :varCMV_NOVO WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF; /* SELECIONA OS SALDO E CUSTOS ATUAIS PRA SEREM USADOS COMO ANTERIORES NO PROXIMO MES */ SELECT SALDO_FINAL, CUSTO_ATUAL, CMV_ATUAL FROM SALDO_PRODUTOS WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF = :varMES_REF INTO :varSALDO_ANT_ATUAL, :varCUSTO_ANT_ATUAL, :varCMV_ANT_ATUAL; END END^ SET TERM ;^ COMMIT WORK; /*==============================================================*/ /* Table: SALDO_PRODUTOS */ /*==============================================================*/ UPDATE SALDO_PRODUTOS SET CMV_ATUAL = ULT_CUSTO; COMMIT WORK; alter table SALDO_PRODUTOS drop "CUSTO_AD_ANTERIOR"; alter table SALDO_PRODUTOS drop "CUSTO_AD_ATUAL"; alter table SALDO_PRODUTOS drop "ULT_CUSTO"; COMMIT WORK; /*================*/ /* Versão: 2.21 */ /*==============================================================*/ /* Table: ROMANEIOS */ /*==============================================================*/ ALTER TABLE ROMANEIOS ADD IMPRESSO CHAR(1); COMMIT WORK; UPDATE ROMANEIOS SET IMPRESSO = 'S'; COMMIT WORK; /*==============================================================*/ /* Table: ITENS_ENTRADA */ /*==============================================================*/ ALTER TABLE ITENS_ENTRADA ADD VLR_DESPESAS NUMERIC(15,2); COMMIT WORK;