none
[Microsoft][SQL Server Native Client 10.0]Estado de cursor inválido RRS feed

  • Pergunta

  • Pessoal, bom dia.

    Uso SQL Server 2008 R2. Criei um Trigger usando cursor para uma tabela no SAP. A tabela é a RDR1 (Itens do Pedido de Venda), onde cada vez que for cadastrado um novo pedido de Venda, essa Trigger irá selecionar os itens dos pedidos cadastrados e cadastrar alguns dados em uma outra tabela.

    Segue o código abaixo:

    ALTER TRIGGER [dbo].[TRIGGER_PV]
    ON [dbo].[RDR1]
    AFTER INSERT
    AS
    DECLARE
      @NUM_PV VARCHAR(10),
      @DOC_ENTRY INT,
      @NUMPV_ITEM INT,
      @DATA_DOC DATE,  
      @DATA_ENTR DATE,
      @ITEMCODE VARCHAR(10),
      @ITEMNAME VARCHAR(100),
      @QUANTIDADE INT
    BEGIN   
       SELECT @DOC_ENTRY = DocEntry
       FROM INSERTED;    
      
       DECLARE CursorPV CURSOR
       FOR
       SELECT T0.DocNum, T0.DocDate, T0.DocDueDate, T1.ItemCode, T1.Dscription, T1.Quantity
       FROM ORDR T0
       INNER JOIN RDR1 T1 ON(T0.DocEntry = T1.DocEntry)
       WHERE T0.DocEntry = @DOC_ENTRY
    
       OPEN CursorPV;
    
       FETCH NEXT FROM CursorPV 
       INTO @NUM_PV, @DATA_DOC, @DATA_ENTR, @ITEMCODE, @ITEMNAME, @QUANTIDADE
    
       WHILE @@FETCH_STATUS = 0 BEGIN
          INSERT INTO [@EVLISTAMESTRA] (Code, Name, DocEntry, CreateDate, Object, U_U_LG_DataVenc, U_U_LG_ItemCode, U_U_LG_Qtde)
          VALUES(@NUM_PV, @ITEMNAME, @DOC_ENTRY, @DATA_DOC, 'EV', @DATA_ENTR, @ITEMCODE, @QUANTIDADE);        
          
          FETCH NEXT FROM CursorPV
          INTO @NUM_PV, @DATA_DOC, @DATA_ENTR, @ITEMCODE, @ITEMNAME, @QUANTIDADE       
       END 
       
       CLOSE CursorPV;
       DEALLOCATE CursorPV;
    END
    
    
    GO

    Já usei cursores em outras ocasioes exatamente nessa lógica e funcionou. Agora quando eu tento incluir um novo pedido de venda, é apresentado o erro: [Microsoft][SQL Server Native Client 10.0]Estado de cursor inválido '' (RDR1)

    Andei pesquisando na internet e vi em alguns lugares que isso é um bug do SQL Server e tem correção pra isso.

    Voces poderiam me ajudar pessoal? Muito obrigado.


    [ ]'s

    sexta-feira, 1 de março de 2013 12:16

Todas as Respostas

  • José Otavio,

    Quando utilizamos Trigger temos que ter em mente que o processamento de código da trigger também é uma transação, sendo assim, ele será válido enquanto a transação que o disparou continuar em processamento.

    Ao invês de armazenar os valores em variáveis, não seria o caso de passar diretamente no Insert Into o Select que você esta pegando os dados?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sábado, 2 de março de 2013 16:39