خوب حالا اگه بخوام این کرسر چندتا رکورد رو بر گردونه به طوری که من از اول بخونم بعد از این که به آخر رسیدم دوباره اگه خواستم برگردم از اول بخونم چکار باید کنم
البته کل این دستورات داخل یک حلقه دیگه هست به طوری که با هر بار اجرای این کرسر برای هر رکورد اون هم به صورت دستی یک مورد جلو می رود
من این کار رو به این شکل انجام دادم در سلکت مربوط به کرسر اون چندتا رکرود رو برگردوندم و هر جا که این جمله بود (FETCH NEXT)او خط رو با این جمع عوض کردم (FETCH FIRST) البته در یک دستور شرطی که اگه به آخر کرسر برسه بره اول اون تا زمانی که اون شرط کی در وایل هم استفاده کردم برقرار اما نمی شه یک مشکلی داره
من نمی دونم چرا توی 2 جا از FETCH NEXT استفاده کردین؟!
اینم کد کامل من
CREATE PROCEDURE [SpCopyFromUntilDefShift]
( @IdShift numeric,
@SDateOlgo [char](5),
@EDateOlgo [char](5),
@SDateRep [char](5),
@EDateRep [char](5),
@YearDate [char](5),
@hasExit [int]output
)
AS
declare @NoDayOlgo int, @NoDayPeriod int, @I int
declare @strTemp Char(20), @strTemp2 char(20)
set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @SDateRep,1,2),substring( @SDateRep,4,2))
set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @EDateRep,1,2),substring( @EDateRep,4,2))
set @i = DATEDIFF(day,@strTemp,@strTemp2 )
set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @SDateOlgo,1,2),substring( @SDateOlgo,4,2))
set @strTemp2=dbo.Persian2Civil(@YearDate ,substring( @EDateOlgo,1,2),substring( @EDateOlgo,4,2))
set @NoDayOlgo = DATEDIFF(day,@strTemp,@strTemp2) + 1
set @NoDayPeriod = Cast((@i / @NoDayOlgo)as int)
declare @DBEGINDATECur char(5),@DBEGINDATEOlgo char(5)
declare @DBEGINDATE char(5), @BBEGINDATE char(5), @BBEGINTIME char(5), @BENDDATE char(5), @BENDTIME char(5), @DBEGINTIME char(5), @DENDDATE char(5)
declare @DENDTIME char(5), @EBEGINTIME char(5), @EBEGINDATE char(5), @EENDDATE char(5), @EENDTIME char(5), @ENDDATE char(5), @ENDTIME char(5)
declare @HOLIDAY int
--تعریف کرسر
set @DBEGINDATECur =@SDateRep
--set @DBEGINDATEOlgo =@SDateOlgo
WHILE @DBEGINDATECur < = @EDateRep
BEGIN
--WHILE @i =@NoDayOlgo-1
--BEGIN
DECLARE Cursor1 CURSOR FOR
SELECT DBEGINDATE,BBEGINDATE, BBEGINTIME, BENDDATE, BENDTIME, DBEGINTIME,
DENDDATE, DENDTIME, EBEGINTIME, EBEGINDATE, EENDDATE, EENDTIME, ENDDATE, ENDTIME, HOLIDAY
FROM dbo.ShiftItemDef
WHERE (TypeShiftId = @IdShift) AND (DBEGINDATE =@DBEGINDATEOlgo )
OPEN Cursor1
if @EDateOlgo=@DBEGINDATEOlgo and @DBEGINDATECur=@EDateRep
FETCH first FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY
else
FETCH next FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY
--تا زمانی که رکوردی وجود دارد
WHILE @@FETCH_STATUS = 0
BEGIN
set @BBEGINDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@BBEGINDATE,@DB EGINDATECur,@YearDate)
set @BENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@BENDDATE,@DBEG INDATECur,@YearDate)
set @DENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@DENDDATE,@DBEG INDATECur,@YearDate)
set @EBEGINDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@EBEGINDATE,@DB EGINDATECur,@YearDate)
set @EENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@EENDDATE,@DBEG INDATECur,@YearDate)
set @ENDDATE =dbo.ReturnNewDate(@DBEGINDATEOlgo,@ENDDATE,@DBEGI NDATECur,@YearDate)
UPDATE ShiftItemDef
SET BBEGINDATE =@BBEGINDATE, BBEGINTIME =@BBEGINTIME, BENDDATE =@BENDDATE, BENDTIME =@BENDTIME, DBEGINTIME =@DBEGINTIME, DENDDATE =@DENDDATE,
DENDTIME =@DENDTIME, EBEGINTIME =@EBEGINTIME, EBEGINDATE =@EBEGINDATE,
EENDDATE =@EENDDATE, EENDTIME =@EENDTIME, ENDDATE =@ENDDATE, ENDTIME =@ENDTIME, HOLIDAY =@HOLIDAY
WHERE (TypeShiftId = @IdShift) AND (DBEGINDATE =@DBEGINDATECur )
/**/
--set @i=@i+1
set @strTemp=dbo.Persian2Civil(@YearDate ,substring( @DBEGINDATECur,1,2),substring( @DBEGINDATECur,4,2))
set @strTemp = DATEADD(day,1,@strTemp2)
set @DBEGINDATECur =dbo.Civil2Persian(DATEPART(month,@strTemp)& substring(@StrTemp,4,8))
if @EDateOlgo=@DBEGINDATEOlgo and @DBEGINDATECur=@EDateRep
FETCH first FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY
else
FETCH next FROM Cursor1 INTO @DBEGINDATEOlgo,@BBEGINDATE, @BBEGINTIME, @BENDDATE, @BENDTIME, @DBEGINTIME, @DENDDATE,
@DENDTIME, @EBEGINTIME, @EBEGINDATE, @EENDDATE, @EENDTIME, @ENDDATE, @ENDTIME, @HOLIDAY
END
CLOSE Cursor1
DEALLOCATE Cursor1
--END
END
GO
کجای کدم مشکل داره (می دونم خیلی بد شده)؟
در ضمن اگه می شه ادامه بحث رو در تاپیک زیر دنبال کنیم جواب مربوط به این تاپیک رو گرفتم. با تشکر
https://barnamenevis.org/showthread.php?t=59036