/*================*/ /* Versão: 2.5.07 */ /*==============================================================*/ /* Table: NOTAFISCAL */ /*==============================================================*/ ALTER TABLE NOTAFISCAL ADD SERIE_NF SMALLINT NOT NULL; ALTER TABLE NOTAFISCAL ADD TIPO_NF CHAR(3); ALTER TABLE NOTAFISCAL ADD CHAVE_NFE VARCHAR(50); ALTER TABLE NOTAFISCAL ADD PROTOCOLO_NFE VARCHAR(20); ALTER TABLE NOTAFISCAL ADD RECIBO_NFE VARCHAR(20); COMMIT WORK; ALTER TRIGGER TG_UPDATE_NOTAFISCAL INACTIVE; COMMIT WORK; UPDATE NOTAFISCAL SET SERIE_NF = 0 WHERE SERIE_NF IS NULL; UPDATE NOTAFISCAL SET TIPO_NF = 'NFN' WHERE TIPO_NF IS NULL; COMMIT WORK; ALTER TRIGGER TG_UPDATE_NOTAFISCAL ACTIVE; COMMIT WORK; /*==============================================================*/ /* Table: ITENS_NF */ /*==============================================================*/ ALTER TABLE ITENS_NF ADD SERIE_NF SMALLINT NOT NULL; COMMIT WORK; UPDATE ITENS_NF SET SERIE_NF = 0 WHERE SERIE_NF IS NULL; COMMIT WORK; ALTER TABLE ITENS_NF DROP CONSTRAINT FK_ITENS_NF_NOTAFISCAL; ALTER TABLE ITENS_NF DROP CONSTRAINT PK_ITENS_NF; COMMIT WORK; alter table ITENS_NF add constraint PK_ITENS_NF primary key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF,SEQUENCIA); COMMIT WORK; /*==============================================================*/ /* Table: PARCELAS */ /*==============================================================*/ ALTER TABLE PARCELAS ADD SERIE_NF SMALLINT NOT NULL; COMMIT WORK; UPDATE PARCELAS SET SERIE_NF = 0 WHERE SERIE_NF IS NULL; COMMIT WORK; ALTER TABLE PARCELAS DROP CONSTRAINT FK_PARCELAS_NOTA_FISCAL; ALTER TABLE PARCELAS DROP CONSTRAINT FK_PARCELAS_NOTAFISCAL; ALTER TABLE PARCELAS DROP CONSTRAINT PK_PARCELAS; COMMIT WORK; alter table PARCELAS add constraint PK_PARCELAS primary key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF,SEQ_PARCELAS); COMMIT WORK; /*==============================================================*/ /* Table: SERVICOS_NF */ /*==============================================================*/ ALTER TABLE SERVICOS_NF ADD SERIE_NF SMALLINT NOT NULL; COMMIT WORK; UPDATE SERVICOS_NF SET SERIE_NF = 0 WHERE SERIE_NF IS NULL; COMMIT WORK; ALTER TABLE SERVICOS_NF DROP CONSTRAINT FK_SERVICOS_NF_NOTA_FISCAL; ALTER TABLE SERVICOS_NF DROP CONSTRAINT FK_SERVICOS_NF_NOTAFISCAL; ALTER TABLE SERVICOS_NF DROP CONSTRAINT PK_SERVICOS_NF; COMMIT WORK; alter table SERVICOS_NF add constraint PK_SERVICOS_NF primary key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF,SEQ_ITEN); COMMIT WORK; /*==============================================================*/ /* Table: ALIQ_ICMSNF */ /*==============================================================*/ ALTER TABLE ALIQ_ICMSNF ADD SERIE_NF SMALLINT NOT NULL; COMMIT WORK; UPDATE ALIQ_ICMSNF SET SERIE_NF = 0 WHERE SERIE_NF IS NULL; COMMIT WORK; ALTER TABLE ALIQ_ICMSNF DROP CONSTRAINT FK_ALIQ_ICMSNF_NOTA_FISCAL; ALTER TABLE ALIQ_ICMSNF DROP CONSTRAINT FK_ALIQ_ICMSNF_NOTAFISCAL; ALTER TABLE ALIQ_ICMSNF DROP CONSTRAINT PK_ALIQ_ICMSNF; COMMIT WORK; alter table ALIQ_ICMSNF add constraint PK_ALIQ_ICMSNF primary key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF,TIPO_VLR); COMMIT WORK; /*==============================================================*/ /* Table: DESCAUX_NF */ /*==============================================================*/ ALTER TABLE DESCAUX_NF ADD SERIE_NF SMALLINT NOT NULL; COMMIT WORK; update RDB$RELATION_FIELDS set RDB$NULL_FLAG = NULL where (RDB$FIELD_NAME = 'COD_DESCR') and (RDB$RELATION_NAME = 'DESCAUX_NF'); COMMIT WORK; UPDATE DESCAUX_NF SET SERIE_NF = 0 WHERE SERIE_NF IS NULL; COMMIT WORK; ALTER TABLE DESCAUX_NF DROP CONSTRAINT FK_DESCAUX_NF_NOTA_FISCAL; ALTER TABLE DESCAUX_NF DROP CONSTRAINT FK_DESCAUX_NF_NOTAFISCAL; ALTER TABLE DESCAUX_NF DROP CONSTRAINT PK_DESCAUX_NF; COMMIT WORK; alter table DESCAUX_NF add constraint PK_DESCAUX_NF primary key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF,SEQUENCIA); COMMIT WORK; /*==============================================================*/ /* Table: DESCCORPO_NF */ /*==============================================================*/ ALTER TABLE DESCCORPO_NF ADD SERIE_NF SMALLINT NOT NULL; COMMIT WORK; UPDATE DESCCORPO_NF SET SERIE_NF = 0 WHERE SERIE_NF IS NULL; COMMIT WORK; ALTER TABLE DESCCORPO_NF DROP CONSTRAINT FK_DESCCORPO_NF_NOTA_FISCAL; ALTER TABLE DESCCORPO_NF DROP CONSTRAINT FK_DESCCORPO_NF_NOTAFISCAL; ALTER TABLE DESCCORPO_NF DROP CONSTRAINT PK_DESCCORPO_NF; COMMIT WORK; alter table DESCCORPO_NF add constraint PK_DESCCORPO_NF primary key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF,SEQUENCIA); COMMIT WORK; /*==============================================================*/ /* Table: NOTA_FISCAL E FOREING KEYS */ /*==============================================================*/ ALTER TABLE NOTAFISCAL DROP CONSTRAINT PK_NOTAFISCAL; COMMIT WORK; alter table NOTAFISCAL add constraint PK_NOTA_FISCAL primary key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF); COMMIT WORK; alter table ITENS_NF add constraint FK_ITENS_NF_NOTA_FISCAL foreign key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF) references NOTAFISCAL(COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF); COMMIT WORK; alter table PARCELAS add constraint FK_PARCELAS_NF_NOTA_FISCAL foreign key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF) references NOTAFISCAL(COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF); COMMIT WORK; alter table SERVICOS_NF add constraint FK_SERVICOS_NF_NOTA_FISCAL foreign key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF) references NOTAFISCAL(COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF); COMMIT WORK; alter table ALIQ_ICMSNF add constraint FK_ALIQ_ICMSNF_NOTA_FISCAL foreign key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF) references NOTAFISCAL(COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF); COMMIT WORK; alter table DESCAUX_NF add constraint FK_DESCAUX_NF_NOTA_FISCAL foreign key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF) references NOTAFISCAL(COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF); COMMIT WORK; alter table DESCCORPO_NF add constraint FK_DESCCORPO_NF_NOTA_FISCAL foreign key (COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF) references NOTAFISCAL(COD_EMPRESA,TIPO_CONTROL,SERIE_NF,NRO_NF); COMMIT WORK; /*==============================================================*/ /* Table: PARAMETROS */ /*==============================================================*/ INSERT INTO PARAMETROS (COD_PARAMETRO,SEQ_PARAM,NOME_PARAM,DESCR_PARAM,TIPO_PARAM,CLASS_PARAM,VALOR_PARAM) VALUES (1,91,'SERIE_ATUAL_NFN','Série Atual de Emissão de Nota Fiscal Normal','INTEGER','4','0'); INSERT INTO PARAMETROS (COD_PARAMETRO,SEQ_PARAM,NOME_PARAM,DESCR_PARAM,TIPO_PARAM,CLASS_PARAM,VALOR_PARAM) VALUES (1,92,'NRO_LOTE_NFE','Nº do Lote Atual Transmissão de NFe (Sequencial)','INTEGER','4','1'); INSERT INTO PARAMETROS (COD_PARAMETRO,SEQ_PARAM,NOME_PARAM,DESCR_PARAM,TIPO_PARAM,CLASS_PARAM,VALOR_PARAM) VALUES (1,93,'SERIE_ATUAL_NFE','Série Atual de Emissão de Nota Fiscal Eletrônica','INTEGER','4','1'); INSERT INTO PARAMETROS (COD_PARAMETRO,SEQ_PARAM,NOME_PARAM,DESCR_PARAM,TIPO_PARAM,CLASS_PARAM,VALOR_PARAM) VALUES (1,94,'TIPO_NF_ATUAL','Tipo de Nota Fiscal usada Atual (Normal / Eletrônica)','STRING','4','NFE'); COMMIT WORK; /*==============================================================*/ /* Table: CIDADES */ /*==============================================================*/ ALTER TABLE CIDADES ADD CEP VARCHAR(10); COMMIT WORK; /*==============================================================*/ /* Trigger: TG_UPDATE_NOTAFISCAL */ /*==============================================================*/ SET TERM ^; ALTER TRIGGER TG_UPDATE_NOTAFISCAL ACTIVE BEFORE UPDATE POSITION 0 AS DECLARE VARIABLE varCOD_EMPRESA INTEGER; DECLARE VARIABLE varTIPO_CONTROL CHAR(1); DECLARE VARIABLE varSERIE_NF INTEGER; DECLARE VARIABLE varNRO_NF INTEGER; DECLARE VARIABLE varVLR_TOTAL DECIMAL(15,2); DECLARE VARIABLE varBASE_ICMS DECIMAL(15,2); DECLARE VARIABLE varVLR_ICMS DECIMAL(15,2); DECLARE VARIABLE varBASE_ICMS3 DECIMAL(15,2); DECLARE VARIABLE varVLR_ICMS3 DECIMAL(15,2); DECLARE VARIABLE varVLR_IPI DECIMAL(15,2); DECLARE VARIABLE varBASE_ICMS2 DECIMAL(15,2); DECLARE VARIABLE varVLR_ICMS2 DECIMAL(15,2); DECLARE VARIABLE varVLR_SERV DECIMAL(15,2); BEGIN /* SELEÇÃO DOS VALORES DOS ITENS DE PRODUTOS */ SELECT INF.NRO_NF, SUM(INF.VLR_TOTAL), SUM(INF.BASE_ICMS), SUM(INF.VLR_ICMS), SUM(INF.VLR_IPI) FROM ITENS_NF INF WHERE INF.COD_EMPRESA = NEW.COD_EMPRESA AND INF.SERIE_NF = NEW.SERIE_NF AND INF.NRO_NF = NEW.NRO_NF AND INF.TIPO_CONTROL = NEW.TIPO_CONTROL GROUP BY INF.NRO_NF INTO :varNRO_NF, :varVLR_TOTAL, :varBASE_ICMS, :varVLR_ICMS, :varVLR_IPI; /* SELEÇÃO DOS VALORES DOS ITENS DE SERVICO */ SELECT SVF.NRO_NF, SUM(SVF.VLR_TOTAL), SUM(SVF.BASE_ICMS), SUM(SVF.VLR_ICMS) FROM SERVICOS_NF SVF WHERE SVF.COD_EMPRESA = NEW.COD_EMPRESA AND SVF.SERIE_NF = NEW.SERIE_NF AND SVF.NRO_NF = NEW.NRO_NF AND SVF.TIPO_CONTROL = NEW.TIPO_CONTROL GROUP BY SVF.NRO_NF INTO :varNRO_NF, :varVLR_SERV, :varBASE_ICMS3, :varVLR_ICMS3; NEW.VLR_TOTAL = NEW.VLR_FRETE + NEW.VLR_SEGURO + NEW.VLR_OUTDESP + NEW.VLR_IPI + NEW.VLR_ACRES - NEW.VLR_DESC; IF (varVLR_SERV IS NULL) THEN varVLR_SERV = 0; IF (varBASE_ICMS3 IS NULL) THEN varBASE_ICMS3 = 0; IF (varVLR_ICMS3 IS NULL) THEN varVLR_ICMS3 = 0; IF (varVLR_TOTAL IS NULL) THEN varVLR_TOTAL = 0; IF (varBASE_ICMS IS NULL) THEN varBASE_ICMS = 0; IF (varVLR_ICMS IS NULL) THEN varVLR_ICMS = 0; IF (varVLR_IPI IS NULL) THEN varVLR_IPI = 0; IF (varVLR_TOTAL IS NOT NULL) THEN BEGIN UPDATE ITENS_NF INF SET INF.VLR_RATEIO = (INF.VLR_TOTAL / :varVLR_TOTAL) * (NEW.VLR_FRETE + NEW.VLR_SEGURO + NEW.VLR_OUTDESP + NEW.VLR_IPI + NEW.VLR_ACRES - NEW.VLR_DESC) WHERE INF.COD_EMPRESA = NEW.COD_EMPRESA AND INF.SERIE_NF = NEW.SERIE_NF AND INF.NRO_NF = NEW.NRO_NF AND INF.TIPO_CONTROL = NEW.TIPO_CONTROL; NEW.VLR_PROD = :varVLR_TOTAL; NEW.VLR_SERV = :varVLR_SERV; NEW.BASE_ICMS = :varBASE_ICMS + :varBASE_ICMS3; NEW.VLR_ICMS = :varVLR_ICMS + :varVLR_ICMS3; NEW.VLR_IPI = :varVLR_IPI; NEW.VLR_TOTAL = :varVLR_TOTAL + :varVLR_SERV + NEW.VLR_FRETE + NEW.VLR_SEGURO + NEW.VLR_OUTDESP + NEW.VLR_IPI + NEW.VLR_ACRES - NEW.VLR_DESC; END SELECT ANF.NRO_NF, SUM(ANF.BASE_ICMS), SUM(ANF.VLR_ICMS) FROM ALIQ_ICMSNF ANF WHERE ANF.COD_EMPRESA = NEW.COD_EMPRESA AND ANF.NRO_NF = NEW.NRO_NF AND ANF.TIPO_CONTROL = NEW.TIPO_CONTROL GROUP BY ANF.NRO_NF INTO :varNRO_NF, :varBASE_ICMS2, :varVLR_ICMS2; IF (:varBASE_ICMS2 IS NOT NULL) THEN BEGIN NEW.BASE_ICMS = NEW.BASE_ICMS + :varBASE_ICMS2; NEW.VLR_ICMS = NEW.VLR_ICMS + :varVLR_ICMS2; END IF (NEW.DESC_INSS = 'S') THEN NEW.VLR_TOTAL = NEW.VLR_TOTAL - NEW.VLR_INSS; IF (NEW.DESC_IRRF = 'S') THEN NEW.VLR_TOTAL = NEW.VLR_TOTAL - NEW.VLR_IRRF; END^ SET TERM ;^ COMMIT WORK; /*==============================================================*/ /* Table: CLIENTES */ /*==============================================================*/ ALTER TABLE CLIENTES ALTER COLUMN NUMERO TYPE VARCHAR(15); COMMIT WORK; /*==============================================================*/ /* Table: EMPRESAS */ /*==============================================================*/ ALTER TABLE EMPRESAS ALTER COLUMN NUMERO TYPE VARCHAR(15); COMMIT WORK; /*==============================================================*/ /* Table: PAR_NFE */ /*==============================================================*/ create table PAR_NFE ( COD_EMPRESA SMALLINT not null, NRO_CERTIFICADO VARCHAR(60), PATH_SALVAR_NFE VARCHAR(100), ARQUIVO_DANFE VARCHAR(100), LOGO_EMP_DANFE VARCHAR(100), TIPO_IMP_DANFE VARCHAR(10), PATH_DANFE_PDF VARCHAR(80), constraint PK_PAR_NFE primary key (COD_EMPRESA) ); COMMIT WORK; alter table PAR_NFE add constraint FK_PAR_NFE_EMPRESAS foreign key (COD_EMPRESA) references EMPRESAS(COD_EMPRESA); COMMIT WORK; /*================*/ /* Versão: 2.5.09 */ /*==============================================================*/ /* Table: PAR_NFE */ /*==============================================================*/ ALTER TABLE PAR_NFE ADD TIPO_AMBIENTE VARCHAR(15); COMMIT WORK; UPDATE PAR_NFE SET TIPO_AMBIENTE = 'taHomologacao' WHERE TIPO_AMBIENTE IS NULL; COMMIT WORK; /*================*/ /* Versão: 2.5.10 */ /*==============================================================*/ /* Table: PEDIDOS */ /*==============================================================*/ ALTER TABLE PEDIDOS ADD TIPO_FRETE CHAR(3); COMMIT WORK; /*================*/ /* Versão: 2.5.11 */ /*==============================================================*/ /* 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 varSALDO_ANT2 NUMERIC(15,3); DECLARE VARIABLE varCUSTO_ANT NUMERIC(15,5); DECLARE VARIABLE varSALDO_ANT_INI NUMERIC(15,3); DECLARE VARIABLE varSALDO_ANT_INI2 NUMERIC(15,3); DECLARE VARIABLE varCUSTO_ANT_INI NUMERIC(15,5); DECLARE VARIABLE varMES INTEGER; DECLARE VARIABLE varANO INTEGER; DECLARE VARIABLE varDIA INTEGER; DECLARE VARIABLE varSOMA_DIA INTEGER; DECLARE VARIABLE varTIPO_OPER CHAR(1); DECLARE VARIABLE varTIPO_CTRL CHAR(1); DECLARE VARIABLE varQTD_MOV NUMERIC(15,3); DECLARE VARIABLE varVLR_LCTO NUMERIC(15,2); DECLARE VARIABLE varSOMA_E NUMERIC(15,3); DECLARE VARIABLE varSOMA_S NUMERIC(15,3); DECLARE VARIABLE varSOMA_E2 NUMERIC(15,3); DECLARE VARIABLE varSOMA_S2 NUMERIC(15,3); DECLARE VARIABLE varULT_CUSTO NUMERIC(15,5); DECLARE VARIABLE varCUSTO_NOVO NUMERIC(15,5); DECLARE VARIABLE varSALDO_ATUAL NUMERIC(15,3); DECLARE VARIABLE varSALDO_ATUAL2 NUMERIC(15,3); DECLARE VARIABLE varANO_REF SMALLINT; DECLARE VARIABLE varMES_REF SMALLINT; DECLARE VARIABLE varDIA_REF SMALLINT; DECLARE VARIABLE varSEQ_DIA SMALLINT; DECLARE VARIABLE varQTD_REG SMALLINT; DECLARE VARIABLE varSEQ_REG SMALLINT; DECLARE VARIABLE varTEM_LCTO_SUPERIOR SMALLINT; BEGIN SELECT SALDO_ANTERIOR, SALDO_ANTERIOR2, CUSTO_ANTERIOR, CUSTO_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, :varSALDO_ANT2, :varCUSTO_ANT, :varULT_CUSTO; IF (varSALDO_ANT IS NULL) THEN varSALDO_ANT = 0.00; IF (varSALDO_ANT2 IS NULL) THEN varSALDO_ANT2 = 0.00; IF (varCUSTO_ANT IS NULL) THEN varCUSTO_ANT = 0.00; IF (varULT_CUSTO IS NULL) THEN varULT_CUSTO = 0.00; varTEM_LCTO_SUPERIOR = 0; varSOMA_DIA = 0; /* LOCALIZA SE TEM LANÇAMENTOS SUPERIORES */ FOR SELECT COUNT(SEQ_DIA) 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))) OR (ANO_REF = OLD.ANO_REF AND MES_REF > OLD.MES_REF) OR (ANO_REF > OLD.ANO_REF)) INTO :varSOMA_DIA DO BEGIN IF (varSOMA_DIA > 0) THEN varTEM_LCTO_SUPERIOR = 1; END varSOMA_E = 0; varSOMA_S = 0; varSOMA_E2 = 0; varSOMA_S2 = 0; FOR SELECT TIPO_OPEREST, TIPO_CONTROL, QTD_MOV, VLR_CUSTO 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, :varTIPO_CTRL, :varQTD_MOV, :varULT_CUSTO DO BEGIN IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'Q')) THEN varSOMA_E = varSOMA_E + varQTD_MOV; IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'Q')) THEN varSOMA_S = varSOMA_S + varQTD_MOV; IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'F')) THEN varSOMA_E2 = varSOMA_E2 + varQTD_MOV; IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'F')) THEN varSOMA_S2 = varSOMA_S2 + varQTD_MOV; END IF (varULT_CUSTO IS NULL) THEN varULT_CUSTO = varCUSTO_ANT; IF (varULT_CUSTO <= 0.00) THEN varULT_CUSTO = varCUSTO_ANT; varSALDO_ATUAL = varSALDO_ANT + varSOMA_E - varSOMA_S; varSALDO_ATUAL2 = varSALDO_ANT2 + varSOMA_E2 - varSOMA_S2; varCUSTO_NOVO = varULT_CUSTO; IF (varSALDO_ATUAL IS NULL) THEN varSALDO_ATUAL = 0; IF (varSALDO_ATUAL2 IS NULL) THEN varSALDO_ATUAL2 = 0; IF ((OLD.TIPO_OPEREST = 'E') AND (OLD.TIPO_CONTROL = 'Q')) THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_ENTRADA = (QTD_ENTRADA - OLD.QTD_MOV), CUSTO_ATUAL = :varULT_CUSTO 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 = 'E') AND (OLD.TIPO_CONTROL = 'F')) THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_ENTRADA2 = (QTD_ENTRADA2 - 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 IF ((OLD.TIPO_OPEREST = 'S') AND (OLD.TIPO_CONTROL = 'Q')) 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 IF ((OLD.TIPO_OPEREST = 'S') AND (OLD.TIPO_CONTROL = 'F')) THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_SAIDA2 = (QTD_SAIDA2 - 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 /* PERCORE OS LANÇCAMENTOS DO MESMO ANO E MESMO MES ACIMA DO EXCLUIDO PARA RECALCULAR O CUSTO */ IF (varTEM_LCTO_SUPERIOR = 1) THEN BEGIN FOR SELECT ANO_REF, MES_REF, DIA_REF, SEQ_DIA, TIPO_OPEREST, TIPO_CONTROL, QTD_MOV, VLR_LCTO 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 :varANO_REF, :varMES_REF, :varDIA_REF, :varSEQ_DIA, :varTIPO_OPER, :varTIPO_CTRL, :varQTD_MOV, :varVLR_LCTO DO BEGIN IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'Q')) THEN BEGIN varCUSTO_NOVO = ((varSALDO_ATUAL * varULT_CUSTO) + varVLR_LCTO) / (varSALDO_ATUAL + varQTD_MOV); varULT_CUSTO = varCUSTO_NOVO; UPDATE MOVTO_ESTOQUE SET VLR_CUSTO = :varCUSTO_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; varSALDO_ATUAL = varSALDO_ATUAL + varQTD_MOV; END IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'Q')) THEN varSALDO_ATUAL = varSALDO_ATUAL - varQTD_MOV; IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'F')) THEN varSALDO_ATUAL2 = varSALDO_ATUAL2 + varQTD_MOV; IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'F')) THEN varSALDO_ATUAL2 = varSALDO_ATUAL2 - varQTD_MOV; END END /* ATUALIZA CUSTO ATUAL DO MES DE EXCLUSAO */ UPDATE SALDO_PRODUTOS SET CUSTO_ATUAL = :varULT_CUSTO WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = OLD.ANO_REF AND MES_REF = OLD.MES_REF; /* SETA VARIAVEIS PARA USAR NOS CALCULOS DOS REGITROS ACIMA DO MES DO EXCLUIDO */ varMES = OLD.MES_REF + 1; varANO = OLD.ANO_REF; IF (varMES > 12) THEN BEGIN varMES = 1; varANO = varANO + 1; END /* ATUALIZA SALDOS E CUSTOS ANTERIORES DO PROXIMO MES */ UPDATE SALDO_PRODUTOS SET CUSTO_ANTERIOR = :varULT_CUSTO, CUSTO_ATUAL = :varULT_CUSTO, SALDO_ANTERIOR = :varSALDO_ATUAL, SALDO_ANTERIOR2 = :varSALDO_ATUAL2 WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO AND MES_REF = :varMES; varCUSTO_ANT = varULT_CUSTO; varSALDO_ANT = varSALDO_ATUAL; varSALDO_ANT2 = varSALDO_ATUAL2; IF (varTEM_LCTO_SUPERIOR = 1) THEN BEGIN /* PERCORE TODOS OS LANÇAMENTOS ACIMA DO MES DO EXCLUIDO PARA RECALCULAR O CUSTO */ FOR SELECT ANO_REF, MES_REF, DIA_REF, SEQ_DIA, TIPO_OPEREST, TIPO_CONTROL, QTD_MOV, VLR_LCTO FROM MOVTO_ESTOQUE WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND MES_REF > OLD.MES_REF AND (ANO_REF = OLD.ANO_REF OR ANO_REF > OLD.ANO_REF) ORDER BY MES_REF, DIA_REF, SEQ_DIA INTO :varANO_REF, :varMES_REF, :varDIA_REF, :varSEQ_DIA, :varTIPO_OPER, :varTIPO_CTRL, :varQTD_MOV, :varVLR_LCTO DO BEGIN /* SE O MES DE MOVIMENTO FOR MAIOR QUE O MES ANTERIOR */ IF (varMES_REF > varMES) THEN BEGIN /* ATUALIZA SALDOS E CUSTOS ATE O MES ATUAL */ UPDATE SALDO_PRODUTOS SET CUSTO_ANTERIOR = :varCUSTO_ANT, CUSTO_ATUAL = :varCUSTO_ANT, SALDO_ANTERIOR = :varSALDO_ANT, SALDO_ANTERIOR2 = :varSALDO_ANT2 WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO_REF AND MES_REF >= :varMES AND MES_REF < :varMES_REF; /* PEGA OS SALDOS PARA SEREM USADOS NOS ANTERIROES DO MES ATUAL */ SELECT SALDO_FINAL, SALDO_FINAL2 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, :varSALDO_ANT2; varSALDO_ATUAL = varSALDO_ANT; varSALDO_ATUAL2 = varSALDO_ANT2; varULT_CUSTO = varCUSTO_ANT; END IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'Q')) THEN BEGIN varCUSTO_NOVO = ((varSALDO_ATUAL * varULT_CUSTO) + varVLR_LCTO) / (varSALDO_ATUAL + varQTD_MOV); varULT_CUSTO = varCUSTO_NOVO; UPDATE MOVTO_ESTOQUE SET VLR_CUSTO = :varCUSTO_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; varSALDO_ATUAL = varSALDO_ATUAL + varQTD_MOV; END IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'Q')) THEN varSALDO_ATUAL = varSALDO_ATUAL - varQTD_MOV; IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'F')) THEN varSALDO_ATUAL2 = varSALDO_ATUAL2 + varQTD_MOV; IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'F')) THEN varSALDO_ATUAL2 = varSALDO_ATUAL2 - varQTD_MOV; varMES = varMES_REF; varANO = varANO_REF; varCUSTO_ANT = varULT_CUSTO; varSALDO_ANT = varSALDO_ATUAL; varSALDO_ANT2 = varSALDO_ATUAL2; END END SELECT SALDO_FINAL, SALDO_FINAL2, CUSTO_ATUAL FROM SALDO_PRODUTOS WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO AND MES_REF = :varMES INTO :varSALDO_ANT, :varSALDO_ANT2, :varCUSTO_ANT; varMES = varMES + 1; SELECT COUNT(COD_PRODUTO) FROM SALDO_PRODUTOS WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ((ANO_REF = :varANO AND MES_REF >= :varMES) OR (ANO_REF > :varANO)) INTO :varQTD_REG; IF (varMES > 12) THEN BEGIN varMES = 1; varANO = varANO + 1; END varSEQ_REG = 1; WHILE (varSEQ_REG < varQTD_REG) DO BEGIN UPDATE SALDO_PRODUTOS SET CUSTO_ANTERIOR = :varCUSTO_ANT, CUSTO_ATUAL = :varCUSTO_ANT, SALDO_ANTERIOR = :varSALDO_ANT, SALDO_ANTERIOR2 = :varSALDO_ANT2 WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO AND MES_REF = :varMES; SELECT SALDO_FINAL, SALDO_FINAL2, CUSTO_ATUAL FROM SALDO_PRODUTOS WHERE COD_EMPRESA = OLD.COD_EMPRESA AND COD_PRODUTO = OLD.COD_PRODUTO AND ANO_REF = :varANO AND MES_REF = :varMES INTO :varSALDO_ANT, :varSALDO_ANT2, :varCUSTO_ANT; varMES = varMES + 1; IF (varMES > 12) THEN BEGIN varMES = 1; varANO = varANO + 1; END varSEQ_REG = varSEQ_REG + 1; END END^ SET TERM ;^ 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 varSALDO_ANT2 NUMERIC(15,3); DECLARE VARIABLE varCUSTO_ANT NUMERIC(15,5); DECLARE VARIABLE varSALDO_ANT_INI NUMERIC(15,3); DECLARE VARIABLE varSALDO_ANT_INI2 NUMERIC(15,3); DECLARE VARIABLE varCUSTO_ANT_INI NUMERIC(15,5); DECLARE VARIABLE varMES INTEGER; DECLARE VARIABLE varANO INTEGER; DECLARE VARIABLE varDIA INTEGER; DECLARE VARIABLE varINI INTEGER; DECLARE VARIABLE varTIPO_OPER CHAR(1); DECLARE VARIABLE varTIPO_CTRL CHAR(1); DECLARE VARIABLE varQTD_MOV NUMERIC(15,3); DECLARE VARIABLE varVLR_LCTO NUMERIC(15,2); DECLARE VARIABLE varSOMA_E NUMERIC(15,3); DECLARE VARIABLE varSOMA_S NUMERIC(15,3); DECLARE VARIABLE varSOMA_E2 NUMERIC(15,3); DECLARE VARIABLE varSOMA_S2 NUMERIC(15,3); DECLARE VARIABLE varULT_CUSTO NUMERIC(15,5); DECLARE VARIABLE varSALDO_ATUAL NUMERIC(15,3); DECLARE VARIABLE varSALDO_ATUAL2 NUMERIC(15,3); DECLARE VARIABLE varCUSTO_NOVO NUMERIC(15,5); DECLARE VARIABLE varANO_REF SMALLINT; DECLARE VARIABLE varMES_REF SMALLINT; DECLARE VARIABLE varDIA_REF SMALLINT; DECLARE VARIABLE varSEQ_DIA SMALLINT; DECLARE VARIABLE varQTD_LANCTOS SMALLINT; DECLARE VARIABLE varTEM_LCTO_SUPERIOR SMALLINT; BEGIN /* SELECIONA O SALDO E CUSTO ANTERIOR E ATUAIS */ SELECT SALDO_ANTERIOR, SALDO_ANTERIOR2, SALDO_FINAL, SALDO_FINAL2, CUSTO_ANTERIOR, CUSTO_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, :varSALDO_ANT2, :varSALDO_ATUAL, :varSALDO_ATUAL2, :varCUSTO_ANT, :varULT_CUSTO; /* SE NÃO EXISTIR, SERÁ GERADO AUTOMATICAMENTE PELA TRIGGER */ IF ((varSALDO_ANT IS NULL) AND (varSALDO_ANT2 IS NULL)) THEN BEGIN 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, SALDO_ANTERIOR2, QTD_ENTRADA2, QTD_SAIDA2, CUSTO_ANTERIOR, CUSTO_ATUAL) VALUES (NEW.COD_EMPRESA, NEW.COD_PRODUTO, NEW.ANO_REF, :varMES,0,0,0,0,0,0,0,0); varMES = varMES + 1; END END IF (varSALDO_ANT IS NULL) THEN varSALDO_ANT = 0; IF (varSALDO_ANT2 IS NULL) THEN varSALDO_ANT2 = 0; IF (varSALDO_ATUAL IS NULL) THEN varSALDO_ATUAL = 0; IF (varSALDO_ATUAL2 IS NULL) THEN varSALDO_ATUAL2 = 0; IF (varCUSTO_ANT IS NULL) THEN varCUSTO_ANT = 0.00; IF (varULT_CUSTO IS NULL) THEN varULT_CUSTO = 0.00; varTEM_LCTO_SUPERIOR = 0; varQTD_LANCTOS = 0; /* LOCALIZA SE TEM LANÇAMENTOS SUPERIORES */ FOR SELECT COUNT(SEQ_DIA) 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 (ANO_REF = NEW.ANO_REF AND MES_REF > NEW.MES_REF) OR (ANO_REF > NEW.ANO_REF)) INTO :varQTD_LANCTOS DO BEGIN IF (varQTD_LANCTOS > 0) THEN varTEM_LCTO_SUPERIOR = 1; END /* PERCORRE O MOVIMENTO DO ESTOQUE PARA ACHAR O SALDO ATÉ O ULTIMA LANÇAMENTO */ varSOMA_E = 0; varSOMA_S = 0; varSOMA_E2 = 0; varSOMA_S2 = 0; IF (varTEM_LCTO_SUPERIOR = 1) THEN BEGIN FOR SELECT TIPO_OPEREST, TIPO_CONTROL, QTD_MOV, VLR_CUSTO 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, :varTIPO_CTRL, :varQTD_MOV, :varULT_CUSTO DO BEGIN IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'Q')) THEN varSOMA_E = varSOMA_E + varQTD_MOV; IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'Q')) THEN varSOMA_S = varSOMA_S + varQTD_MOV; IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'F')) THEN varSOMA_E2 = varSOMA_E2 + varQTD_MOV; IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'F')) THEN varSOMA_S2 = varSOMA_S2 + varQTD_MOV; END IF (varSOMA_E IS NULL) THEN varSOMA_E = 0; IF (varSOMA_S IS NULL) THEN varSOMA_S = 0; IF (varSOMA_E2 IS NULL) THEN varSOMA_E2 = 0; IF (varSOMA_S2 IS NULL) THEN varSOMA_S2 = 0; /* 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; varSALDO_ATUAL = (varSOMA_E - varSOMA_S) + varSALDO_ANT; varSALDO_ATUAL2 = (varSOMA_E2 - varSOMA_S2) + varSALDO_ANT2; END IF (varSALDO_ATUAL IS NULL) THEN varSALDO_ATUAL = varSALDO_ANT; IF (varSALDO_ATUAL2 IS NULL) THEN varSALDO_ATUAL2 = varSALDO_ANT2; /* CALCULA O NOVO CUSTO SE FOR ENTRADA, NA SAIDA MANTEM */ IF ((NEW.TIPO_OPEREST = 'E') AND (NEW.TIPO_CONTROL = 'Q')) THEN BEGIN IF ((varSALDO_ATUAL + NEW.QTD_MOV) = 0) THEN varCUSTO_NOVO = 0; ELSE BEGIN IF (varSALDO_ATUAL < 0) THEN varCUSTO_NOVO = 0; ELSE varCUSTO_NOVO = ((varSALDO_ATUAL * varULT_CUSTO) + NEW.VLR_LCTO) / (varSALDO_ATUAL + NEW.QTD_MOV); END IF (varCUSTO_NOVO = 0) THEN varCUSTO_NOVO = NEW.VLR_LCTO / NEW.QTD_MOV; IF (varCUSTO_NOVO = 0) THEN varCUSTO_NOVO = varULT_CUSTO; END ELSE varCUSTO_NOVO = varULT_CUSTO; IF (varCUSTO_NOVO < 0) THEN varCUSTO_NOVO = varCUSTO_NOVO * -1; NEW.VLR_CUSTO = varCUSTO_NOVO; /* ATUALIZA SE FOR ENTRADA OU SAIDA NO SALDO DO PRODUTO ATUAL */ IF ((NEW.TIPO_OPEREST = 'E') AND (NEW.TIPO_CONTROL = 'Q')) THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_ENTRADA = (QTD_ENTRADA + 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 IF ((NEW.TIPO_OPEREST = 'E') AND (NEW.TIPO_CONTROL = 'F')) THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_ENTRADA2 = (QTD_ENTRADA2 + NEW.QTD_MOV) 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') AND (NEW.TIPO_CONTROL = 'Q')) 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 IF ((NEW.TIPO_OPEREST = 'S') AND (NEW.TIPO_CONTROL = 'F')) THEN BEGIN UPDATE SALDO_PRODUTOS SET QTD_SAIDA2 = (QTD_SAIDA2 + NEW.QTD_MOV) 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 varINI = 0; IF (varTEM_LCTO_SUPERIOR = 1) THEN BEGIN /* 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, TIPO_CONTROL, QTD_MOV, VLR_LCTO 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, :varTIPO_CTRL, :varQTD_MOV, :varVLR_LCTO DO BEGIN /* RECALCULA O NOVO CUSTO PARA O LANÇAMENTO SELECIONADO */ varULT_CUSTO = varCUSTO_NOVO; IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'Q')) 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); END IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'F')) THEN varCUSTO_NOVO = varULT_CUSTO; IF (varTIPO_OPER = 'S') THEN varCUSTO_NOVO = varULT_CUSTO; /* ATUALIZA O CUSTO MEDIO NO LANÇAMENTO DO MOVIMENTO ESTOQUE */ UPDATE MOVTO_ESTOQUE SET VLR_CUSTO = :varCUSTO_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') AND (varTIPO_CTRL = 'Q')) THEN varSALDO_ATUAL = varSALDO_ATUAL + varQTD_MOV; IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'Q')) THEN varSALDO_ATUAL = varSALDO_ATUAL - varQTD_MOV; IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'F')) THEN varSALDO_ATUAL2 = varSALDO_ATUAL2 + varQTD_MOV; IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'F')) THEN varSALDO_ATUAL2 = varSALDO_ATUAL2 - varQTD_MOV; varINI = 1; END END IF (varINI = 1) THEN BEGIN /* ATUALIZO O CUSTO DO MES DO MOVIMENTO */ UPDATE SALDO_PRODUTOS SET 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; END /* SELECIONA OS SALDO E CUSTOS ATUAIS PRA SEREM USADOS COMO ANTERIORES NO PROXIMO MES */ SELECT SALDO_FINAL, SALDO_FINAL2, CUSTO_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_INI, :varSALDO_ANT_INI2, :varCUSTO_ANT_INI; /* ================================================================================= */ /* VAI PERCOREER TODOS OS SALDOS ACIMA DO MES DE LANÇAMENTO 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) OR (ANO_REF > NEW.ANO_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_INI, SALDO_ANTERIOR = :varSALDO_ANT_INI, SALDO_ANTERIOR2 = :varSALDO_ANT_INI2 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_INI; varSALDO_ATUAL2 = varSALDO_ANT_INI2; varCUSTO_NOVO = varCUSTO_ANT_INI; varULT_CUSTO = varCUSTO_ANT_INI; IF (varTEM_LCTO_SUPERIOR = 1) THEN BEGIN /* SELECIONA O MOVIMENTO PARA O MES A ANO DO SALDO SELECIOANDO */ FOR SELECT DIA_REF, SEQ_DIA, TIPO_OPEREST, TIPO_CONTROL, QTD_MOV, VLR_LCTO 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, :varTIPO_CTRL, :varQTD_MOV, :varVLR_LCTO DO BEGIN /* RECALCULA O NOVO CUSTO PARA O LANÇAMENTO SELECIONADO */ IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'Q')) 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); END IF ((varTIPO_OPER = 'E') AND (varTIPO_CTRL = 'F')) THEN varCUSTO_NOVO = varULT_CUSTO; IF (varTIPO_OPER = 'S') THEN varCUSTO_NOVO = varULT_CUSTO; varULT_CUSTO = varCUSTO_NOVO; /* ATUALIZA O CUSTO MEDIO NO LANÇAMENTO DO MOVIMENTO ESTOQUE */ UPDATE MOVTO_ESTOQUE SET VLR_CUSTO = :varCUSTO_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') AND (varTIPO_CTRL = 'Q')) THEN varSALDO_ATUAL = varSALDO_ATUAL + varQTD_MOV; IF ((varTIPO_OPER = 'S') AND (varTIPO_CTRL = 'Q')) THEN varSALDO_ATUAL = varSALDO_ATUAL - varQTD_MOV; END END UPDATE SALDO_PRODUTOS SET CUSTO_ATUAL = :varCUSTO_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, SALDO_FINAL2, CUSTO_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_INI, :varSALDO_ANT_INI2, :varCUSTO_ANT_INI; END END^ SET TERM ;^ COMMIT WORK; /*================*/ /* Versão: 2.5.23 */ /*==============================================================*/ /* Table: CLASS_FISCAL */ /*==============================================================*/ ALTER TABLE CLASS_FISCAL ADD PERC_BASE NUMERIC(9,4); COMMIT WORK; /*================*/ /* Versão: 2.5.24 */ /*==============================================================*/ /* Table: ITENS_FATURA */ /*==============================================================*/ ALTER TABLE ITENS_FATURA ADD VLR_TOTAL NUMERIC(15,2); COMMIT WORK; UPDATE ITENS_FATURA SET VLR_TOTAL = QTD_PROD * VLR_VENDA; COMMIT WORK; /*==============================================================*/ /* Table: PARAMETROS */ /*==============================================================*/ INSERT INTO PARAMETROS (COD_PARAMETRO,SEQ_PARAM,NOME_PARAM,DESCR_PARAM,TIPO_PARAM,CLASS_PARAM,VALOR_PARAM) VALUES (1,95,'NF_MOSTRA_CLASS_FISCAL','Nota Fiscal: Imprime e Controla a Class. Fiscal do Produto (NCM)','STRING','4',NULL); COMMIT WORK;