Ir para conteúdo
Fórum Script Brasil
  • 0

Erro trigger


NIK

Pergunta

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

  • 0

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.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...