PDA

View Full Version : کار با دستورcursor



myexir
یک شنبه 28 مهر 1387, 08:14 صبح
sp زیر بایدسطر به سطر فیلد compNum را از جدول بخواند و آن را در @num بریزد. بعد تا سطری که جمع این فیلد های sum=sum+num+1)CompNum) کوچکتر از 5 باشد فیلد turn در هر سطر را با i پر کند ووقتی بزرگتر از 5 شد دوباره از اول شروع به شمارش کند(sum=0) و فیلد turn را با i+1 پر کند و به همین ترتیب تا آخرین سطر جدول 5تا5تا بشمارد فیلدهای turn را پر کند
من خیلی با دستور cursor آشنا نیستم ولی فکر می کنم باید این sp با این دستور نوشته شود. کد زیر را با cursor نوشتم اما کار نمی کند و همه فیلد turn را یک می گذارد.
لطفا اگر کسی متوجه اشکال در کد زیر می شود در رفع آن به من کمک کند



DECLARE @i int,@Sum int,@Num int
SET @i=1
SET @Sum=0
DECLARE SetTurn CURSORFOR
SELECT CompNum FROM RegTable
OPEN SetTurn
FETCH NEXT FROM SetTurn
WHILE@@FETCH_STATUS= 0
FETCH NEXT FROM SetTurn INTO @Num
SET @Sum=@Sum+@Num+1
IF @Sum<5
Update RegTable SET Turn=@i
ELSE
BEGIN
SET @i=@i+1
SET @Sum=0
Update RegTable SET Turn=@i
END
FETCH NEXT FROM SetTurn INTO @Num
CLOSE SetTurn
DEALLOCATE SetTurn


متشکرم

AminSobati
یک شنبه 28 مهر 1387, 19:29 عصر
دوست عزیز البته من ساختار جدول شما رو نمیدونم ولی به نظر میرسه باید موقع Update کردن روی همون فیلد قبلی Update انجام نشه. مثلا براش WHERE CURRENT OF SetTurn استفاده کنین که Update روی رکورد دیگری اتفاق بیافته

myexir
یک شنبه 28 مهر 1387, 19:58 عصر
جدول من یک فیلد turn و یک فیلد compnum دارد و چند فیلد دیگر که اینجا کاربردی ندارد. compnum ها عدد هستند .
در این sp سه پارامتر sum,num , i تعریف کردم و یک کرسر به نام setturn که compnum را از جدول می خواند و در پارامتر num می ریزد(FETCH NEXT FROM SetTurn INTO @Num). این num ها که سطر به سطر خوانده می شود با هم جمع می شوند(SET @Sum=@Sum+@Num+1
) و تا جایی که جمعشان کمتر از 5 است فیلدهای turn را i می گذارد (Update RegTable SET Turn=@i
)و اگر بیشتر از 5 شد دوباره از اول شروع به شمارش می کند. (sum=0) و turn را i+1 می گذارد. و به همین ترتیب تا آخرین سطر جدول ادامه می دهد


راش WHERE CURRENT OF SetTurn استفاده کنین که Update روی رکورد دیگری اتفاق بیافته
منظورتون رو متوجه نشدم میشه بیشتر توضیح بدید؟ کدوم فیلد اپدیت بشه؟

myexir
دوشنبه 29 مهر 1387, 09:45 صبح
برای امتحان کدم، اون رو اینطور تغییر دادم:



set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[SetTurn3]
AS
BEGIN
DECLARE @i int,@Sum int,@Num int
DECLARE SetTurn CURSOR FOR
SELECT CompNum FROM Reg
OPEN SetTurn
FETCH NEXT FROM SetTurn
WHILE @@FETCH_STATUS= 0
FETCH NEXT FROM SetTurn INTO @Num
Update Reg SET Turn=@Num (Turn=@Num)
CLOSE SetTurn

END


که هر چی می خونه و می ریزه توی num رو توی فیلد turn ذخیره کنه ببینم چی خونده. یعنی باید فیلد compnum رو عینا به turn منتقل کنه اما تماما فیلد turn رو باصفر پر می کنه. یعنی انگار اصلا سطر به سطر compnum رو نمی خونه.
مشکل از کجاست؟

myexir
سه شنبه 30 مهر 1387, 08:12 صبح
خیلی ممنون از اییییین همه کمک!!!!
مشکل برطرف شد. کد رو می ذارم شاید به درد بقیه بخوره:


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[SetTurn3]
AS
BEGIN
DECLARE @i int,@Sum int,@Num int,@id int
SET @i=1
SET @Num=0
SET @Sum=0
DECLARE SetTurn CURSOR FOR
SELECT CompNum,id FROM Reg
OPEN SetTurn
FETCH NEXT FROM SetTurn INTO @Num,@id
WHILE @@FETCH_STATUS= 0
BEGIN
SET @Sum=@Sum+@Num+1
IF @Sum<=5
Update Temp SET turn=@i WHERE id=@id
ELSE
BEGIN
SET @i=@i+1
SET @Sum=0
Update Temp SET turn=@i WHERE id=@id
END
FETCH NEXT FROM SetTurn INTO @Num,@id
END
CLOSE SetTurn
deallocate SetTurn
END


نکته مهم اینه که نمیشه همزمان روی یک جدول کرسر تعریف کرد و همزمان آپدیتش کرد

AminSobati
سه شنبه 30 مهر 1387, 23:43 عصر
نکته مهم اینه که نمیشه همزمان روی یک جدول کرسر تعریف کرد و همزمان آپدیتش کرد

مشکلی از این بابت نیست، شاید در تعریف Cursor نکته ای از قلم افتاده. یا شاید ReadOnly تعریفش کردین