PDA

View Full Version : آموزش: نمایش رکوردها با تعداد بالا؟!



ali190
چهارشنبه 02 فروردین 1391, 18:40 عصر
باسلام و عرض خسته نباشید
من در حال حاضر مشغول انجام یک پروژه بایگانی هستم
در یک قسمت از این برنامه قراره اسامی و مشخصات کلیه افرادی که در این سازمان قرار پرونده هاشون بایگانی بشه ثبت نام بشن
کد-نام - فامیلی - سکونت - تحصیلات - نام پدر - ش.ش- و...
حالا میخوام این اطلاعات در یک گرید نمایش داده بشه و بعد از کلیک بر روی هر فرد چند تا جدول دیگه که در رابطه با این جدول رابطه یک به چند دارند فراخوانی بشن (مثل مدارکشون ، نامه های مرتبط باهاشون ، سوابق اجراییشون و...)
پس تا این جای کار جدول Base همون جدول افراد هست که سایر اطلاعات بر حسب رکوردهیا این جدول قراخوانی میشن
من در پروژم میخوام از گرید جانوس استفاده کنم ، چون از قابلیت RTL پشتیبانی میکنه ، ضمناً امکانات خوبی مثل گروه بندی ، فیلتر چند گانه و ... داره
حالا میخوام بدونم به نظر شما تمام اطلاعات رو یک ضرب در گرید نمایش بدم
مثلاً فرض بفرمائید 70000 هزار نفر در دیتابیس لود شده اند ، زمانیکه گرید باز میشه هر 70000 هزار نفر نمایش داده بشن؟
آبا این کار عاقلانه و مقرون به صرفه هست؟
از طرف دیگه اگر از روش دیگه ای استفاده کنم و اطلاعات رو بر حسب یک فیلد فیلتر کنم و بخشی از اونا رو نمایش بدم یا با دستور Top در یک Select Command گروهی از اطلاعات رو در گرید لود کنم ، عملاً دست یوزرم رو بستم ، اولاً اون به تمام اطلاعات در لحظه دسترسی نداه و ثانیاً با این کار سایر امکانات گردم (مثل گروه بندی ، فیلترینگ و ....) عملاً فلج میشه
ممنون میشم راهنماییم کنید
در ضمن خیلی خوشحالم این چند روزه این بخش بیشتر داره روی مباحث دیتابیس زوم میکنه ، انشاء الله این موضوع بتونه به همه کمک کنه
ممنونم
یاعلی

ROSTAM2
چهارشنبه 02 فروردین 1391, 18:52 عصر
با سلام
برای بایگانی مطمئنا پرونده زیاده پس اطلاعات زیاده
برای این کار می تونی صفحه به صفحه قرار بدی مثل صفحات همین سایت
یا می تونی طبق بخش های مختلف جدا سازی کنی محل سکون یا تحصیلات
این فقط یه پیشنهاده

ali190
چهارشنبه 02 فروردین 1391, 20:25 عصر
در حالت صفحه به صفحه (Paging) کاربر به کلیه رکوردها دسترسی نداره ، ضمناً سایر ایزارهای گرید هم غیر فعال میشه

فرید نجفلو
چهارشنبه 02 فروردین 1391, 20:35 عصر
شما حالت صفحه به صفحه رو چطوری پیاده کردید
تکه کدی رو که استفاده کردید و در صورت لزوم توضیحات رو بنویسید
(غیر فعال شدن امکانات غیر طبیعیه)

ali190
چهارشنبه 02 فروردین 1391, 20:42 عصر
از نظر شما نمایش تا 70000 هزار رکورد میتونه مشکل زا باشه؟
اینم کد:

