Inquiridor
Pegar data anterior de um registro dentro de um cursor fetch next

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,
Todas as Respostas
-
-
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,
-
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 -
-
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]