PDA

View Full Version : بهترین حالت سرچی که میتونم بنویسم



c_doost
دوشنبه 28 فروردین 1391, 08:39 صبح
سلام
در برنامه ای 3 پارامتر سرچ دارم
1- نام شهر
2- جنسیت
3- گروه هنری

اینجا چند نوع سناریو ممکنه برای سرچ اطلاعات پیش بیاد
1- کاربر فقط میخواهد یک شهر خاص را سرچ کند
2- کاربر میخواهد فقط جنسیت مرد یا زن را سرچ کند
3- کاربر میخواهد یک گروه هنری خاص را سرچ کند
4- کاربر میخواهد کاربر میخواهد یک شهر خاص و جنسیت مرد را سرچ کند
5- کاربر میخواهد جنسیت زن و گروه هنری خاص را سرچ کند
6- .......

سناریو های تلفیقی این شکلی

حالا چطوری میتونم یک سرچ بهینه برای این سناریو ها بنویسم ؟
چیزی که به ذهن خودم رسید :


if (!(cmb_city.Text == "انتخاب کنید") && !(cmb_jensiat.Text == "") && !(cmb_group_honari.Text == ""))
{
sqlselect = "select * from tbl_ozviat where city like'%" + cmb_city.Text + "%' and jensiat like'%" + cmb_jensiat.Text + "%' and group_honari like'%" + cmb_group_honari.Text + "%'";
reports.frm_rpt frm = new reports.frm_rpt();
frm.Show();
}
else if (!(cmb_city.Text == "انتخاب کنید") && !(cmb_jensiat.Text == "") )
{
sqlselect = "select * from tbl_ozviat where city like'%" + cmb_city.Text + "%'";
reports.frm_rpt frm = new reports.frm_rpt();
frm.Show();
}
else if (!(cmb_city.Text == "انتخاب کنید")&& !(cmb_group_honari.Text == ""))
{
sqlselect = "select * from tbl_ozviat where city like'%" + cmb_city.Text + "%' and group_honari like'%" + cmb_group_honari.Text + "%'";
reports.frm_rpt frm = new reports.frm_rpt();
frm.Show();
}

masoudmok
دوشنبه 28 فروردین 1391, 08:57 صبح
با توجه به این که 3 خصیصه داری 8 حالت یعنی 2 به توان 3 حالت میتونه سرچ کنه .
به جای این که برای هر حالت select بنویسی با 3 تا if میتونی چک کنی که هر کدوم از خصیصه ها که مد نظرش بود رو به select اضافه کنی .

c_doost
دوشنبه 28 فروردین 1391, 09:07 صبح
با توجه به این که 3 خصیصه داری 8 حالت یعنی 2 به توان 3 حالت میتونه سرچ کنه .
به جای این که برای هر حالت select بنویسی با 3 تا if میتونی چک کنی که هر کدوم از خصیصه ها که مد نظرش بود رو به select اضافه کنی .

اینی که شما میگید همونی نیست که کد انرا گذاشتم ؟

masoudmok
دوشنبه 28 فروردین 1391, 11:17 صبح
نه متاسفانه
من میگم اول نام شهر رو چک کن . اگه توی شرطت هست اونو به اخر select اضافه کن
بعد جنسیت رو چک کن . اگه توی شرطت هست اونو با and به اخر select اضافه کن
بعد ...

اینی که شما نوشتی واسه مثلا 10 تا خصیصه میشه 1024 حالت !!!! ولی اینجوری که گفتم میشه 10 تا شرط
اگه متوجه منظورم نشدی توی یه مثال توضیح بدم

