none
Pegar data anterior de um registro dentro de um cursor fetch next RRS feed

  • Pergunta

  • Olá,

    Eu tenho que passar pelo cursor e alterar a data de entrega de uma tabela,

    onde eu uso a data anterior como parâmetro em uma funcão..

    Mais eu estou fazendo e pegando sempre a data de entrega do registro atual, não a anterior, tentei usar um fetch prior mais não deu certo..

    Aqui está o que eu fiz.. sem o fetch prior..

     DECLARE @sGUARDA_DATA_ENTREGA SMALLDATETIME
    
     DECLARE CURSOR_ALTERACAO_DT_ENTRAGA CURSOR FOR
      SELECT A.NR_PDE_SLC, A.NR_SLC, A.DATA_ENTREGA, A.DT_LIM_ETR_SLC, 
         A.QT_TMP_PVT_CCL, A.QT_TMP_PVT_PRM, A.SLA, A.ID_EVENTO_REGISTRO
      FROM #TBL_SIMULACAO A WITH(NOLOCK)
      WHERE A.CD_USR_ATE = @nCD_USR_ATE
    
     OPEN CURSOR_ALTERACAO_DT_ENTRAGA
     FETCH NEXT FROM CURSOR_ALTERACAO_DT_ENTRAGA INTO @nNR_PDE_SLC, @nNR_SLC_CURSOR, @dDATA_ENTREGA, @dDT_LIM_ETR_SLC,
    											    @nQT_TMP_PVT_CCL, @nQT_TMP_PVT_PRM, @nSLA, @sID_EVENTO_REGISTRO
     WHILE @@FETCH_STATUS = 0 BEGIN
      SET @sGUARDA_DATA_ENTREGA = @dDATA_ENTREGA
      PRINT 'GUARDA DATA = ' + CAST(@sGUARDA_DATA_ENTREGA AS VARCHAR(100))
      PRINT 'DATA ENTREGA = ' + CAST(@dDATA_ENTREGA AS VARCHAR(100))
      IF @sID_EVENTO_REGISTRO = 'A' OR @nNR_PDE_SLC > @sGUARDA_NR_PDE_SLC
      BEGIN
      UPDATE #TBL_SIMULACAO 
       SET DATA_ENTREGA = GETDATE()
       WHERE NR_SLC = @nNR_SLC_CURSOR
      SET @sGUARDA_NR_PDE_SLC = @nNR_PDE_SLC
      END
     FETCH NEXT FROM CURSOR_ALTERACAO_DT_ENTRAGA INTO @nNR_PDE_SLC, @nNR_SLC_CURSOR, @dDATA_ENTREGA, @dDT_LIM_ETR_SLC,
    											 @nQT_TMP_PVT_CCL, @nQT_TMP_PVT_PRM, @nSLA, @sID_EVENTO_REGISTRO 
     END
     CLOSE CURSOR_ALTERACAO_DT_ENTRAGA
     DEALLOCATE CURSOR_ALTERACAO_DT_ENTRAGA
    

    Se alguém puder ajudar...

    Att,

    quinta-feira, 25 de agosto de 2011 13:01

Todas as Respostas

  • Diego

    Vc poderia postar um exemplo de como esta o os tados em sua tabela e como vc gostaria de ficasse?


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 25 de agosto de 2011 13:09
  • Marcelo,

    Tipo vou explicar melhor ai vê se ajuda..

    Tipo onde está SET DATA_ENTREGA = GETDATE() não ficará assim, no lugar do gatedate() terá uma função que vai calcular essa nova data e usa a @dDATA_ENTREGA do registro anterior do fetch next..

    Então se eu estiver o fetch 3 a data @sGUARDA_DATA_ENTREGA deve ser a data data anterior 2..

    Se eu estiver no 1 fetch ele deve pegar o primeiro, no 2 deve pedar o primeiro.. e por ai vai..

    Vê se vc pode me ajudar com isso..

    Att,

    quinta-feira, 25 de agosto de 2011 13:31
  • Diego,

    precisa ver os exemplos de dados que vc tem pois acho que vc não precisa fazer um cursor para isto...

    veja o script abaixo..

    declare @tbTeste table (id int identity(1,1), data datetime, entrega datetime)
    
    insert into @tbTeste values ('20110101',null),('20110222',null),('20110310',null),('20110420',null)
    --antes
    select * from @tbTeste
    
    ;with cte_ados as (
    SELECT *, 
    (SELECT top 1 e2.data FROM @tbTeste e2 WHERE e2.id < e.id order by e2.id desc) AS entrega2
    FROM @tbTeste e
    )
    
    update cte_ados set entrega=entrega2
    --depois
    select * from @tbTeste
    
    



    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 25 de agosto de 2011 14:14
  • Marcelo, valeu pela ajuda..

    Mais já resolvi com cursor, coloquei o set da nova data antes do fetch que muda para o proximo registro..

    Era uma coisa muito besta, falta de atenção mesmo..

    Obrigado,

    Att,

    quinta-feira, 25 de agosto de 2011 18:04
  • Diego,

    Somente como informação, a dica do Marcelo é bastante prática, simples e provalvemente mais eficiente em relação ao custo de processamento que o cursor pode gerar, vale realizar alguns testes.


    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, 27 de agosto de 2011 20:26