NIK Postado Setembro 29, 2010 Denunciar Share Postado Setembro 29, 2010 Pessoal... bom diaTenho uma trigger que trabalha dentro de uma tabela a partir do momento que existe uma inserção de um tipo de registro.Até ai tudo bem, porém, muito de vez enquando ao executar acontece o seguinte erro:No user transaction is currently in progress.The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTIONAlguém sabe em que momento ou porque acontece esse erro...O que me intriga é que não é sempre e sim de vez enquando.Irei colocar a trigger aqui, mas aviso que ela é gigante... ----CREATE TRIGGER TR_AUXRM_BAIXA_ESTOQUEON TMOVFOR UPDATEASDECLARE @ERRO INTDECLARE @PASSO INTDECLARE @NM_ANTIGO VARCHAR(15)DECLARE @NM_NOVO VARCHAR(15)DECLARE @CODTMV VARCHAR(10) DECLARE @ENTROU INTSET @ENTROU = 0IF (SELECT COUNT(1) FROM INSERTED WHERE CODCOLIGADA = 01 AND((CODTMV IN ('2.2.01','2.2.15','2.2.19','2.2.12','2.2.21'))OR (CODTMV = '2.1.06' AND CAMPOLIVRE3 LIKE '%999'))) > 0 BEGIN SET @NM_ANTIGO = (SELECT NUMEROMOV FROM DELETED) SET @NM_NOVO = (SELECT NUMEROMOV FROM INSERTED) SET @CODTMV = (SELECT CASE WHEN CODTMV = '2.2.01' THEN '2.1.05' WHEN CODTMV = '2.2.15' THEN '2.1.07' WHEN CODTMV = '2.1.06' THEN '2.1.08' ELSE '2.1.09' END AS RESULT FROM INSERTED) IF @NM_ANTIGO <> @NM_NOVO BEGIN SET @ENTROU = 1 DECLARE @IDMOV INT DECLARE @IDMOV_ORIG INT DECLARE @NUMEROMOV VARCHAR(15) DECLARE @DATASEMHORA DATETIME DECLARE @DATACOMHORA DATETIME DECLARE @CODCOLIGADA INT DECLARE @CODFILIAL SMALLINT DECLARE @CODLOC VARCHAR(15) DECLARE @SERIE VARCHAR(8) DECLARE @TIPO VARCHAR(1) DECLARE @STATUS VARCHAR(1) DECLARE @DATAEMISSAO DATETIME DECLARE @DATAEXTRA1 DATETIME DECLARE @CODCPG VARCHAR(5) DECLARE @OBSERVACAO VARCHAR(60) DECLARE @CODMOEVALORLIQUIDO VARCHAR(10) DECLARE @DATAMOVIMENTO DATETIME DECLARE @FRETECIFOUFOB SMALLINT DECLARE @CODCCUSTO VARCHAR(25) DECLARE @CODVEN1 VARCHAR(16) DECLARE @CODCOLCFO SMALLINT DECLARE @CODCOLCXA SMALLINT DECLARE @GERADOPORLOTE SMALLINT DECLARE @STATUSEXPORTCONT SMALLINT DECLARE @CAMPOLIVRE2 VARCHAR(100) DECLARE @GEROUCONTATRABALHO SMALLINT DECLARE @GERADOPORCONTATRABALHO SMALLINT DECLARE @HORULTIMAALTERACAO DATETIME DECLARE @INDUSOOBJ RMDVALOR2 DECLARE @INTEGRADOBONUM SMALLINT DECLARE @HORARIOEMISSAO DATETIME DECLARE @DATACRIACAO DATETIME DECLARE @VINCULADOESTOQUEFL SMALLINT DECLARE @CONTORCAMENTOANTIGO SMALLINT DECLARE @DATACONTABILIZACAO DATETIME DECLARE @SEQUENCIALESTOQUE INT DECLARE @INTEGRADOAUTOMACAO SMALLINT DECLARE @INTEGRAAPLICACAO CHAR(1) DECLARE @DATALANCAMENTO DATETIME DECLARE @USARATEIOVALORFIN SMALLINT DECLARE @SALDO RMDVALOR4 DECLARE @CODPRD VARCHAR(30) SET @SERIE = 'SEXP' SET @DATASEMHORA = CONVERT(VARCHAR,GETDATE(),112) SET @DATACOMHORA = CONVERT(VARCHAR,GETDATE(),112) + ' ' + CONVERT(VARCHAR,GETDATE(),114) SELECT @IDMOV_ORIG = IDMOV, @CODCOLIGADA = CODCOLIGADA, @CODFILIAL = CODFILIAL, @CODLOC = CODLOC, @TIPO = 'A', @STATUS = 'N', @DATAEMISSAO = @DATASEMHORA, @DATAEXTRA1 = @DATASEMHORA, @CODCPG = CODCPG, @OBSERVACAO = OBSERVACAO, @CODMOEVALORLIQUIDO = CODMOEVALORLIQUIDO, @DATAMOVIMENTO = @DATASEMHORA, @FRETECIFOUFOB = FRETECIFOUFOB, @CODCCUSTO = CODCCUSTO, @CODVEN1 = CODVEN1, @CODCOLCFO = CODCOLCFO, @CODCOLCXA = CODCOLCXA, @GERADOPORLOTE = GERADOPORLOTE, @STATUSEXPORTCONT = 0, @CAMPOLIVRE2 = CAMPOLIVRE2, @GEROUCONTATRABALHO = 0, @GERADOPORCONTATRABALHO = 0, @HORULTIMAALTERACAO = @DATACOMHORA, @INDUSOOBJ = 0, @INTEGRADOBONUM = 0, @HORARIOEMISSAO = @DATACOMHORA, @DATACRIACAO = @DATASEMHORA, @VINCULADOESTOQUEFL = 0, @CONTORCAMENTOANTIGO = 0, @DATACONTABILIZACAO = @DATASEMHORA, @SEQUENCIALESTOQUE = SEQUENCIALESTOQUE, @INTEGRADOAUTOMACAO = 0, @INTEGRAAPLICACAO = 'T', @DATALANCAMENTO = @DATASEMHORA, @USARATEIOVALORFIN = USARATEIOVALORFIN FROM INSERTED --VALIDAÇÃO DECLARE ITENS_VALIDA CURSOR FOR SELECT IDPRD, QUANTIDADE, CODUND FROM TITMMOV WHERE CODCOLIGADA = 1 AND IDMOV = @IDMOV_ORIG DECLARE @MENSAGEM VARCHAR(1000) DECLARE @IDPRD_CUR_V INT DECLARE @QUANTIDADE_CUR_V INT DECLARE @CODUND_CUR_V VARCHAR(5) DECLARE @IDPRD_COM_V INT DECLARE @QUANTIDADE_COM_V INT DECLARE @CODUND_COM_V VARCHAR(5) DECLARE @CUSTOMEDIO_COM_V MONEY OPEN ITENS_VALIDA FETCH NEXT FROM ITENS_VALIDA INTO @IDPRD_CUR_V, @QUANTIDADE_CUR_V, @CODUND_CUR_V WHILE @@FETCH_STATUS = 0 BEGIN IF (SELECT COUNT(1) FROM TPRDCOMPOSTO WHERE CODCOLIGADA = 1 AND IDPRD = @IDPRD_CUR_V) = 0 BEGIN SET @ERRO = 1 SET @MENSAGEM = 'Esta NF possui itens não compostos (fazer baixa manual)' CLOSE ITENS_VALIDA DEALLOCATE ITENS_VALIDA GOTO ERRO_VALIDA END ELSE BEGIN DECLARE COMPOSTO_VALIDA CURSOR FOR SELECT C.IDPRDCOMPONENTE, C.QUANTIDADE, T.CODUNDCONTROLE , T.CUSTOMEDIO FROM TPRDCOMPOSTO C INNER JOIN TPRD T ON T.IDPRD = C.IDPRDCOMPONENTE WHERE C.IDPRD = @IDPRD_CUR_V OPEN COMPOSTO_VALIDA FETCH NEXT FROM COMPOSTO_VALIDA INTO @IDPRD_COM_V, @QUANTIDADE_COM_V, @CODUND_COM_V, @CUSTOMEDIO_COM_V WHILE @@FETCH_STATUS = 0 BEGIN SELECT @SALDO=TPRD.SALDOGERALFISICO, @CODPRD=TPRD.CODIGOPRD FROM TPRD WHERE IDPRD = @IDPRD_COM_V IF (@SALDO) < (@QUANTIDADE_COM_V * @QUANTIDADE_CUR_V) BEGIN SET @ERRO = 2 SET @MENSAGEM = 'O produto ' + @CODPRD + ' não possui saldo suficiente' CLOSE COMPOSTO_VALIDA DEALLOCATE COMPOSTO_VALIDA CLOSE ITENS_VALIDA DEALLOCATE ITENS_VALIDA GOTO ERRO_VALIDA END IF ISNULL(@CUSTOMEDIO_COM_V,0) = 0 BEGIN SET @ERRO = 3 SET @MENSAGEM = 'O produto ' + @CODPRD + ' não possui custo médio cadastrado' CLOSE COMPOSTO_VALIDA DEALLOCATE COMPOSTO_VALIDA CLOSE ITENS_VALIDA DEALLOCATE ITENS_VALIDA GOTO ERRO_VALIDA END FETCH NEXT FROM COMPOSTO_VALIDA INTO @IDPRD_COM_V, @QUANTIDADE_COM_V, @CODUND_COM_V, @CUSTOMEDIO_COM_V END CLOSE COMPOSTO_VALIDA DEALLOCATE COMPOSTO_VALIDA END FETCH NEXT FROM ITENS_VALIDA INTO @IDPRD_CUR_V, @QUANTIDADE_CUR_V, @CODUND_CUR_V END CLOSE ITENS_VALIDA DEALLOCATE ITENS_VALIDA UPDATE GAUTOINC SET VALAUTOINC=VALAUTOINC+1 WHERE CODCOLIGADA=1 AND CODAUTOINC='IDMOV' SET @IDMOV = (SELECT VALAUTOINC FROM GAUTOINC WHERE CODCOLIGADA=1 AND CODAUTOINC='IDMOV') UPDATE GAUTOINC SET VALAUTOINC=VALAUTOINC+1 WHERE CODCOLIGADA=1 AND CODAUTOINC=@SERIE+'000001' SET @NUMEROMOV = right('000000' + CONVERT(VARCHAR,(SELECT VALAUTOINC FROM GAUTOINC WHERE CODCOLIGADA=1 AND CODAUTOINC=@SERIE+'000001')),6) INSERT INTO TMOV ( IDMOV, NUMEROMOV, CODCOLIGADA, CODFILIAL, CODLOC, SERIE, CODTMV, TIPO, STATUS, DATAEMISSAO, DATAEXTRA1, CODCPG, OBSERVACAO, CODMOEVALORLIQUIDO, DATAMOVIMENTO, FRETECIFOUFOB, CODCCUSTO, CODVEN1, CODCOLCFO, CODCOLCXA, GERADOPORLOTE, STATUSEXPORTCONT, CAMPOLIVRE2, GEROUCONTATRABALHO, GERADOPORCONTATRABALHO, HORULTIMAALTERACAO, INDUSOOBJ, INTEGRADOBONUM, HORARIOEMISSAO, DATACRIACAO, VINCULADOESTOQUEFL, CONTORCAMENTOANTIGO, DATACONTABILIZACAO, SEQUENCIALESTOQUE, INTEGRADOAUTOMACAO, INTEGRAAPLICACAO, DATALANCAMENTO, USARATEIOVALORFIN ) VALUES ( @IDMOV, @NUMEROMOV, @CODCOLIGADA, @CODFILIAL, @CODLOC, @SERIE, @CODTMV, @TIPO, @STATUS, @DATAEMISSAO, @DATAEXTRA1, @CODCPG, @OBSERVACAO, @CODMOEVALORLIQUIDO, @DATAMOVIMENTO, @FRETECIFOUFOB, @CODCCUSTO, @CODVEN1, @CODCOLCFO, @CODCOLCXA, @GERADOPORLOTE, @STATUSEXPORTCONT, @CAMPOLIVRE2, @GEROUCONTATRABALHO, @GERADOPORCONTATRABALHO, @HORULTIMAALTERACAO, @INDUSOOBJ, @INTEGRADOBONUM, @HORARIOEMISSAO, @DATACRIACAO, @VINCULADOESTOQUEFL, @CONTORCAMENTOANTIGO, @DATACONTABILIZACAO, @SEQUENCIALESTOQUE, @INTEGRADOAUTOMACAO, @INTEGRAAPLICACAO, @DATALANCAMENTO, @USARATEIOVALORFIN ) INSERT INTO TMOVHISTORICO ( CODCOLIGADA, IDMOV, HISTORICOCURTO ) VALUES ( @CODCOLIGADA, @IDMOV, 'BAIXA' ) DECLARE @IDMOVDESTINO INT DECLARE @CODCOLDESTINO INT DECLARE @IDPROCESSO INT SELECT @IDMOVDESTINO = IDMOVDESTINO, @CODCOLDESTINO = CODCOLDESTINO FROM TMOVRELAC WHERE IDMOVDESTINO = @IDMOV_ORIG UPDATE GAUTOINC SET VALAUTOINC=VALAUTOINC+1 WHERE CODCOLIGADA=1 AND CODAUTOINC='IDPROCESSOFAT' SET @IDPROCESSO = (SELECT VALAUTOINC FROM GAUTOINC WHERE CODCOLIGADA=1 AND CODAUTOINC='IDPROCESSOFAT') INSERT INTO TMOVRELAC VALUES ( @IDMOVDESTINO, @CODCOLDESTINO, @IDMOV, @CODCOLIGADA, 'P', @IDPROCESSO ) DECLARE ITENS CURSOR FOR SELECT IDPRD, QUANTIDADE, CODUND, NSEQITMMOV FROM TITMMOV WHERE IDMOV = @IDMOV_ORIG DECLARE @SEQ INT DECLARE @SEQUENCIA_CUR INT DECLARE @IDPRD_CUR INT DECLARE @QUANTIDADE_CUR INT DECLARE @CODUND_CUR VARCHAR(5) DECLARE @IDPRD_COM INT DECLARE @QUANTIDADE_COM INT DECLARE @CODUND_COM VARCHAR(5) DECLARE @CUSTOMEDIO_COM MONEY DECLARE @VALOR_GERAL MONEY DECLARE @QUANTIDADE_SOBRA INT DECLARE @IDLOTE INT DECLARE @QUANTIDADE_LOTE INT DECLARE @QUANTIDADE_B_LOTE INT SET @SEQ = 0 SET @VALOR_GERAL = 0 OPEN ITENS FETCH NEXT FROM ITENS INTO @IDPRD_CUR, @QUANTIDADE_CUR, @CODUND_CUR, @SEQUENCIA_CUR WHILE @@FETCH_STATUS = 0 BEGIN IF (SELECT COUNT(1) FROM TPRDCOMPOSTO WHERE IDPRD = @IDPRD_CUR) > 0 BEGIN DECLARE COMPOSTO CURSOR FOR SELECT C.IDPRDCOMPONENTE, C.QUANTIDADE, T.CODUNDCONTROLE , T.CUSTOMEDIO FROM TPRDCOMPOSTO C INNER JOIN TPRD T ON T.IDPRD = C.IDPRDCOMPONENTE WHERE C.IDPRD = @IDPRD_CUR OPEN COMPOSTO FETCH NEXT FROM COMPOSTO INTO @IDPRD_COM, @QUANTIDADE_COM, @CODUND_COM, @CUSTOMEDIO_COM WHILE @@FETCH_STATUS = 0 BEGIN SET @SEQ = @SEQ + 1 INSERT INTO TITMMOV (CODCOLIGADA, IDMOV, NSEQITMMOV, NUMEROSEQUENCIAL, IDPRD, QUANTIDADE, PRECOUNITARIO, CODUND, CAMPOLIVRE ) VALUES ( @CODCOLIGADA, @IDMOV, @SEQ, @SEQ, @IDPRD_COM, (@QUANTIDADE_COM*@QUANTIDADE_CUR), @CUSTOMEDIO_COM, @CODUND_COM , CONVERT(VARCHAR(15),@SEQUENCIA_CUR) ) SET @QUANTIDADE_SOBRA = (@QUANTIDADE_COM*@QUANTIDADE_CUR) UPDATE TPRDLOC SET SALDOFISICO2 = SALDOFISICO2 - @QUANTIDADE_SOBRA, SALDOFISICO5 = SALDOFISICO5 - @QUANTIDADE_SOBRA, SALDOFINANCEIRO2 = SALDOFINANCEIRO2 - (@QUANTIDADE_SOBRA * @CUSTOMEDIO_COM) WHERE CODLOC = '01' AND IDPRD = @IDPRD_COM SET @QUANTIDADE_B_LOTE = 0 WHILE (@QUANTIDADE_SOBRA > 0) BEGIN SELECT @IDLOTE=IDLOTE, @QUANTIDADE_LOTE=SALDOFISICO2 FROM TLOTEPRDLOC WHERE IDPRD = @IDPRD_COM AND SALDOFISICO2 <> 0 AND CODLOC = '01' AND IDLOTE = (SELECT MIN(IDLOTE) FROM TLOTEPRDLOC WHERE IDPRD = @IDPRD_COM AND SALDOFISICO2 <> 0 AND CODLOC = '01') ORDER BY IDLOTE IF @QUANTIDADE_LOTE <= @QUANTIDADE_SOBRA BEGIN SET @QUANTIDADE_SOBRA = @QUANTIDADE_SOBRA - @QUANTIDADE_LOTE SET @QUANTIDADE_B_LOTE = @QUANTIDADE_LOTE UPDATE TLOTEPRDLOC SET SALDOFISICO2 = 0, SALDOFISICO5 = 0 WHERE IDLOTE = @IDLOTE END ELSE BEGIN UPDATE TLOTEPRDLOC SET SALDOFISICO2 = SALDOFISICO2 - @QUANTIDADE_SOBRA, SALDOFISICO5 = SALDOFISICO5 - @QUANTIDADE_SOBRA WHERE IDLOTE = @IDLOTE SET @QUANTIDADE_B_LOTE = @QUANTIDADE_SOBRA SET @QUANTIDADE_SOBRA = 0 END INSERT INTO TITMLOTEPRD (CODCOLIGADA, IDMOV, NSEQITMMOV, IDLOTE, QUANTIDADE2, QUANTIDADEARECEBER) VALUES (@CODCOLIGADA, @IDMOV, @SEQ, @IDLOTE, (@QUANTIDADE_B_LOTE)*-1, (@QUANTIDADE_B_LOTE)*-1) END SET @VALOR_GERAL = @VALOR_GERAL + (@CUSTOMEDIO_COM*(@QUANTIDADE_COM*@QUANTIDADE_CUR)) UPDATE TPRD SET SALDOGERALFISICO = SALDOGERALFISICO - (@QUANTIDADE_COM*@QUANTIDADE_CUR) WHERE IDPRD = @IDPRD_COM FETCH NEXT FROM COMPOSTO INTO @IDPRD_COM, @QUANTIDADE_COM, @CODUND_COM, @CUSTOMEDIO_COM END CLOSE COMPOSTO DEALLOCATE COMPOSTO END FETCH NEXT FROM ITENS INTO @IDPRD_CUR, @QUANTIDADE_CUR, @CODUND_CUR, @SEQUENCIA_CUR END CLOSE ITENS DEALLOCATE ITENS UPDATE TMOV SET VALORBRUTO = @VALOR_GERAL, VALORLIQUIDO = @VALOR_GERAL, VALOROUTROS = @VALOR_GERAL WHERE IDMOV = @IDMOV ENDENDERRO_VALIDA:IF @ENTROU = 1 BEGIN IF @ERRO <> 0 BEGIN INSERT INTO TB_LOG_AUXRM VALUES (@NM_NOVO, NULL, 'E',@MENSAGEM,@DATACOMHORA) END ELSE BEGIN INSERT INTO TB_LOG_AUXRM VALUES (@NM_NOVO, @NUMEROMOV, 'O','',@DATACOMHORA) INSERT INTO TB_RELAC_AUXRM VALUES(@IDMOV_ORIG,@IDMOV) END END SET NOCOUNT OFFSET ANSI_NULLS OFFSET ANSI_WARNINGS ON----ValeuNIK Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Setembro 29, 2010 Denunciar Share Postado Setembro 29, 2010 Bom dia NIK, A sua estrutura está ok... apenas a variável @PASSO não está sendo utilizada. Como o erro é esporádico, o que pode estar ocorrendo pode estar relacionado com a estrutura de tratamento de erro. A sintaxe GOTO não é muito recomendada... rs. Prefira sempre utilizar o TRY/CATCH (igual a estrutura de OO). Mude a estrutura retirando o GOTO e colocando TRY/CATCH. O erro pode estar aparecendo em decorrência do "pulo" que o sql utiliza na sintaxe do GOTO. A execução pode entrar em um bloco com BEGIN, depois de um erro, ir para o tratamento de erro e o sql não encontrar nenhum END para fechar o bloco. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
NIK
Pessoal... bom dia
Tenho uma trigger que trabalha dentro de uma tabela a partir do momento que existe uma inserção de um tipo de registro.
Até ai tudo bem, porém, muito de vez enquando ao executar acontece o seguinte erro:
No user transaction is currently in progress.
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Alguém sabe em que momento ou porque acontece esse erro...
O que me intriga é que não é sempre e sim de vez enquando.
Irei colocar a trigger aqui, mas aviso que ela é gigante...
----
CREATE TRIGGER TR_AUXRM_BAIXA_ESTOQUE
ON TMOV
FOR UPDATE
AS
DECLARE @ERRO INT
DECLARE @PASSO INT
DECLARE @NM_ANTIGO VARCHAR(15)
DECLARE @NM_NOVO VARCHAR(15)
DECLARE @CODTMV VARCHAR(10)
DECLARE @ENTROU INT
SET @ENTROU = 0
IF (
SELECT COUNT(1) FROM INSERTED
WHERE CODCOLIGADA = 01 AND
((CODTMV IN ('2.2.01','2.2.15','2.2.19','2.2.12','2.2.21'))
OR (CODTMV = '2.1.06' AND CAMPOLIVRE3 LIKE '%999'))
) > 0
BEGIN
SET @NM_ANTIGO = (SELECT NUMEROMOV FROM DELETED)
SET @NM_NOVO = (SELECT NUMEROMOV FROM INSERTED)
SET @CODTMV = (SELECT CASE WHEN CODTMV = '2.2.01' THEN '2.1.05'
WHEN CODTMV = '2.2.15' THEN '2.1.07'
WHEN CODTMV = '2.1.06' THEN '2.1.08' ELSE '2.1.09' END AS RESULT FROM INSERTED)
IF @NM_ANTIGO <> @NM_NOVO
BEGIN
SET @ENTROU = 1
DECLARE @IDMOV INT
DECLARE @IDMOV_ORIG INT
DECLARE @NUMEROMOV VARCHAR(15)
DECLARE @DATASEMHORA DATETIME
DECLARE @DATACOMHORA DATETIME
DECLARE @CODCOLIGADA INT
DECLARE @CODFILIAL SMALLINT
DECLARE @CODLOC VARCHAR(15)
DECLARE @SERIE VARCHAR(8)
DECLARE @TIPO VARCHAR(1)
DECLARE @STATUS VARCHAR(1)
DECLARE @DATAEMISSAO DATETIME
DECLARE @DATAEXTRA1 DATETIME
DECLARE @CODCPG VARCHAR(5)
DECLARE @OBSERVACAO VARCHAR(60)
DECLARE @CODMOEVALORLIQUIDO VARCHAR(10)
DECLARE @DATAMOVIMENTO DATETIME
DECLARE @FRETECIFOUFOB SMALLINT
DECLARE @CODCCUSTO VARCHAR(25)
DECLARE @CODVEN1 VARCHAR(16)
DECLARE @CODCOLCFO SMALLINT
DECLARE @CODCOLCXA SMALLINT
DECLARE @GERADOPORLOTE SMALLINT
DECLARE @STATUSEXPORTCONT SMALLINT
DECLARE @CAMPOLIVRE2 VARCHAR(100)
DECLARE @GEROUCONTATRABALHO SMALLINT
DECLARE @GERADOPORCONTATRABALHO SMALLINT
DECLARE @HORULTIMAALTERACAO DATETIME
DECLARE @INDUSOOBJ RMDVALOR2
DECLARE @INTEGRADOBONUM SMALLINT
DECLARE @HORARIOEMISSAO DATETIME
DECLARE @DATACRIACAO DATETIME
DECLARE @VINCULADOESTOQUEFL SMALLINT
DECLARE @CONTORCAMENTOANTIGO SMALLINT
DECLARE @DATACONTABILIZACAO DATETIME
DECLARE @SEQUENCIALESTOQUE INT
DECLARE @INTEGRADOAUTOMACAO SMALLINT
DECLARE @INTEGRAAPLICACAO CHAR(1)
DECLARE @DATALANCAMENTO DATETIME
DECLARE @USARATEIOVALORFIN SMALLINT
DECLARE @SALDO RMDVALOR4
DECLARE @CODPRD VARCHAR(30)
SET @SERIE = 'SEXP'
SET @DATASEMHORA = CONVERT(VARCHAR,GETDATE(),112)
SET @DATACOMHORA = CONVERT(VARCHAR,GETDATE(),112) + ' ' + CONVERT(VARCHAR,GETDATE(),114)
SELECT
@IDMOV_ORIG = IDMOV,
@CODCOLIGADA = CODCOLIGADA,
@CODFILIAL = CODFILIAL,
@CODLOC = CODLOC,
@TIPO = 'A',
@STATUS = 'N',
@DATAEMISSAO = @DATASEMHORA,
@DATAEXTRA1 = @DATASEMHORA,
@CODCPG = CODCPG,
@OBSERVACAO = OBSERVACAO,
@CODMOEVALORLIQUIDO = CODMOEVALORLIQUIDO,
@DATAMOVIMENTO = @DATASEMHORA,
@FRETECIFOUFOB = FRETECIFOUFOB,
@CODCCUSTO = CODCCUSTO,
@CODVEN1 = CODVEN1,
@CODCOLCFO = CODCOLCFO,
@CODCOLCXA = CODCOLCXA,
@GERADOPORLOTE = GERADOPORLOTE,
@STATUSEXPORTCONT = 0,
@CAMPOLIVRE2 = CAMPOLIVRE2,
@GEROUCONTATRABALHO = 0,
@GERADOPORCONTATRABALHO = 0,
@HORULTIMAALTERACAO = @DATACOMHORA,
@INDUSOOBJ = 0,
@INTEGRADOBONUM = 0,
@HORARIOEMISSAO = @DATACOMHORA,
@DATACRIACAO = @DATASEMHORA,
@VINCULADOESTOQUEFL = 0,
@CONTORCAMENTOANTIGO = 0,
@DATACONTABILIZACAO = @DATASEMHORA,
@SEQUENCIALESTOQUE = SEQUENCIALESTOQUE,
@INTEGRADOAUTOMACAO = 0,
@INTEGRAAPLICACAO = 'T',
@DATALANCAMENTO = @DATASEMHORA,
@USARATEIOVALORFIN = USARATEIOVALORFIN
FROM INSERTED
--VALIDAÇÃO
DECLARE ITENS_VALIDA CURSOR
FOR
SELECT IDPRD, QUANTIDADE, CODUND FROM TITMMOV WHERE CODCOLIGADA = 1 AND IDMOV = @IDMOV_ORIG
DECLARE @MENSAGEM VARCHAR(1000)
DECLARE @IDPRD_CUR_V INT
DECLARE @QUANTIDADE_CUR_V INT
DECLARE @CODUND_CUR_V VARCHAR(5)
DECLARE @IDPRD_COM_V INT
DECLARE @QUANTIDADE_COM_V INT
DECLARE @CODUND_COM_V VARCHAR(5)
DECLARE @CUSTOMEDIO_COM_V MONEY
OPEN ITENS_VALIDA
FETCH NEXT FROM ITENS_VALIDA
INTO @IDPRD_CUR_V, @QUANTIDADE_CUR_V, @CODUND_CUR_V
WHILE @@FETCH_STATUS = 0
BEGIN
IF (SELECT COUNT(1) FROM TPRDCOMPOSTO WHERE CODCOLIGADA = 1 AND IDPRD = @IDPRD_CUR_V) = 0
BEGIN
SET @ERRO = 1
SET @MENSAGEM = 'Esta NF possui itens não compostos (fazer baixa manual)'
CLOSE ITENS_VALIDA
DEALLOCATE ITENS_VALIDA
GOTO ERRO_VALIDA
END
ELSE
BEGIN
DECLARE COMPOSTO_VALIDA CURSOR
FOR
SELECT C.IDPRDCOMPONENTE, C.QUANTIDADE, T.CODUNDCONTROLE , T.CUSTOMEDIO
FROM TPRDCOMPOSTO C
INNER JOIN TPRD T ON T.IDPRD = C.IDPRDCOMPONENTE
WHERE C.IDPRD = @IDPRD_CUR_V
OPEN COMPOSTO_VALIDA
FETCH NEXT FROM COMPOSTO_VALIDA
INTO @IDPRD_COM_V, @QUANTIDADE_COM_V, @CODUND_COM_V, @CUSTOMEDIO_COM_V
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @SALDO=TPRD.SALDOGERALFISICO, @CODPRD=TPRD.CODIGOPRD
FROM TPRD
WHERE IDPRD = @IDPRD_COM_V
IF (@SALDO) < (@QUANTIDADE_COM_V * @QUANTIDADE_CUR_V)
BEGIN
SET @ERRO = 2
SET @MENSAGEM = 'O produto ' + @CODPRD + ' não possui saldo suficiente'
CLOSE COMPOSTO_VALIDA
DEALLOCATE COMPOSTO_VALIDA
CLOSE ITENS_VALIDA
DEALLOCATE ITENS_VALIDA
GOTO ERRO_VALIDA
END
IF ISNULL(@CUSTOMEDIO_COM_V,0) = 0
BEGIN
SET @ERRO = 3
SET @MENSAGEM = 'O produto ' + @CODPRD + ' não possui custo médio cadastrado'
CLOSE COMPOSTO_VALIDA
DEALLOCATE COMPOSTO_VALIDA
CLOSE ITENS_VALIDA
DEALLOCATE ITENS_VALIDA
GOTO ERRO_VALIDA
END
FETCH NEXT FROM COMPOSTO_VALIDA
INTO @IDPRD_COM_V, @QUANTIDADE_COM_V, @CODUND_COM_V, @CUSTOMEDIO_COM_V
END
CLOSE COMPOSTO_VALIDA
DEALLOCATE COMPOSTO_VALIDA
END
FETCH NEXT FROM ITENS_VALIDA
INTO @IDPRD_CUR_V, @QUANTIDADE_CUR_V, @CODUND_CUR_V
END
CLOSE ITENS_VALIDA
DEALLOCATE ITENS_VALIDA
UPDATE GAUTOINC SET VALAUTOINC=VALAUTOINC+1 WHERE CODCOLIGADA=1 AND CODAUTOINC='IDMOV'
SET @IDMOV = (SELECT VALAUTOINC FROM GAUTOINC WHERE CODCOLIGADA=1 AND CODAUTOINC='IDMOV')
UPDATE GAUTOINC SET VALAUTOINC=VALAUTOINC+1 WHERE CODCOLIGADA=1 AND CODAUTOINC=@SERIE+'000001'
SET @NUMEROMOV = right('000000' + CONVERT(VARCHAR,(SELECT VALAUTOINC FROM GAUTOINC WHERE CODCOLIGADA=1 AND CODAUTOINC=@SERIE+'000001')),6)
INSERT INTO TMOV
(
IDMOV,
NUMEROMOV,
CODCOLIGADA,
CODFILIAL,
CODLOC,
SERIE,
CODTMV,
TIPO,
STATUS,
DATAEMISSAO,
DATAEXTRA1,
CODCPG,
OBSERVACAO,
CODMOEVALORLIQUIDO,
DATAMOVIMENTO,
FRETECIFOUFOB,
CODCCUSTO,
CODVEN1,
CODCOLCFO,
CODCOLCXA,
GERADOPORLOTE,
STATUSEXPORTCONT,
CAMPOLIVRE2,
GEROUCONTATRABALHO,
GERADOPORCONTATRABALHO,
HORULTIMAALTERACAO,
INDUSOOBJ,
INTEGRADOBONUM,
HORARIOEMISSAO,
DATACRIACAO,
VINCULADOESTOQUEFL,
CONTORCAMENTOANTIGO,
DATACONTABILIZACAO,
SEQUENCIALESTOQUE,
INTEGRADOAUTOMACAO,
INTEGRAAPLICACAO,
DATALANCAMENTO,
USARATEIOVALORFIN
)
VALUES
(
@IDMOV,
@NUMEROMOV,
@CODCOLIGADA,
@CODFILIAL,
@CODLOC,
@SERIE,
@CODTMV,
@TIPO,
@STATUS,
@DATAEMISSAO,
@DATAEXTRA1,
@CODCPG,
@OBSERVACAO,
@CODMOEVALORLIQUIDO,
@DATAMOVIMENTO,
@FRETECIFOUFOB,
@CODCCUSTO,
@CODVEN1,
@CODCOLCFO,
@CODCOLCXA,
@GERADOPORLOTE,
@STATUSEXPORTCONT,
@CAMPOLIVRE2,
@GEROUCONTATRABALHO,
@GERADOPORCONTATRABALHO,
@HORULTIMAALTERACAO,
@INDUSOOBJ,
@INTEGRADOBONUM,
@HORARIOEMISSAO,
@DATACRIACAO,
@VINCULADOESTOQUEFL,
@CONTORCAMENTOANTIGO,
@DATACONTABILIZACAO,
@SEQUENCIALESTOQUE,
@INTEGRADOAUTOMACAO,
@INTEGRAAPLICACAO,
@DATALANCAMENTO,
@USARATEIOVALORFIN
)
INSERT INTO TMOVHISTORICO
(
CODCOLIGADA,
IDMOV,
HISTORICOCURTO
)
VALUES
(
@CODCOLIGADA,
@IDMOV,
'BAIXA'
)
DECLARE @IDMOVDESTINO INT
DECLARE @CODCOLDESTINO INT
DECLARE @IDPROCESSO INT
SELECT
@IDMOVDESTINO = IDMOVDESTINO,
@CODCOLDESTINO = CODCOLDESTINO
FROM
TMOVRELAC
WHERE
IDMOVDESTINO = @IDMOV_ORIG
UPDATE GAUTOINC SET VALAUTOINC=VALAUTOINC+1 WHERE CODCOLIGADA=1 AND CODAUTOINC='IDPROCESSOFAT'
SET @IDPROCESSO = (SELECT VALAUTOINC FROM GAUTOINC WHERE CODCOLIGADA=1 AND CODAUTOINC='IDPROCESSOFAT')
INSERT INTO TMOVRELAC VALUES
(
@IDMOVDESTINO,
@CODCOLDESTINO,
@IDMOV,
@CODCOLIGADA,
'P',
@IDPROCESSO
)
DECLARE ITENS CURSOR
FOR
SELECT IDPRD, QUANTIDADE, CODUND, NSEQITMMOV FROM TITMMOV WHERE IDMOV = @IDMOV_ORIG
DECLARE @SEQ INT
DECLARE @SEQUENCIA_CUR INT
DECLARE @IDPRD_CUR INT
DECLARE @QUANTIDADE_CUR INT
DECLARE @CODUND_CUR VARCHAR(5)
DECLARE @IDPRD_COM INT
DECLARE @QUANTIDADE_COM INT
DECLARE @CODUND_COM VARCHAR(5)
DECLARE @CUSTOMEDIO_COM MONEY
DECLARE @VALOR_GERAL MONEY
DECLARE @QUANTIDADE_SOBRA INT
DECLARE @IDLOTE INT
DECLARE @QUANTIDADE_LOTE INT
DECLARE @QUANTIDADE_B_LOTE INT
SET @SEQ = 0
SET @VALOR_GERAL = 0
OPEN ITENS
FETCH NEXT FROM ITENS
INTO @IDPRD_CUR, @QUANTIDADE_CUR, @CODUND_CUR, @SEQUENCIA_CUR
WHILE @@FETCH_STATUS = 0
BEGIN
IF (SELECT COUNT(1) FROM TPRDCOMPOSTO WHERE IDPRD = @IDPRD_CUR) > 0
BEGIN
DECLARE COMPOSTO CURSOR
FOR
SELECT C.IDPRDCOMPONENTE, C.QUANTIDADE, T.CODUNDCONTROLE , T.CUSTOMEDIO
FROM TPRDCOMPOSTO C
INNER JOIN TPRD T ON T.IDPRD = C.IDPRDCOMPONENTE
WHERE C.IDPRD = @IDPRD_CUR
OPEN COMPOSTO
FETCH NEXT FROM COMPOSTO
INTO @IDPRD_COM, @QUANTIDADE_COM, @CODUND_COM, @CUSTOMEDIO_COM
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SEQ = @SEQ + 1
INSERT INTO TITMMOV
(CODCOLIGADA,
IDMOV,
NSEQITMMOV,
NUMEROSEQUENCIAL,
IDPRD,
QUANTIDADE,
PRECOUNITARIO,
CODUND,
CAMPOLIVRE
)
VALUES
(
@CODCOLIGADA,
@IDMOV,
@SEQ,
@SEQ,
@IDPRD_COM,
(@QUANTIDADE_COM*@QUANTIDADE_CUR),
@CUSTOMEDIO_COM,
@CODUND_COM ,
CONVERT(VARCHAR(15),@SEQUENCIA_CUR)
)
SET @QUANTIDADE_SOBRA = (@QUANTIDADE_COM*@QUANTIDADE_CUR)
UPDATE TPRDLOC
SET SALDOFISICO2 = SALDOFISICO2 - @QUANTIDADE_SOBRA,
SALDOFISICO5 = SALDOFISICO5 - @QUANTIDADE_SOBRA,
SALDOFINANCEIRO2 = SALDOFINANCEIRO2 - (@QUANTIDADE_SOBRA * @CUSTOMEDIO_COM)
WHERE CODLOC = '01' AND IDPRD = @IDPRD_COM
SET @QUANTIDADE_B_LOTE = 0
WHILE (@QUANTIDADE_SOBRA > 0)
BEGIN
SELECT @IDLOTE=IDLOTE, @QUANTIDADE_LOTE=SALDOFISICO2 FROM TLOTEPRDLOC WHERE IDPRD = @IDPRD_COM AND SALDOFISICO2 <> 0 AND CODLOC = '01'
AND IDLOTE = (SELECT MIN(IDLOTE) FROM TLOTEPRDLOC WHERE IDPRD = @IDPRD_COM AND SALDOFISICO2 <> 0 AND CODLOC = '01') ORDER BY IDLOTE
IF @QUANTIDADE_LOTE <= @QUANTIDADE_SOBRA
BEGIN
SET @QUANTIDADE_SOBRA = @QUANTIDADE_SOBRA - @QUANTIDADE_LOTE
SET @QUANTIDADE_B_LOTE = @QUANTIDADE_LOTE
UPDATE TLOTEPRDLOC SET SALDOFISICO2 = 0, SALDOFISICO5 = 0 WHERE IDLOTE = @IDLOTE
END
ELSE
BEGIN
UPDATE TLOTEPRDLOC SET SALDOFISICO2 = SALDOFISICO2 - @QUANTIDADE_SOBRA, SALDOFISICO5 = SALDOFISICO5 - @QUANTIDADE_SOBRA WHERE IDLOTE = @IDLOTE
SET @QUANTIDADE_B_LOTE = @QUANTIDADE_SOBRA
SET @QUANTIDADE_SOBRA = 0
END
INSERT INTO TITMLOTEPRD (CODCOLIGADA, IDMOV, NSEQITMMOV, IDLOTE, QUANTIDADE2, QUANTIDADEARECEBER)
VALUES (@CODCOLIGADA, @IDMOV, @SEQ, @IDLOTE, (@QUANTIDADE_B_LOTE)*-1, (@QUANTIDADE_B_LOTE)*-1)
END
SET @VALOR_GERAL = @VALOR_GERAL + (@CUSTOMEDIO_COM*(@QUANTIDADE_COM*@QUANTIDADE_CUR))
UPDATE TPRD
SET SALDOGERALFISICO = SALDOGERALFISICO - (@QUANTIDADE_COM*@QUANTIDADE_CUR)
WHERE IDPRD = @IDPRD_COM
FETCH NEXT FROM COMPOSTO
INTO @IDPRD_COM, @QUANTIDADE_COM, @CODUND_COM, @CUSTOMEDIO_COM
END
CLOSE COMPOSTO
DEALLOCATE COMPOSTO
END
FETCH NEXT FROM ITENS
INTO @IDPRD_CUR, @QUANTIDADE_CUR, @CODUND_CUR, @SEQUENCIA_CUR
END
CLOSE ITENS
DEALLOCATE ITENS
UPDATE TMOV
SET VALORBRUTO = @VALOR_GERAL, VALORLIQUIDO = @VALOR_GERAL, VALOROUTROS = @VALOR_GERAL
WHERE IDMOV = @IDMOV
END
END
ERRO_VALIDA:
IF @ENTROU = 1
BEGIN
IF @ERRO <> 0
BEGIN
INSERT INTO TB_LOG_AUXRM VALUES (@NM_NOVO, NULL, 'E',@MENSAGEM,@DATACOMHORA)
END
ELSE
BEGIN
INSERT INTO TB_LOG_AUXRM VALUES (@NM_NOVO, @NUMEROMOV, 'O','',@DATACOMHORA)
INSERT INTO TB_RELAC_AUXRM VALUES(@IDMOV_ORIG,@IDMOV)
END
END
SET NOCOUNT OFF
SET ANSI_NULLS OFF
SET ANSI_WARNINGS ON
----
Valeu
NIK
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.