spring69
دوشنبه 28 فروردین 1391, 11:29 صبح
سلام
نظر من اینه که چنین فرم هایی به این شکل طراحی نشه که با هر تغییر کوچک در پارامترهای جستجو، شما بازخوانی رو از بانک انجام بدید.
اگر منبع داده شما از جای دیگری تغییر نمی کند (تک کاربره)، میتونید در همان اولین خواندن از بانک و نمایش،تمامی اطلاعات بانک را خوانده و در یک لیست، ذخیره کرده و جستجو را در آن انجام دهید.
البته این کار مستلزم نوشتن سناریویی با ساختار شی گرا هست (برای موجودیت های بانک مپینگ انجام شده باشد و کلاس تعریف شده باشد)
--
این نمونه برنامه (http://barnamenevis.org/showthread.php?305795-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%B3%D8%A7%D8%AF%D9%87-%D8%AF%D8%A8%DB%8C%D8%B1%D8%AE%D8%A7%D9%86%D9%87) ا ببینید متوجه منظورم خواهید شد (FrmReortImportLetters)

c_doost
سه شنبه 29 فروردین 1391, 17:39 عصر
نه متاسفانه
من میگم اول نام شهر رو چک کن . اگه توی شرطت هست اونو به اخر select اضافه کن
بعد جنسیت رو چک کن . اگه توی شرطت هست اونو با and به اخر select اضافه کن
بعد ...

اینی که شما نوشتی واسه مثلا 10 تا خصیصه میشه 1024 حالت !!!! ولی اینجوری که گفتم میشه 10 تا شرط
اگه متوجه منظورم نشدی توی یه مثال توضیح بدم

لطف کن و مثال بزن
روشی که میگی تمام این سناریو ها را جواب میده ؟

masoudmok
سه شنبه 29 فروردین 1391, 20:15 عصر
85889

با این مشکلت حل میشه

c_doost
سه شنبه 29 فروردین 1391, 21:50 عصر
دوست عزیز سپاسگزارم

ظاهرا کارم را راه میندازه ولی میشه یه لطف کنی و ریز توضیح بدید تا بیشتر از کد نویسی اون سر در بیارم بخصوص نقش متغیر b در اینجا

همینجا توضیح دبد تا همه استفاده کنند
با تشکر

masoudmok
چهارشنبه 30 فروردین 1391, 12:34 عصر
سلام
همینطور که میبینی به تعداد خصوصیت ها شرط دارم
داخل هر شرط باز شرطی وجود داره به صورت if و else
مسلما بین شروط باید از and استفاده کرد . همه ی شرط ها به جز اولی
متغیر b با t و f شدنش مشخص می کنه که نیازی به جمع کردن and با رشته هست یا نه

c_doost
شنبه 02 اردیبهشت 1391, 07:59 صبح
سلام
نظر من اینه که چنین فرم هایی به این شکل طراحی نشه که با هر تغییر کوچک در پارامترهای جستجو، شما بازخوانی رو از بانک انجام بدید.
اگر منبع داده شما از جای دیگری تغییر نمی کند (تک کاربره)، میتونید در همان اولین خواندن از بانک و نمایش،تمامی اطلاعات بانک را خوانده و در یک لیست، ذخیره کرده و جستجو را در آن انجام دهید.
البته این کار مستلزم نوشتن سناریویی با ساختار شی گرا هست (برای موجودیت های بانک مپینگ انجام شده باشد و کلاس تعریف شده باشد)
--
این نمونه برنامه (http://barnamenevis.org/showthread.php?305795-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%B3%D8%A7%D8%AF%D9%87-%D8%AF%D8%A8%DB%8C%D8%B1%D8%AE%D8%A7%D9%86%D9%87) ا ببینید متوجه منظورم خواهید شد (FrmReortImportLetters)

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

با تشکر

masoudmok
شنبه 02 اردیبهشت 1391, 08:53 صبح
منظور دوستمون اینه که اگه توی برنامتون زیاد عمل سرچ رو با حالات مختلف انجام میدید بهتره که ...
به جای اینکه هر دفعه اطلاعات رو از روی هارد و فایل های دیتا بیس بخونین کل اطلاعات رو بیارین روی ram و از اونجا select بگیرین .
صحبتشون کاملا درسته و مشخصه تبهر خوبی دارن . منتها دو تا مسئله هست .
اول این که در صورت بزرگ بودن جدول این کار عملی نیست . چون خود سیستم عامل اطلاعات ram رو به page file توی هارد منتقل می کنه .
در ثانی وظیفه ی data base manager همینه دیگه . مثلا sql داده هایی که بیشتر مورد دستیابی قرار میگیرند رو ایندکس می کنه که روی دیسک بتونه بهشون سریعتر دسترسی داشته باشه .
البته بازم میگم . صحبت اسپرینگ عزیز درسته و حتی با توجه به دو نکته ی بالا باز میتونه موثر باشه . میتونی از dataset یا datatable واسه این کار استفاده کنی .