none
Incrementando com cursor e Trigger RRS feed

  • 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
    quarta-feira, 15 de março de 2017 18:58

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

    quarta-feira, 15 de março de 2017 21:15

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

    quarta-feira, 15 de março de 2017 20:25
  • 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.

    quarta-feira, 15 de março de 2017 20:41
  • 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

    quarta-feira, 15 de março de 2017 20:56
  • Logo após o IF eu coloquei um @cont = @cont + 1, achei que essa seria a solução pelos exemplos que tenho pesquisado, mas acontece o que você falou mesmo, continua sempre inicializando com 10.
    quarta-feira, 15 de março de 2017 20:59
  • 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

    quarta-feira, 15 de março de 2017 21:15