Olá Pessoal,
Estou com um problema aqui que começou após criar umas Procedures e Triggers para controle de Estoque. Criei uma tabela de movimentação de produtos e nela as triggers de atualização de estoque na tabela do produto. Para gravar a movimentação do produto uso uma SP que passado um pedido como parâmetro lança todos os itens do mesmo na tabela de movimentação Funcionou tudo certo como eu desejava porem a tabela de movimentação do produto começou a corromper. Se alguém poder me ajudar serei muito grato. /*************************************************************************** ***/ /**** Stored Procedures ****/ /*************************************************************************** ***/ CREATE PROCEDURE SP_EXTB_COMPRA ( NR_DOC VARCHAR(10), COD_FORN VARCHAR(5)) AS BEGIN EXIT; END^ CREATE PROCEDURE SP_EXTB_LOTE ( COD_EMP INTEGER, COD_LOTE VARCHAR(6)) AS BEGIN EXIT; END^ CREATE PROCEDURE SP_EXTB_VENDA ( COD_EMP INTEGER, COD_PED INTEGER) AS BEGIN EXIT; END^ CREATE PROCEDURE SP_MOVB_COMPRA ( NR_DOC VARCHAR(10), COD_FORN VARCHAR(5)) AS BEGIN EXIT; END^ CREATE PROCEDURE SP_MOVB_LOTE ( COD_EMP INTEGER, COD_LOTE VARCHAR(6)) AS BEGIN EXIT; END^ CREATE PROCEDURE SP_MOVB_VENDA ( COD_EMP INTEGER, COD_PED INTEGER) AS BEGIN EXIT; END^ SET TERM ; ^ /*************************************************************************** ***/ /**** Tables ****/ /*************************************************************************** ***/ CREATE TABLE MOV_B ( COD_MPROD INTEGER NOT NULL, COD_PROD VARCHAR(5) NOT NULL, TELA CHAR(1) NOT NULL, DATA_MOVI TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, QTD_MOV NUMERIC(12,3) DEFAULT 0 NOT NULL, COD_EMP INTEGER NOT NULL, COD_PED INTEGER, COD_FORN VARCHAR(5), NR_DOC VARCHAR(10), NR_PRO VARCHAR(6), COD_DEV VARCHAR(5), TIPO_SAI CHAR(1), COD_LOTE VARCHAR(6) ); /*************************************************************************** ***/ /**** Triggers for tables ****/ /*************************************************************************** ***/ /* Trigger: TG_ADD_ESTOQUE */ CREATE TRIGGER TG_ADD_ESTOQUE FOR MOV_B ACTIVE BEFORE INSERT POSITION 0 AS declare variable VQTDE NUMERIC(12,3); begin /* Adiciona Movimento ao estoque */ IF(NEW.TIPO_SAI = 'S') THEN VQTDE = -NEW.QTD_MOV; ELSE IF(NEW.TIPO_SAI = 'E') THEN VQTDE = +NEW.QTD_MOV; IF ((NEW.TIPO_SAI = 'S') OR (NEW.TIPO_SAI = 'E')) THEN UPDATE EST_PROD SET QTD_ATU_B = QTD_ATU_B + :VQTDE WHERE COD_PROD = NEW.COD_PROD; end ^ /* Trigger: TG_REM_ESTOQUE */ CREATE TRIGGER TG_REM_ESTOQUE FOR MOV_B ACTIVE AFTER DELETE POSITION 0 AS declare variable VQTDE NUMERIC(12,3); begin /* Adiciona Movimento ao estoque */ IF(OLD.TIPO_SAI = 'S') THEN VQTDE = +OLD.QTD_MOV; ELSE IF(OLD.TIPO_SAI = 'E') THEN VQTDE = -OLD.QTD_MOV; IF ((OLD.TIPO_SAI = 'S') OR (OLD.TIPO_SAI = 'E')) THEN UPDATE EST_PROD SET QTD_ATU_B = QTD_ATU_B + :VQTDE WHERE COD_PROD = OLD.COD_PROD; end ^ SET TERM ; ^ /*************************************************************************** ***/ /**** Stored Procedures ****/ /*************************************************************************** ***/ SET TERM ^ ; ALTER PROCEDURE SP_EXTB_COMPRA ( NR_DOC VARCHAR(10), COD_FORN VARCHAR(5)) AS BEGIN /* Deleta Movimento de Venda */ DELETE FROM MOV_B WHERE NR_DOC = :NR_DOC AND COD_FORN = :COD_FORN AND TELA = 'C'; END ^ ALTER PROCEDURE SP_EXTB_LOTE ( COD_EMP INTEGER, COD_LOTE VARCHAR(6)) AS BEGIN /* Deleta Movimento de Lote */ DELETE FROM MOV_B WHERE COD_EMP = :COD_EMP AND COD_LOTE = :COD_LOTE AND TELA = 'L'; END ^ ALTER PROCEDURE SP_EXTB_VENDA ( COD_EMP INTEGER, COD_PED INTEGER) AS BEGIN /* Deleta Movimento de Venda */ DELETE FROM MOV_B WHERE COD_EMP = :COD_EMP AND COD_PED = :COD_PED AND TELA = 'V'; END ^ ALTER PROCEDURE SP_MOVB_COMPRA ( NR_DOC VARCHAR(10), COD_FORN VARCHAR(5)) AS BEGIN /* Deleta Movimento de Venda */ DELETE FROM MOV_B WHERE NR_DOC = :NR_DOC AND COD_FORN = :COD_FORN AND TELA = 'C'; /* Inclui Movimento de Venda */ INSERT INTO MOV_B (COD_MPROD, COD_PROD, TELA, DATA_MOVI, QTD_MOV, COD_EMP, NR_DOC, COD_FORN, TIPO_SAI) SELECT GEN_ID (GEN_MOV_B, 1), ITN.COD_PROD, 'C', CURRENT_TIMESTAMP, ITN.QTD_02, CAB.COD_EMP, ITN.NR_DOC, ITN.COD_FORN, IIF(CFO.TIPO_E_S = '1', 'E', iif(CFO.TIPO_E_S = '2', 'S', 'N')) FROM ENT_ITN ITN LEFT OUTER JOIN ENT_CAB CAB ON (CAB.NR_DOC = ITN.NR_DOC AND CAB.COD_FORN = ITN.COD_FORN) LEFT OUTER JOIN CFOP CFO ON (CFO.CFOP = CAB.CFOP) WHERE ITN.NR_DOC = :NR_DOC AND ITN.COD_FORN = :COD_FORN; END ^ ALTER PROCEDURE SP_MOVB_LOTE ( COD_EMP INTEGER, COD_LOTE VARCHAR(6)) AS BEGIN /* Deleta Movimento de Lote */ DELETE FROM MOV_B WHERE COD_EMP = :COD_EMP AND COD_LOTE = :COD_LOTE AND TELA = 'L'; /* Inclui Movimento de Lote */ INSERT INTO MOV_B (COD_MPROD, COD_PROD, TELA, DATA_MOVI, QTD_MOV, COD_EMP, COD_LOTE, TIPO_SAI) SELECT GEN_ID (GEN_MOV_B, 1), ITN.COD_PROD, 'L', CURRENT_TIMESTAMP, ITN.QTD, ITN.COD_EMP, ITN.COD_LOTE, CAB.TIPO FROM LOTE_ITN ITN LEFT OUTER JOIN LOTE_CAB CAB ON (CAB.COD_EMP = ITN.COD_EMP AND CAB.COD_LOTE = ITN.COD_LOTE) WHERE ITN.COD_EMP = :COD_EMP AND ITN.COD_LOTE = :COD_LOTE; END ^ ALTER PROCEDURE SP_MOVB_VENDA ( COD_EMP INTEGER, COD_PED INTEGER) AS BEGIN /* Deleta Movimento de Venda */ DELETE FROM MOV_B WHERE COD_EMP = :COD_EMP AND COD_PED = :COD_PED AND TELA = 'V'; /* Inclui Movimento de Venda */ INSERT INTO MOV_B (COD_MPROD, COD_PROD, TELA, DATA_MOVI, QTD_MOV, COD_EMP, COD_PED, TIPO_SAI) SELECT GEN_ID (GEN_MOV_B, 1), ITN.COD_PROD, 'V', CURRENT_TIMESTAMP, ITN.QTD_01, ITN.COD_EMP, ITN.COD_PED, IIF(CFO.TIPO_E_S = '1', 'E', iif(CFO.TIPO_E_S = '2', 'S', 'N')) FROM SAI_ITN ITN LEFT OUTER JOIN SAI_CAB CAB ON (CAB.COD_EMP = ITN.COD_EMP AND CAB.COD_PED = ITN.COD_PED) LEFT OUTER JOIN CFOP CFO ON (CFO.CFOP = CAB.CFOP) WHERE ITN.COD_EMP = :COD_EMP AND ITN.COD_PED = :COD_PED; END ^ SET TERM ; ^ [As partes desta mensagem que não continham texto foram removidas]