none
Oq q eu tô fazendo de errado no CURSOR? RRS feed

  • Pergunta

  •  

    Senhores bom dia,

     

    uso o SQLExpress em conjunto com o VS 2005 em C#, segue abaixo um cursor q escrevi para alterar o número dos ITENS na tabela de Itens de Cotação.

     

    ALTER TRIGGER [dbo].[TRG_NUMERO_ITEM_COTACAO_VENDA]
              ON  [dbo].[TBL_ITENS_COTACAO_VENDA]
       AFTER DELETE
    AS
     DECLARE @intCodigoCotacao bigint
     DECLARE @intCodigoItemCotacao bigint
     DECLARE @intNumeroItem bigint

     

     SET @intCodigoCotacao = (SELECT COT_VEN_CODIGO FROM DELETED)
     SET @intNumeroItem = 1

     

     DECLARE CRS_NUMERO_ITEM CURSOR FOR
      SELECT    
        ITE_COT_VEN_CODIGO
      FROM
        TBL_ITENS_COTACAO_VENDA
      WHERE
        COT_VEN_CODIGO = @intCodigoCotacao
      ORDER BY
        ITE_COT_VEN_CODIGO

     

     OPEN CRS_NUMERO_ITEM

     FETCH NEXT FROM CRS_NUMERO_ITEM INTO @intCodigoItemCotacao;
     WHILE @@FETCH_STATUS = 0
     BEGIN

      UPDATE
        TBL_ITENS_COTACAO_VENDA
      SET
        ITE_COT_VEN_CODIGO = @intNumeroItem
      WHERE
        ITE_COT_VEN_CODIGO = @intCodigoItemCotacao;
      
      SET @intNumeroItem = @intNumeroItem + 1;

      FETCH NEXT FROM CRS_NUMERO_ITEM INTO @intCodigoItemCotacao;
     END;
     CLOSE CRS_NUMERO_ITEM;
     DEALLOCATE CRS_NUMERO_ITEM;

    Quando deleto o último item da cotação tudo bem, mas quando deleto o primeiro item não realiza nenhuma iteração e fala q não pode duplicar a chave primária( q é formada pelo Código da Cotação + Número do Item), quando deleto o item nº 4 de 6 itens por exemplo a trigger faz a iteração até chegar no item deletado e dá pau de chave duplicada.

     

    Se alguém puder me ajudar.

     

    Desde já agradeço.

     

    Um abraço,

     

    Pedro.

     

    terça-feira, 27 de novembro de 2007 13:51

Todas as Respostas

  • Pedro,

     

    Primeiramente gostaria de alertar sobre o uso de cursor dentro do trigger, isso poderá apresentar problemas de performance, como também lock em suas tables.

     

    O que esta ocorrendo é que o valor que esta passado para a variável @intCodigoItemCotacao esteja incorreto, desta forma, o SQL Server estará fazendo um Update com um valor ITE_COT_VEN_CODIGO = @intNumeroItem
    já existente.

     

    terça-feira, 27 de novembro de 2007 15:51
  •  

    Boa tarde Junior,

     

    Preferia não usar o cursor tb, mas não tive outra idéia de como reordenar o número dos itens após a exclusão de um item qualquer. A variável @intCodigoItemCotacao está percorrendo todos os itens da cotação, ela pula o q foi deletado, mas ao inserir ITE_COT_VEN_CODIGO = @intNumeroItem no item subsequento ao deletado dá o erro "Violation of PRIMARY KEY constraint 'PK_TBL_ITENS_COTACAO_VENDA'. Cannot insert duplicate key in object dbo.TBL_ITENS_COTACAO_VENDA'."

     

     

    Parâmetros mandando deletar o item 4 de 5 itens

     Running [dbo].[up_DeletaItemCotacaoVenda] ( @NumeroCotacao = 62, @NumeroItem = 4, @CodigoProduto = 36 ).

     

    1º iteração

     

    @intCodigoCotacao       62 bigint
    @intCodigoItemCotacao  1 bigint
    @intNumeroItem             1 bigint
    @@FETCH_STATUS      0 int

    2º iteração

     

    @intCodigoCotacao       62 bigint
    @intCodigoItemCotacao   2 bigint
    @intNumeroItem              2 bigint
    @@FETCH_STATUS       0 int

     

    3º iteração

     

    @intCodigoCotacao        62 bigint
    @intCodigoItemCotacao    3 bigint
    @intNumeroItem               3 bigint
    @@FETCH_STATUS        0 int

     

    4º iteração

     

    @intCodigoCotacao         62 bigint
    @intCodigoItemCotacao     5 bigint
    @intNumeroItem                4 bigint
    @@FETCH_STATUS         0 int

     

    Na quarta iteração é quando vai subistituir o deletado pelo próximo.

     

    Não tô conseguindo achar o erro.

     

    Um abraço,

     

    Pedro

     

    terça-feira, 27 de novembro de 2007 16:15