Imports System.Data.OleDb
Public Class Form1
Private cnnstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\NWIND.mdb"
Dim pagingAdapter As OleDbDataAdapter
Dim pagingDS As DataSet
Dim scrollVal As Integer=0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim sql As String = "SELECT * FROM orders order by orderid asc"
Dim connection As New OleDbConnection(cnnstring)
pagingAdapter = New OleDbDataAdapter(sql, connection)
pagingDS = New DataSet()
connection.Open()
pagingAdapter.Fill(pagingDS, scrollVal, 50, "orders")
connection.Close()
DataGridView1.DataSource = pagingDS
DataGridView1.DataMember = "orders"
End Sub
'رفتن به صفحه قبل
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
scrollVal = scrollVal - 50
If scrollVal <= 0 Then
scrollVal = 0
End If
pagingDS.Clear()
pagingAdapter.Fill(pagingDS, scrollVal, 50, "orders")
End Sub
' رفتن به صحه بعد
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
scrollVal = scrollVal + 50

pagingDS.Clear()
pagingAdapter.Fill(pagingDS, scrollVal, 50, "orders")
End Sub
End Class
یاعلی

Hybrid
چهارشنبه 02 فروردین 1391, 23:35 عصر
سلام دوست عزیز ،

درسته لود کردن به قول شما 70000 رکورد کاره معقولانه ای به نظر نمیرسه ولی اینکه بگین دست یوزر رو هم بستین خوب نیست! یوزر خوب 70000 رکورد مثلا جلو دستشه ولی اون بیشتر کارش با جستجو هست نه اینکه بیاد از بین 70000 هزار تا دنبال مثلا اسمه علی بگرده پس دستش رو نبستیم مطمئنا کارش رو هم ساده تر کردیم! ،

2) در این Paging شما میتونین در هر Page حدوده 500 تا لود کنی نه 50 تا .

اینا پیشنهادات منه مطمئنا دوستان نظرات بهتری دارن.

موفق باشید./

klinton
پنج شنبه 03 فروردین 1391, 04:25 صبح
به نظر دوستان چطوره کل دیتابیسی که حجم داده زیادی داره مثل پرونده ها نامه ها سوابق و... رو توی یه دیتاست لود کنیم و با LINQ ازش پرس و جو کنیم. یعنی یه انتزاع از دیتابیس رو بیاریم روی رم و دیتاست و هرگونه تغییر با بیس دیتاست انجام بشه . مثلا بعد از حذف یه رکورد دوباره پرس و جو انجام ندیم و چون دیتاسورس دیتا سته ،فقط از دیتاست حذف بشه و از اونجا تو دیتابیس آپدیت بشه و تغییرات اعمال بشه. البته فقط برای جداول حجیم و اصلی.

ali190
پنج شنبه 03 فروردین 1391, 04:42 صبح
یه نکته وجود داره
اون هم اینه که لود کردن صفحه به صفحه عملاً ابزار فیلتر گرید جانوس رو که در امر جستجو بسیار قوی هست رو از کار میندازه
چون ابزار فیلترینگ گرید جانوس اطلاعات رو از دیتاسورس گرید میخونه
در حالت صفحه به صفحه کاربر نمیتونه اطلاعات رو از کل سرچ کنه و عملاً جستجوش با این ایزار فقط و فقط در همون Page خلاصه میشه
درسته؟

ROSTAM2
پنج شنبه 03 فروردین 1391, 10:03 صبح
این یه کمّیته
این پیشنهاد چطوره یه قسمت جستجوی کل بسازی که در ابتدا هیچ آیتمی رو لود نکنه بلکه پس از نوشتن اطلاعات جستجو و کلیک بر روی کلید جستجو آیتمهای جستجو شده رو نمایش بده
مثل جستجوی Help

فرید نجفلو
پنج شنبه 03 فروردین 1391, 12:15 عصر
به نظر دوستان چطوره کل دیتابیسی که حجم داده زیادی داره مثل پرونده ها نامه ها سوابق و... رو توی یه دیتاست لود کنیم و با LINQ ازش پرس و جو کنیم. یعنی یه انتزاع از دیتابیس رو بیاریم روی رم و دیتاست و هرگونه تغییر با بیس دیتاست انجام بشه . مثلا بعد از حذف یه رکورد دوباره پرس و جو انجام ندیم و چون دیتاسورس دیتا سته ،فقط از دیتاست حذف بشه و از اونجا تو دیتابیس آپدیت بشه و تغییرات اعمال بشه. البته فقط برای جداول حجیم و اصلی.

