PDA

View Full Version : paging some rows



Shabani.Mojtaba
سه شنبه 30 فروردین 1384, 00:47 صبح
بطور مثال می خام 10 تا 10 تا رکور دها رو می خوام تو دیتا ست fill کنم.
بطور مثال 118 رو داریم می خوایم هر بار 10 record که فیلد family اونها شبیه احمدی باشه .
میخواستم راهنماییم کنید.

omid_Ahmadi
سه شنبه 30 فروردین 1384, 09:33 صبح
به راحتی و با استفاده از همون DataGrid میتونی این کار رو انجام بدی و خروجی های صفحه بندی شده داشته باشی.
به لینک زیر یه نگاهی بنداز.
[url]msdn.microsoft.com/library/en-us/vbcon/html/ vbwlkwalkthroughdisplayingdatainlistboxesonwebform spage.asp [/url
:موفق: ]

Shabani.Mojtaba
سه شنبه 30 فروردین 1384, 11:18 صبح
عزیز من شما از لحاظی درست میگی.
ولی در این حالت در دستور sqldataadqpter.fill(dataset11 کل record ها خوانده می شود که موجب busy شدن سرور میشود.
ما که نمیخوایم dataset رو با 10000000 رکورد پر کنیم بعد با paging مربوط به datagrid نمایش بدیم.
این کار عاقلانه نیست چون دیتابیس سرورمون مشغول میشه.
حالا فرض کن همون موقع 40 نفر بخوان این کار رو تکرار کنن.

omid_Ahmadi
سه شنبه 30 فروردین 1384, 12:31 عصر
خوب من هم نگفتم اگر تعداد رکوردهای شما 10000000تا بود این کار رو بکنید که. اگر دقت کنید میبینید که در پست قبلی شما شرایط خاصی برای برنامه ذکر نشده بود.
(فکر نکنم 10000000 تا احمدی در دیتابیس 118 داشته باشیم نه؟ :D )

در اوون حالت خوب از دستور top در SQL برای دریافت چند رکورد اول دیتابیس با query استفاده کنید و وقتی کاربر به صفحه بعد رفت دستور sql را برای چند رکورد بعدی اجرا کنید.
:wise1:

titbasoft
سه شنبه 30 فروردین 1384, 12:33 عصر
http://www.barnamenevis.org/forum/viewtopic.php?t=22699
به اون مقاله ای هم که توی microsoft آدرس داده شده توجه کنید

Shabani.Mojtaba
چهارشنبه 31 فروردین 1384, 13:10 عصر
از دستور top در SQL برای دریافت چند رکورد اول دیتابیس با query استفاده کنید و وقتی کاربر به صفحه بعد رفت دستور sql را برای چند رکورد بعدی اجرا کنید.
امکانش هست یه مثال به من نشون بدید یا رنامه ای که در اون این روش بکار رفته باشد؟

omid_Ahmadi
چهارشنبه 31 فروردین 1384, 21:31 عصر
به دستور SQLای که می خواهید استفاده کنید به صورت زیر کلمه TOPرو اضافه کنید:


SELECT TOP 10 * FROM Customers Where conditions

aidinwashere
پنج شنبه 01 اردیبهشت 1384, 15:49 عصر
خوب حالا برای 10 سطر بعد چی بنویسه؟

omid_Ahmadi
پنج شنبه 01 اردیبهشت 1384, 16:39 عصر
ببینید روش کلی کار به صورت زیر است:
شما برای رکوردهای موجود در برنامه تون یک سری ID دارید. بر فرض میخواهید از id شماره 10 تا 100 رو بدست بیارید. برای این کار ابتدا از همون دستوری که در بالا گفتم 10 رکورد اول رو بدست می آورید. بعد از این کار وقتی شما خواستید 10 رکورد بعدی رو بدست بیارید باید یک شرط دیگه نیز به قسمت WHERE دستور SQL اضافه کنید به این صورت که از id بیست به بعد رو برگردونه و برای قسمت سوم نیز به همین ترتیب...
:wise1:

kochol
پنج شنبه 01 اردیبهشت 1384, 17:08 عصر
سلام

ممنون از راهنماییتون

اگر آی دی هامون پاک شده بود منظورم این است که رکورد را پاک کرده باشیم اون وقت چی مثلا از 25 بره 29 :گیج:

Farhad.B.S
پنج شنبه 01 اردیبهشت 1384, 18:59 عصر
اگر آی دی هامون پاک شده بود منظورم این است که رکورد را پاک کرده باشیم اون وقت چی مثلا از 25 بره 29
یکی از رایج ترین روش ها برای صفحه بندی رکورد ها اینه که ابتدا کلیه رکورد های موجود در یک جدول موقت کپی میشند (بدین ترتیب فیلد آیدنتیتی دوباره بازسازی خواهد شد و اعداد با سید مشخص شده از نوع ساخته میشند) و بعد از این مرحله رکورد ها طبق همون روشی که جناب احمدی اشاره کردند از جدول موقت خوانده خواهند شد.

aidinwashere
پنج شنبه 01 اردیبهشت 1384, 21:47 عصر
ببینید روش کلی کار به صورت زیر است:
شما برای رکوردهای موجود در برنامه تون یک سری ID دارید. بر فرض میخواهید از id شماره 10 تا 100 رو بدست بیارید. برای این کار ابتدا از همون دستوری که در بالا گفتم 10 رکورد اول رو بدست می آورید. بعد از این کار وقتی شما خواستید 10 رکورد بعدی رو بدست بیارید باید یک شرط دیگه نیز به قسمت WHERE دستور SQL اضافه کنید به این صورت که از id بیست به بعد رو برگردونه و برای قسمت سوم نیز به همین ترتیب...
:wise1:
میشه همین قسمت WHERE رو که 10سطر دوم رو میاره رو بنویسید؟

Shabani.Mojtaba
پنج شنبه 01 اردیبهشت 1384, 22:14 عصر
خیلی از دوستان متشکرم.
اما من منظور آقای Farhad.B.S متوجه نشدم:

یکی از رایج ترین روش ها برای صفحه بندی رکورد ها اینه که ابتدا کلیه رکورد های موجود در یک جدول موقت کپی میشند
دیگه انوقت ما چرا paging میکنیم ؟
ما می خوایم سرورهامون busy نشن اونوقت شما میگین :
کلیه رکورد های موجود در یک جدول موقت کپی میشند
می شه بیشتر توضیح بدید ؟

Behrouz_Rad
پنج شنبه 01 اردیبهشت 1384, 22:49 عصر
فرمایش جناب Farhad.B.S درسته.
رکوردها رو میشه با چند Select تو در تو و شرط Where به راحتی میشه به شکل صفحه به صفحه بیرون کشید.
نمونه کدی که قبلا برای ایجاد Paging در سایتی نوشته بودم:


"Select * From (Select Top 10 * From (Select Top " & CStr(CInt(MyParamURL * 10)) & " * From (Select * From Per_Tbl Order By StrSubID DESC)) Order By StrSubID) Order By StrSubID DESC"

Farhad.B.S
جمعه 02 اردیبهشت 1384, 01:06 صبح
لازم به ذکره که در روشی که بهش اشاره کردم ، لازم نیست اطلاعات کلیه فیلد ها کپی شوند (کپی کردن PK کفایت میکند) و البته این فقط یک روشه ، روش های دیگری هم وجود دارند ...
برای اطلاعات بیشتر در این باره
http://www.codeproject.com/aspnet/PagingLarge.asp
مقاله بسیار ارزشمندیه که خوندنشو به همه دوستان توصیه میکنم :) .

omid_Ahmadi
جمعه 02 اردیبهشت 1384, 09:34 صبح
میشه همین قسمت WHERE رو که 10سطر دوم رو میاره رو بنویسید؟

فرض میگیریم که LastID و FirstID شماره idهای آخر و اول نمایش داده شده در صفحه جاری باشند و کاربر روی کلیدی برای نمایش 10 رکورد بعدی کلیک میکنه. دستور sql زیر رکوردهای مناسب رو بر میگردونه و مقادیر دو متغییر ذکر شده رو هم update میکنه:

SELECT TOP 10 * FROM Customers WHERE CustomerID > LastID
FirstID = LastID + 1
LastID +=11

فقط یک نکته:
از این حالت وقتی استفاده کنید که شماره idها ترتیبی باشد.

Shabani.Mojtaba
جمعه 02 اردیبهشت 1384, 13:40 عصر
واقعا از همه متشکرم.

aidinwashere
جمعه 02 اردیبهشت 1384, 14:57 عصر
خوب اگر ترتیبی نبود چی؟ یا مثلا فیلد ID نداشتیم.
اونوقت برای صفحه دوم رکورد ها چه WHERE ای مورد نیاز است؟

Shabani.Mojtaba
جمعه 02 اردیبهشت 1384, 15:54 عصر
راست می گه چون من مجبور شدم برای اینکار فیلد id رو به تمام رکوردهام اضافه کنم .
باید راه دیگری هم باشه.

omid_Ahmadi
جمعه 02 اردیبهشت 1384, 18:09 عصر
خوب شما باید به یک طریقی متوجه بشید که در دوره قبلی اجرای دستور SELECT کدام 10 ردیف از اطلاعات از بانک اطلاعاتی خوانده شدنه اند و در حال حاضر در صفحه نمایش داده شده اند. من برای این کار گفتم که بهتره یک ID درست کنید (که عددی باشه) بععد بر اساس این که کدام ID ها نمایش داده شده اند به صفحه قبل و یا صفحه بعد بروید


باید راه دیگری هم باشه.

خوب از هر ستون دیگه ای که به صورت unique باشه ( و ترجیحا عددی) میتونید استفاده کنید.

omid_Ahmadi
جمعه 02 اردیبهشت 1384, 18:12 عصر
مقاله بسیار ارزشمندیه که خوندنشو به همه دوستان توصیه میکنم .

خیلی ممنون. جالب بود.
:flower: :تشویق:

برنامه نویس
جمعه 02 اردیبهشت 1384, 18:20 عصر
بسیار عالی بود.
اما اگر ما هیچ فیلدی که مانند autonumber بالا رونده باشد(ترتیبی) نداشته باشیم اونوقت چکار کنیم.
مخصوصا مواقعی که ما فقط دسترسی برای تغییر بانک را نداشته باشیم.

omid_Ahmadi
جمعه 02 اردیبهشت 1384, 20:58 عصر
یعنی table شما چیزی شبیه primary key نداره؟

aidinwashere
جمعه 02 اردیبهشت 1384, 21:39 عصر
شاید نداره
شایدم primary key آن عددی نیست! :evil2:
انوقت چی؟

titbasoft
شنبه 03 اردیبهشت 1384, 07:28 صبح
اگه off topic حساب نمیشه ، تورو خدا فقط یه نگاه روزنامه وار به اون مقاله جناب Farhad.B.S بندازید. والا جواب میده. :wink:

omid_Ahmadi
شنبه 03 اردیبهشت 1384, 07:31 صبح
باز هم فرقی نمیکنه. حتی این روش برای بانکهای اطلاعاتی که primary keyآنها رشته ای است هم کار میکنه ( ولی باید primary key داشته باشه).
اگر واقعا هنوز ابهامی مونده ساختار و طراحی بانک اطلاعاتی که مدنظرتون هست رو بنویسید تا در رابطه با اوون بیشتر صحبت کنیم. :wise1:

omid_Ahmadi
شنبه 03 اردیبهشت 1384, 07:33 صبح
حق با titbasoft است. شما از روش جناب Farhad.B.Sهم میتونید استفاده کنید.
:موفق: