PDA

View Full Version : پیمایش رکوردها در اس کیو ال



damanpak
پنج شنبه 04 خرداد 1391, 18:45 عصر
سلام به همه برنامه نویسان عزیز
اگه دوستان با VB6 کار کرده و اگه از ado استفاده کرده باشند میدونند که بین رکوردهای مورد نظری که داریم میتونیم با دستور بعد ado.Recordset.MoveNext بریم یا با دستور ado.Recordset.MoveFirst به آخرین رکورد بریم
حالا من میخوام معادل دستور ado.Recordset.MoveNext رو در sql بدونم
ممنون از توجهتون

tiphooo
پنج شنبه 04 خرداد 1391, 19:24 عصر
باید از CURSOR ها استفاده کنید در مورد آن در سایت مطالب زیاد است

Reza_Yarahmadi
پنج شنبه 04 خرداد 1391, 19:35 عصر
در مورد CURSOR توی همین سایت جستجو کنید. (بصورت کلی استفاده از CURSOR بخاطر سربار بسیار بالا پیشنهاد نمیشه)
معادل MoveNext هم میشه FETCH NEXT
barnamenevis.org/showthread.php?288247-نحوه-استفاده-از-CURSOR-؟ (http://barnamenevis.org/barnamenevis.org/showthread.php?288247-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-CURSOR-%D8%9F)
barnamenevis.org/showthread.php?340435-کمک-دستوری-که-بتواند-تمام-داده-های-نال-را-مقدار-دهی-کند (http://barnamenevis.org/barnamenevis.org/showthread.php?340435-%DA%A9%D9%85%DA%A9-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%DB%8C-%DA%A9%D9%87-%D8%A8%D8%AA%D9%88%D8%A7%D9%86%D8%AF-%D8%AA%D9%85%D8%A7%D9%85-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%D9%86%D8%A7%D9%84-%D8%B1%D8%A7-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-%D8%AF%D9%87%DB%8C-%DA%A9%D9%86%D8%AF)
http://barnamenevis.org/showthread.php?291019-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-cursor
http://barnamenevis.org/showthread.php?214403-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-Cursor-%D8%AF%D8%B1-sql

damanpak
پنج شنبه 04 خرداد 1391, 19:37 عصر
در مورد CURSOR توی همین سایت جستجو کنید. (بصورت کلی استفاده از CURSOR بخاطر سربار بسیار بالا پیشنهاد نمیشه)
معادل MoveNext هم میشه FETCH NEXT

دوست عزیز شما در خط بالا گفتین به خاطر سربار بالا از این روش استفاده نکنید و منم نمیخوام سربار برنامه ام زیاد بشه

راه دیگه ای نیست؟

Reza_Yarahmadi
پنج شنبه 04 خرداد 1391, 20:15 عصر
دوست عزیز شما در خط بالا گفتین به خاطر سربار بالا از این روش استفاده نکنید و منم نمیخوام سربار برنامه ام زیاد بشه
راه دیگه ای نیست؟
چه کاری میخواید انجام بدید؟ خیلی از مواقع میشه بدون استفاده از کرسر به هدف رسید ولی بعضی مواقع هم باید از کرسر استفاده کرد.
کاری که میخواید انجام بدید رو بصورت کامل شرح بدید و در صورت امکان نمونه اطلاعات و خروجی مورد نظرتون رو بذارید تا بررسی کنیم با چه روشهایی میشه مسئله رو حل کرد.

damanpak
پنج شنبه 04 خرداد 1391, 20:34 عصر
کاری که میخواید انجام بدید رو بصورت کامل شرح بدید و در صورت امکان نمونه اطلاعات و خروجی مورد نظرتون رو بذارید تا بررسی کنیم با چه روشهایی میشه مسئله رو حل کرد.
چشم اینم مثال
87444
در این تصویر میخوام مقدار فیلد مبلغ اولیه و وضعیت اولیه هر رکورد از محاسبه مقادیر رکورد قبلی بدست بیاد
مثلا در رکورد اول وضعیت اولیه تسویه بوده و مبلغ اولیه هم صفر بوده و با دریافت مبلغ 55000 ت در رکورد دوم وضیعت اولیه شده بستانکار و مبلغ اولیه شده 55000 ت(اگه پول دریافت بشه فیلد دریافت عدد 1 و درغیر اینصورت عدد 0 رو میگیره)
حالا میخوام دستور،پروسیجروفانکشن یا هرچیزی که اسمشو میزاریم داشته باشم که از رکورد اول تا رکورد آخر تغییرات رو خودکار اعمال کنه وی محیط اس کیو ال

با تشکر از توجه شما دوست عزیز

Reza_Yarahmadi
پنج شنبه 04 خرداد 1391, 22:25 عصر
به جدولتون یک فیلد ID از نوع Identity اضافه کنید و بصورت زیر عمل کنید
جدول و داده های نمونه
Declare @Tbl Table(
Id int Identity(1, 1),
rs bit,
mb2 nvarchar(50),
cids int)

Insert Into @Tbl Values ( 1, 55000, 1)
Insert Into @Tbl Values ( 1, 35000, 1)
Insert Into @Tbl Values ( 0, 110000, 1)
Insert Into @Tbl Values ( 1, 450000, 1)
Insert Into @Tbl Values ( 0, 120000, 1)
Insert Into @Tbl Values ( 1, 40000, 1)


;With Res as(
Select
Row_Number() Over(ORder By ID) as RowID,
*
From
@Tbl
),
Result (RowID, mb1, rs, mb2, mb) as(
Select Top 1
RowID,
0 as mb1,
rs,
mb2,
mb = Case rs
When 0 Then mb2*(-1)
Else mb2
End
From Res
UNION ALL
Select
T1.RowID,
T2.mb as mb1,
T1.rs,
T1.mb2,
mb = Case T1.rs When 0 Then T2.mb - T1.mb2 Else T2.mb + T1.mb2 END
From
Res T1 Inner Join Result T2
ON
T1.RowID = T2.RowID + 1
),
FinalResult as (
Select
RowID,
mb1,
Stt1 = Case
When mb1 = 0 Then N'تسویه'
When mb1 > 0 Then N'بستانکار'
Else N'بدهکار'
END,
rs,
mb2,
mb,
Stt2 = Case
When mb = 0 Then N'تسویه'
When mb > 0 Then N'بستانکار'
Else N'بدهکار'
END
From
Result R)
Select * From FinalResult