یعنی دقیقا شما می خواید با یه پتک بزید تو سر رم سیستم(و البته کارایی)
دوما شما به مراحل و مشکلات کار دقت کردی؟ اول می یای دیتا ست رو آپدیت می کنی و بعد می یای دیتابیس رو تغییر می دی(بین این دو مرحله هم که اگه یه پیغام موفقیت به کاربری بدی و مرحله دو شکست بخوره به کاربر چی بگیم!)
از اون گذشته تکلیف سایر کاربران شبکه چی می شه؟
ما تغییرات اونا و اونا تغییرات ما رو چطوری ببینن؟
ارتباط بین جداول چی میشه؟(من از یه جدول دیگه اطلاعاتی خوندم و تو رم هست حالا یکی اومد اونو حذف کرد و من باز از ID اون استفاده کردم اصل جامعیت پر!)
اینی که شما می گید واسه این کار مناسب نیست این روش بیشتر در موارد Caching خوبه اونم واسه جدول هایی که اصلا تغییر نمی کنن و یا خیلی کم تغییر می کنن و حین اعمال به دیتا بیس هم می شه چکشون کرد



یه نکته وجود داره
اون هم اینه که لود کردن صفحه به صفحه عملاً ابزار فیلتر گرید جانوس رو که در امر جستجو بسیار قوی هست رو از کار میندازه
چون ابزار فیلترینگ گرید جانوس اطلاعات رو از دیتاسورس گرید میخونه
در حالت صفحه به صفحه کاربر نمیتونه اطلاعات رو از کل سرچ کنه و عملاً جستجوش با این ایزار فقط و فقط در همون Page خلاصه میشه
درسته؟

میشه گفت درسته!

البته من از جانوس استفاده نکردم و از امکانات و Event هاش خبر ندارم
ولی در کل هدف ما نمایش مثلا 100 رکورد اوله حالا چه با فیلتر و چه بدون فیلتر!

اگه کاربر باکس فیلتر رو خالی گذاشته که هیچ ولی اگه فیلتر کرد فقط کافیه یه LIKE به شرط دستورتون اضافه کنید( AND [Name] LIKE '%xx%' ORDER BY) و 100 رکورد مربوط به فیلتر رو نشون بدید(اونم اگه به 100 رسید!)



این یه کمّیته
این پیشنهاد چطوره یه قسمت جستجوی کل بسازی که در ابتدا هیچ آیتمی رو لود نکنه بلکه پس از نوشتن اطلاعات جستجو و کلیک بر روی کلید جستجو آیتمهای جستجو شده رو نمایش بده
مثل جستجوی Help

خوب حالا اومدیم اول کار بود کاربر فقط 10 تا رکورد ثبت کرده باز باید این کار رو بکنیم ؟
و یا کاربر دنبال یکی می گرده که اسمش یادش رفته یا اصلا می خواد کل لیست رو یکی نگاه کنه ( ما که نمی تونیم بگیم نکاه نکن!) حالا چی؟

نوبت شماست که بتوپین به من!:قهقهه:

ROSTAM2
پنج شنبه 03 فروردین 1391, 12:22 عصر
دوست عزیز

و یا کاربر دنبال یکی می گرده که اسمش یادش رفته یا اصلا می خواد کل لیست رو یکی نگاه کنه ( ما که نمی تونیم بگیم نکاه نکن!) حالا چی؟

اینطوری بر می گردیم به همون خونه اول

فرید نجفلو
پنج شنبه 03 فروردین 1391, 12:43 عصر
دوست عزیز


اینطوری بر می گردیم به همون خونه اول


چرا؟!

اصول کار ما اینکه کاربر اطلاعات صفحه به صفحه می بینه(مثلا هر صفحه 100 رکورد)
حالا این اطلاعات می خواد فیلتر شده باشه یا فیلتر نشده
اگه من هیچ اطلاعاتی از مشتری ندارم باید اونو از 700 صفحه 100 سطری پیدا کنم(کل اطلاعات 70.000 رکوذد فرض شده)
ولی مثلا اگه بدونم اسم کوچیکش رستم بود از بین 5 صفحه 100 سطری پیداش کنم(500 نفری که اسمشون رستم) یعنی کلی راحتی 500 کجا 70.000 کجا!

hakim22
پنج شنبه 03 فروردین 1391, 13:19 عصر
به نظر من در زیر پنجره قابلیت صفحه بندی رو اظافه کن ، مثل همین سایت ، کنارش هم یک جستجوی آزاد بزار که طرف هرچی وارد کرد بگرده و بین همه ی نتایج جستجو کنه ، یک چیزی مثل نرم افزار های لرد که جستجو میشن کار قشنگی بود ، قابلیت قیلتر کردن هم خیلی خوبه ولی صفحتو شلوغ میکنه ، برای اون یک قسمت جدا بزار ، در هر صورت نرم افزارها اومدن که کار خوندن رو آسونتر کنن ، و هیچ معنی نداره 7000 رکورد رو نشون بدی چون هیچ کسی ازش استفاده ای نمیبره ، معمولا و همیشه جستجو ها فیلترها هستن که کاربرد دارن ، موفق باشید.

ali190
پنج شنبه 03 فروردین 1391, 13:53 عصر
سلام دوستان
باز هم عرض میکنم
من دارم از گرید جانوس در پروژم استفاده میکنم که این گرید قابلیتهای زیادی از جمله فیلتر بسیار پیشرفته اطلاعات به گونه ای که شما در فیلتر نمودن اطلاعات محدودیتی بابت تعدا مراحل فیلتر همیچنین شروطی که میخواهید در این فیلترها اعمال کنید ندارید
مثلاً افرادی که محل سکونت اونها تهران هست و مدرک تحصیلی اونها لیسانس نیست و قد اونها بزرگتر از 180 هست و....
همچنین این گرید اطلاعاتتون رو در N سطح گروه بندی میکنه
امکانت خوب دیگه ای هم داره
البته همه این موارد زمانی کاربرد دارن که درتاسورس فیلترتون از دیتاسورس گریدتون نشئت بگیره در غیر اینصورت
مثلاً فرض بفرمائید کاربری بخواد کلیه افرادی که مدرک تحصیلی اونها لیسانس هست رو شناسایی کنه
اگر سیستم صفحه به صفحه رو پیاده سازی کنیم این فیلتر فقط افراد دارای مدرک لیسانس رو از همون صفحه شناسایی میکنه
به عبارت دیگه کاربر به اطلاعات کل دسترسی نداره
یه سئوال:
اگر شما نخواهید از ابزار فیلتر گرید جانوس استفاده نکنید ، سیستم فیلترینگ و جستجوتون رو چطور میسازید؟
با چند تا تکست باکس که شروط رو از کاربر میگرن و یک Select Command پارامتریک میسازه و دیتاسورس گرید رو شکل میده؟
راستی در این بین من یه تستی انجام دادم
گریدم رو که حاوی 20 رکرود بود رو با 80000 رکورد پر کردم
3 ثانیه طول کشید تا گرید بالا بیاد
البته فیلد عکسم رو از گرید حذف کردم
تو 160000 رکرود هم 6 ثانیه طول کشید تا بالا بیاد
سرعت ابزارهای گروه بندی و فیلترینگش هم تقریباً قابل قبول بود

ali190
پنج شنبه 03 فروردین 1391, 20:28 عصر
سلام
نظرتون چیه لود کردن رکوردها در گرید رو با Thread انجام بدم؟
ممنونم
یاعلی

klinton
پنج شنبه 03 فروردین 1391, 21:43 عصر
یعنی دقیقا شما می خواید با یه پتک بزید تو سر رم سیستم(و البته کارایی)
دوما شما به مراحل و مشکلات کار دقت کردی؟ اول می یای دیتا ست رو آپدیت می کنی و بعد می یای دیتابیس رو تغییر می دی(بین این دو مرحله هم که اگه یه پیغام موفقیت به کاربری بدی و مرحله دو شکست بخوره به کاربر چی بگیم!)
از اون گذشته تکلیف سایر کاربران شبکه چی می شه؟
ما تغییرات اونا و اونا تغییرات ما رو چطوری ببینن؟
ارتباط بین جداول چی میشه؟(من از یه جدول دیگه اطلاعاتی خوندم و تو رم هست حالا یکی اومد اونو حذف کرد و من باز از ID اون استفاده کردم اصل جامعیت پر!)
اینی که شما می گید واسه این کار مناسب نیست این روش بیشتر در موارد Caching خوبه اونم واسه جدول هایی که اصلا تغییر نمی کنن و یا خیلی کم تغییر می کنن و حین اعمال به دیتا بیس هم می شه چکشون کرد



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

فرید نجفلو
جمعه 04 فروردین 1391, 00:18 صبح
البته بخوای نخوای این پتک باید رو سر سیستم بیاد
خواستنش که نمی خوام و اجازه این رو هم به خودم نمی دم


مگه شما این داده ها رو به هر روشی سلکت کردین روی رم نمیاد؟
می یاد ولی نه همش یکجا!


البته من فقط جدول اصلی منظورم بود که چوب کبریت هم به حساب نمیاد چه برسه به پتک
اتفاقا وقتی کارتون با این جمله ترکیب بشه از هیزم هم بیشتره:

کل دیتابیسی که حجم داده زیادی داره



در مورد شکست اون مراحل همشونو توی یه رول بک میذاریم

طبق این جمله خودتون:

فقط از دیتاست حذف بشه و از اونجا تو دیتابیس آپدیت بشه و تغییرات اعمال بشه
شما اول دیتا ست رو اصلاح می کنید مگه دیتا ست ازTransaction پشتیبانی می کنه
اگه هم برعکس کنیم شما تا به دیتابیس Commit ندید از ثبت اطلاعات اطمینان کامل ندارید!


در مورد شبکه شما وقتی دیتاست رو آپدیت کردین همون موقع توی دیتابیس هم اعمال میشه و قابل دسترسی برای سایر کاربرهاست
بله واسه اونا قابل دسترسه ولی تغییرات اونا واسه شما چی؟
البته اگه اونا هم از نرم افزار شما استفاده کنن که ...


در مورد ارتباط جداول هم همشون قابل پیاده سازی هست اگه با دیتاست کار کرده باشین میبینید میتونید بین جدول ها ارتباط برقرار کنید
مطمئن باشید کار کردم ، اگه کار نکرده بودم به خودم اجازه اظهار نظر نمی دادم!
منظور من این ارتباطات نبود چون این ارتباط در این مورد ربطی به جامعیت داده نداره چون اصلا به دیتابیس متصل نیست تا وجود یا عدم وجود اون رو چک کنه


در ضمن این مشکل این روش نیست و مشکل پیاده سازی های تحت شبکه است که بیشتر به برنامه نویسی مربوطه تا روش
ما به روش کاری نداریم هر مشکلی که واسه نرم افزار پیش بیاد مشکل ماست
در ضمن مگه ما مشق نویسی می کنیم خوب برنامه نویسی مگه شاخ و دم داره(بی ادبی محسوب نکنید)

klinton
جمعه 04 فروردین 1391, 03:41 صبح
برای سه مورد اول حرفی ندارم چون علمی نیستبرای مورد رول بک هم منظورمو خوب نرسوندم منظور من اینه که درصورتی که تابع execute scalar یا executenonquery مقدار موفقیت آمیزی برای ترنسکشن توی رولبک برگردوند یعنی عملیات موفقیت آمیز بود اون عملیات توی دیتاست هم انجام بشه که اتفاقا از حجم عملیاتی سرورهم کاسته میشه همونطور که قبلا هم گفتم و شما هم میدونید دیتاست یه انتزاع کوچکی از دیتابیسه البته دیتاست و تیبل آداپتر و اعمال اصلی روی دیتابیس روی دیتاست ها هم پیاده میشه اینکه شما فرمودید وجود یا عدم وجود اونو چک کنه من چیزی نفهمیدم اگه ارتباط باشه که هر تیبلی با تیبل اصلیمون ارتباطی داره رو دیتاست هم پیادش میکنیماینکه تغییرات رو کاربرهای دیگه چطور حس کنن اولن تغییرات روی دیتابیس اعمال میشن ولی اینکه تغییرات چطور روی رم ما و دیتاگرید ما حس بشن به این پیشنهادی که من دارم ارایه میکنم ربطی نداره و با هر روشی که پیاده سازی این مشکل وجود داره و شما و من و دوستان هرکدوم روشمون رو ارایه میکنیم و روشون هم بحث میکنیم نقاط ضعف و قوتش رو هم آنالیز میکنیم این شد الگوریتم .اینکه میگم نکته ی برنامه نویسی هست احتمالا من با databinding بخوام این مسله رو حل کنم و شما با موردی دیگر(صرفا مثال بود) . من سعی میکنم نگاه رو به جلو داشته باشم و از این بحث ها خروجی بگیرم و علاقه ای به کلمات بیل و کلنگ و داس و پتک...... ندارم وگرنه هیچ شکی در دانش شما نیستاگه شما هم نگاهی رو به جلو دارید دلایل علمی بیارید تا بحث کنیم و خروجی بگیریم مخصوصا در مورد آخری (شبکه)چیزی که الان به فکرم میرسه تریگره مثلا با تریگر به برنامه ها بفهمونیم تغییرات رو اما چطور از دیتابیس به برنامه چیزی بگی باید راجبش تحقیق کنم شما پیشنهادی دارین؟منتظر پیشنهادتون هستم موفق باشیم یاشاسین

hakim22
جمعه 04 فروردین 1391, 12:12 عصر
بجای دردسر thread برو سراغ کنترل Backgroundworker که خودش مدیریت Thread رو انجام میده ، به نظر من کلا کار قشنگیه اما بازم صفحه بندی لازمه !

ali190
جمعه 04 فروردین 1391, 13:35 عصر
سلام
میشه توضیح بدید چطور میتونم با Backgroundworker داده هم رو گرید Fill کنم
ممنونم
یاعلی

yasser_beiraghi
یک شنبه 06 فروردین 1391, 16:13 عصر
با سلام
من توي يکي از بانکهاي خصوصي ، نرم افزار نگين شرکت کيش وير رو ديدم ايده خوبي ازش گرفتم و تو اکثر برنامه هام پياده کردم. ببينيد تو اون برنامه اگه فرم مربوط به کارتهاي مشتري هاي بانک رو باز مي کردي (Credit ، Debit و ...) تو مرحله اول يک فرم خام بود بعد با يک کليد ساده يه فرم کوچيک باز مي شد که مي تونستي شرطهاي ترکيبي يا ساده تشکيل بدي که بعد از تاييد اين فرم يا همه کارتهاي يک شخص يا فقط يک کارت يا دسته اي از کارتهاي مورد نظر کاربر را مي ديدي.البته همين روش تو همه قسمتهاي ديگه هم بود که چون تو اون حالت تعداد کارتها چندين ميليون رکورد بود به نظر من ايده جالبي بود و تقريبا کاربرا هم خيلي راضي بودن و خبري از paging هم نبود. حالا اگه هر قدر شرط ها درستر پياده مي شد سرعت select هم به نسبت سريعتر يا کند تر بود. البته بعضي از دوستان هم تو همين تايپک اين نظر رو دادن.
راستي به نظر من با توجه به کدهايي هم که گذاشته بودي اگه مشکل خاصي نباشه daba base رو از access به Sql تغيير بدي سرعت Select خيلي بهتر مي شه.