PDA

View Full Version : سوال: لطفاً سریع پیشنهاد بدید (Fill Form With TextBox)



prans_tork
جمعه 29 خرداد 1394, 10:54 صبح
با سلام خدمت دوستان

برای یک مرکز رادیولوژی در حال نوشتن یک پروژم و نزدیک تحویل پروژه هستم

من برای جاهایی که لازم بوده از کدهای موجود در دیتابیس چیزی انتخاب بشه علاوه بر اینکه برای Leave تکتباکس مربوطه کد مناسب رو نوشتم از یک کلید برای نمایش و انتخاب اونها هم استفاده کردم (البته با علم بر اینکه تعداد این کدها محدود هستش در دیتابیس)

132385

برای این پروژه در رویداد Leave تکستباکس های مربوط به کد ملی و شماره پرونده کد مناسب رو نوشتم تا در صورت از قبل موجود بودن کد ملی یا شماره پرونده در دیتابیس، اطلاعات موجود روی فرم پر بشه و کار ثبت رو راحت تر بکنه

حالا مشکلی که هست اینه:

در جلسه آخر مشاوره، مسئولین مرکز گفتن که بیشتر مراجعین ما افراد خارجی (بدون کد ملی) و یا افراد مسن (که حافظه مناسب برای همراه داشتن شماره پرونده رو ندارن) هستن و بنابراین درخواست کردن که با وارد کردن نام خانوادگی لیستی به صورت پیشنهادی شامل نام های مشابه موجو براشون باز بشه تا با انتخاب مورد مناسب، اطلاعات روی فرم پر بشه.

این کار مثل کدهایی که برای قسمت Leave کد ملی یا شماره پرونده نوشتم آسون و امکانپذیره که با Leave کردن از تکستباکس مربوط به نام خانوادگی، اگر اطلاعات متناظری در دیتابیس بود، روی فرم پر بشه.
اما اینا میخان که حتماً به صورت پیشنهاد براشون باز بشه(یه چیزی مثل همین عکسی که گذاشتم)

اما به نظر خودم با توجه به تعداد بالای مراجعین این مرکز که ممکنه روزانه تا 300-400 نفر و هفته ای حدود 2000 نفر و .... و همچنین با توجه به رشد سریع اطلاعات دیتابیس، این کار امکان پذیر نیست که با تایپ هر کاراکتر حجم عظیمی از اطلاعات رو براشون به صورت پیشنهاد مرتب کنم.

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


دوستان نظری دارند؟؟؟؟؟

Delphi7_love
جمعه 29 خرداد 1394, 13:16 عصر
حرف شما درسته
من برنامه شما رو برای درمانگاه نوشتم و طبق نظر اونا باید با نام و نام خانوادگی جستجو انجام میشد
من جستجو رو بر اساس همون کد ملی و شماره بیمه نوشتم و به اضافه این با توجه به درخواست اونا واسه افرادی که کد ملی یا شماره بیمه ندارن از یه تکست باکس دیگه واسه نام و نام خانوادگی استفاده کردم
که اگر بنده خدا کد ملی نداشت - از نام استفاده کنه و در ضمن با زدن کلید اینتر جستجو انجام میشه

alireza264
جمعه 29 خرداد 1394, 13:43 عصر
سلام
باید از ICollectionView استفاده کنی
ICollectionView collectionView = CollectionViewSource.GetDefaultView(source);
ابتدا کل دیتابیس رو بریز تو کلاس و کلاس رو بعنوان source بده به ICollectionView و بعد اونو با مقدار تکس بکست فیلتر کن

prans_tork
جمعه 29 خرداد 1394, 14:51 عصر
سلام
باید از ICollectionView استفاده کنی
ICollectionView collectionView = CollectionViewSource.GetDefaultView(source);
ابتدا کل دیتابیس رو بریز تو کلاس و کلاس رو بعنوان source بده به ICollectionView و بعد اونو با مقدار تکس بکست فیلتر کن


دوست عزیز ممکنه کمی توضیح بدی؟
چه فرق و مزیتی نسبت به مثلاً BindingSource یا مثلا DataTable و یا Dataset داره؟

TeacherMath
جمعه 29 خرداد 1394, 15:01 عصر
اگه دیتابیس اسکیوال سرور است می توید با استفاده از استورپروسیجر فقط ده مورد را در هر با انتخاب کنید.




create PROCEDURE [dbo].[Customers_SelectTop]
@name nvarchar(25)

AS
BEGIN
select top 10 * from [dbo].Customers
where Name LIKE '%'+@name+'%';
END

alireza264
جمعه 29 خرداد 1394, 17:25 عصر
دوست عزیز ممکنه کمی توضیح بدی؟
چه فرق و مزیتی نسبت به مثلاً BindingSource یا مثلا DataTable و یا Dataset داره؟

سلام
ابتدا عذر خواهی کنم که نوشتم کل دیتابیس رو بریز تو کلاس منظورم کل رکوردها جدول بود که باید توی یه لیست که از نوع کلاس مورد نظر باشه ریخته بشه
همون روش Binding هستش نسبت و به DataTable و dataset ابزار هاش و سرعتش بیشتره
در این روش شما یک لیست از کلاس موزد نظر میسازید و بعد لیست باید پر بشه و گرید رو با لیست بایند میکنید حالا هر عملی که روی لیست انجام بشه در گرید هم اغمال میشه

List<Person> listperson = new List<Person>();


ICollectionView collectionView = CollectionViewSource.GetDefaultView(listperson);


if (String.IsNullOrEmpty( textBoxSearch.Text))
collectionView.Filter = null;

else
{
collectionView.Filter = o =>
{
Person item = (Person)o;
item.LName.Contains( textBoxSearch.Text, StringComparison.OrdinalIgnoreCase);

};
}

prans_tork
جمعه 29 خرداد 1394, 21:38 عصر
اگه دیتابیس اسکیوال سرور است می توید با استفاده از استورپروسیجر فقط ده مورد را در هر با انتخاب کنید.




create PROCEDURE [dbo].[Customers_SelectTop]
@name nvarchar(25)

AS
BEGIN
select top 10 * from [dbo].Customers
where Name LIKE '%'+@name+'%';
END



از پاسخت بسیار ممنونم TeacherMath عزیز

اما:
ممکنه نام مورد نظر در دیتابیس موجود اما چزو 10 تایی نباشه که پروسیجر برمیگردونه

prans_tork
جمعه 29 خرداد 1394, 21:46 عصر
سلام
ابتدا عذر خواهی کنم که نوشتم کل دیتابیس رو بریز تو کلاس منظورم کل رکوردها جدول بود که باید توی یه لیست که از نوع کلاس مورد نظر باشه ریخته بشه
همون روش Binding هستش نسبت و به DataTable و dataset ابزار هاش و سرعتش بیشتره
در این روش شما یک لیست از کلاس موزد نظر میسازید و بعد لیست باید پر بشه و گرید رو با لیست بایند میکنید حالا هر عملی که روی لیست انجام بشه در گرید هم اغمال میشه

List<Person> listperson = new List<Person>();


ICollectionView collectionView = CollectionViewSource.GetDefaultView(listperson);


if (String.IsNullOrEmpty( textBoxSearch.Text))
collectionView.Filter = null;

else
{
collectionView.Filter = o =>
{
Person item = (Person)o;
item.LName.Contains( textBoxSearch.Text, StringComparison.OrdinalIgnoreCase);

};
}


باز هم از پاسخ و توضیحاتت ممنونم علیرضا جان

من مشابه روش شما رو با
BindingSource پیاده سازی کردم در حال حاضر

اما نگرانیم ازین بابته که:

اگر بخام کاملا پویا باشه پیشنهادها، پس باید در رویداد KeyPress مربوطه، هربار شباهت های موجود رو با کوئری استخراج و نشون بدم.
گذشته از اینکه خود این عمل و ایجاد و اجرای کوئری با تایپ هرکاراکتر زمانبر خواهد بود، بلکه در طول زمان با رشد دیتابیس، فراخوانی و لود هزاران رکورد در دیتاگرید به عنوان پیشنهاد هم بسیار زمان بر و هم بار بسیاری ایجاد خواهد کرد.
روش دوم اینه که ابتدا کل جدول رو فراخوانی و مثلا به یک BindingSource بایند کنم و سپس BindingSource رو هم به دیتاگرید بایند کنم:
این خوبیش اینه که فقط یک کوئری ایجاد و اجرا میشه ولی عیبش هم اینه که بار بسیار زیادی روی سیستم خواهد داشت.

مشکل اساسی من پیدا کردن روشی به کمک شما دوستان هست که هم زمان کمتری لازم داشته برای فراخوانی و شامل حداقل ایجاد و اجرای کوئری باشه و نهایتا بار کمتری روی منابع سیستم داشته باشه

