Usuário com melhor resposta
Incrementando com cursor e Trigger

Pergunta
-
Boa tarde Pessoal.
Fiz uma trigger utilizando um cursor para que insira em coluna de uma tabela um número sequencial, que irá incrementar a cada execução, mas o resultado não incrementa, sempre pega o primeiro resultado e repete para os próximos, agradeço se puderem me ajudar. Segue Código:
CREATE TRIGGER [dbo].[tr_ALTERANOTAPROMISSORIA]
ON [dbo].[XVENDAPARCELA]
FOR INSERT
AS
BEGIN
DECLARE @COLIGADA AS INT, @VENDA AS INT, @GRUPO AS INT,@TIPO AS INT, @PARCELA AS INT, @CONT AS INT
SET @CONT = (SELECT ISNULL(Z1.PARCELA - 1,0)
FROM
INSERTED
LEFT JOIN ZMDSEQUENCIAL AS Z1 ON
inserted.CODCOLIGADA = Z1.CODCOLIGADA
AND inserted.NUMVENDA = Z1.VENDA
AND inserted.CODGRUPO = Z1.GRUPO
AND inserted.CODTIPOPARC = Z1.TIPO)
DECLARE AlteraParcela Cursor FOR
SELECT
inserted.CODCOLIGADA,
inserted.NUMVENDA,
inserted.CODGRUPO,
inserted.CODTIPOPARC,
inserted.NUMPARC
FROM
INSERTED
ORDER BY
inserted.CODCOLIGADA, inserted.NUMVENDA, inserted.CODGRUPO, inserted.CODTIPOPARC, inserted.NUMPARC
OPEN AlteraParcela
FETCH NEXT FROM AlteraParcela INTO @COLIGADA, @VENDA, @GRUPO, @TIPO, @PARCELA
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@CONT > 0)
BEGIN
SET @CONT = @CONT + 1
INSERT INTO ZMDNUMPARCELA
SELECT
X1.CODCOLIGADA,
X1.NUMVENDA,
X1.CODGRUPO,
X1.CODTIPOPARC,
X1.NUMPARC,
@CONT
FROM
XVENDAPARCELA AS X1
WHERE
X1.CODCOLIGADA = @COLIGADA
AND X1.NUMVENDA = @VENDA
AND X1.CODGRUPO = @GRUPO
AND X1.CODTIPOPARC = @TIPO
AND X1.NUMPARC = @PARCELA
END
FETCH NEXT FROM AlteraParcela INTO @COLIGADA, @VENDA, @GRUPO, @TIPO, @PARCELA
END
CLOSE AlteraParcela
DEALLOCATE AlteraParcela
END
- Editado Douglas_Amaral quarta-feira, 15 de março de 2017 19:01 Código errado
Respostas
-
O valor da variável não vai persistir. Cada vez que a trigger for disparada o código será executado a partir do início e a variável será inicializada novamente.
Não conheço a estrutura do seu banco de dados, mas se a tabela ZMDSEQUENCIAL foi criada para armazenar a última sequência inserida acho que está faltando dar um Update nessa tabela para atualizar a coluna Parcela com o novo valor que foi gerado.
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Sugerido como Resposta Robson William Silva sexta-feira, 17 de março de 2017 12:34
- Marcado como Resposta Robson William Silva sexta-feira, 17 de março de 2017 12:35
Todas as Respostas
-
Boa tarde,
Pelo que entendi, a variável utilizada para a sequência (@Cont) é inicializada com um valor da tabela ZMDSEQUENCIAL, e pelo que vi esse valor não é atualizado nesse trecho de código, então o valor a princípio será o mesmo na próxima vez que for executado, caso não seja atualizado em outro processo.
Desconfio também que a sequência não será formada se o valor inicial que está na tabela for 1.
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
Boa tarde gapimex.
Qual trecho você se refere, Onde você fala "que esse valor não é atualizado nesse trecho de código"?
O Set @cont = @cont + 1 não resolveria?
Eu tentei setar o @cont manual = 1, para testar, mas mesmo assim os registros saem todos como 2.
-
Pelo que vi o valor da variável @Cont está sendo inicializado no trecho abaixo utilizando o valor da coluna Z1.Parcela:
SET @CONT = (SELECT ISNULL(Z1.PARCELA - 1,0) FROM INSERTED LEFT JOIN ZMDSEQUENCIAL AS Z1 ON inserted.CODCOLIGADA = Z1.CODCOLIGADA AND inserted.NUMVENDA = Z1.VENDA AND inserted.CODGRUPO = Z1.GRUPO AND inserted.CODTIPOPARC = Z1.TIPO)
Supondo que o valor de Z1.Parcela seja 10, @Cont será inicializada com 9.
Pelo que vi o valor de Z1.Parcela não é alterado no trecho de código que você postou, então o valor vai continuar igual a 10 e na próxima vez que a trigger for disparada @Cont será inicializada novamente com 9.
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
-
O valor da variável não vai persistir. Cada vez que a trigger for disparada o código será executado a partir do início e a variável será inicializada novamente.
Não conheço a estrutura do seu banco de dados, mas se a tabela ZMDSEQUENCIAL foi criada para armazenar a última sequência inserida acho que está faltando dar um Update nessa tabela para atualizar a coluna Parcela com o novo valor que foi gerado.
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Sugerido como Resposta Robson William Silva sexta-feira, 17 de março de 2017 12:34
- Marcado como Resposta Robson William Silva sexta-feira, 17 de março de 2017 12:35