ممنونم از همه دوستانم

alireza264
شنبه 30 خرداد 1394, 00:15 صبح
باز هم از پاسخ و توضیحاتت ممنونم علیرضا جان

من مشابه روش شما رو با
BindingSource پیاده سازی کردم در حال حاضر

اما نگرانیم ازین بابته که:

اگر بخام کاملا پویا باشه پیشنهادها، پس باید در رویداد KeyPress مربوطه، هربار شباهت های موجود رو با کوئری استخراج و نشون بدم.
گذشته از اینکه خود این عمل و ایجاد و اجرای کوئری با تایپ هرکاراکتر زمانبر خواهد بود، بلکه در طول زمان با رشد دیتابیس، فراخوانی و لود هزاران رکورد در دیتاگرید به عنوان پیشنهاد هم بسیار زمان بر و هم بار بسیاری ایجاد خواهد کرد.
روش دوم اینه که ابتدا کل جدول رو فراخوانی و مثلا به یک BindingSource بایند کنم و سپس BindingSource رو هم به دیتاگرید بایند کنم:
این خوبیش اینه که فقط یک کوئری ایجاد و اجرا میشه ولی عیبش هم اینه که بار بسیار زیادی روی سیستم خواهد داشت.

مشکل اساسی من پیدا کردن روشی به کمک شما دوستان هست که هم زمان کمتری لازم داشته برای فراخوانی و شامل حداقل ایجاد و اجرای کوئری باشه و نهایتا بار کمتری روی منابع سیستم داشته باشه

ممنونم از همه دوستانم


سلام
یه لود اولیه باید داشته باشی و به شرط داشتن هزاران رکورد چیزی حدود 1 تا 2 ثانیه برای لود اولیه لازم داره میتونی یه لیست سراسری تعریف کنی که فقط در شروع برنامه مقدار دهی بشه و به جای keypress از TextChange استفاده کن ضمن اینکه در این روش فقط یکبار و بعد ار تایپ کاراکتر اول به لیست اولیه و کامل مراجعه میشه در تایپ کارکترهای دوم و بعدی به لیست قیلتر شده بر اساس کارکترهای قبلی مراجعه میشه و هیچ query هم در کار نیست و بدلیل اینکه کل فرآیند در Ram انجام میشه پیدا کردن رکوردهای مورد نظر همزمان با تایپ کارکتره
ضمن اینکه برای سرعت و سربار کمتر فقط کد ملی - نام و نام خانوادگی رو بریز تو لیست حجمش خیلی کمه مثلا نام 15 کاراکتر فامیل 25 تا کد ملی 10 جمعش میشه 50 کاراکتر اگه صد هزار رکورد داشته باشی چیزی در حدود 5 مگابایته
نکته مهم چون فقط یک لود اولیه داری افراد جدید رو بعد از ثبت در دیتا بیس به انتهای لیست Add کن تاثیری در سرعت و پیدا کردنش نداره


با آرزوی موفقیت

reza_ali202000
شنبه 30 خرداد 1394, 09:01 صبح
بهتری راه جل همینه که اول کلش رو لود کنی بعد filter binding source روش اعمال کنی.
اما نکته مهم تر اینه که هر شماره پرونده یکتا هست مثل کد ملی و عموما توی درمانگاه ها بعد از مدتی یه عده ثابت میان و حجم اطلاعاتی بیمارانمون خیلی بالا نمیره ولی نسخ ممکنه بالا بره. پس جای نگرانی نیست.
خیلی هم خودتون رو درگیر این موضوع نکنید. میتونید این کار رو آزمون و خطا انجام بدین. یعنی الان براشون نصب کنید شش ماه دیگه بهشون سر بزنید و آپدت کنید.

hamid_hr
شنبه 30 خرداد 1394, 10:36 صبح
نظر من
شما جستجو ور حرف به حرف انجام بده
فقط بزار حداقل سه حرف از نام و نام خانوادگی رو بزنه بعد کل اطلاعاتی که این سه حرف رو داره رو لود کن و جستجو رو برا این اساس انجام بده

prans_tork
شنبه 30 خرداد 1394, 17:48 عصر
از همه دوستان بابت پاسخ هاشون ممنونم فکر کنم حق با شماست
و ممنونم از راهنماییهاتون:قلب: