PDA

View Full Version : پرسش ای در مورد تکنیک های جستجو



spenans
جمعه 11 دی 1383, 14:57 عصر
با سلام به دوستان عزیز
من همیشه در جستجو ها از فیلتر استفاده کردم ولی مشکل کار در استفاده از فیلتر ها اینه که باید کل کلمه رو بنویسی همچنین وقتی جواب رو پیدا میکنیم فقط اون تو بانک اطلاعاتی هستش و سایر گزینه ها تا آزاد کردن فیلتر نشان داده نمی شه
مقصود من اینه که با زدن یک حرف بتونم اطلاعاتی رو که با اون حرف شروع میشه بدست بیارم نه اینکه کل کلمه رو بنویسم

Mahdi_S_T
جمعه 11 دی 1383, 15:52 عصر
دوست عزیز شما می توانی از تابع Pos استفاده کنی و با زدن هر حرف تمام کلمات مشابه را فیلتر کرد.
موفق باشی

hps
شنبه 12 دی 1383, 12:19 عصر
اگه منظورت جستجو در بانک اطلاعاتیه بهتره از SQL و دستور LIKE استفاده کنى.

hghodsi
دوشنبه 14 دی 1383, 07:04 صبح
اگر ممکن باشد لطفا یک مثال از دستور POS را بزنید . چون من هم با این مسئله مشکل دارم
مخصوصا در جستجوی کلمات فارسی مرکب اگه ممکنه بیشتر توضیح بدهید !!!!!!!

Panje Tala
دوشنبه 14 دی 1383, 10:21 صبح
باسلام
دستور Pos نیاز به کدنویسی و پردازش جانبی دارد که راحتتر است در Event فیلتر یعنی Onfilterrecord شرط را بنویسی.بدین صورت که اگر pos کلمه ای را که شروع به نوشتن آن کردی در فیلد مورد نظر وجود داشته باشد تابع Pos مقداری غیر صفر را بر میگرداند که در اینصورت باید Accept را True کنی در غیر اینصورت Accept برابر False شود. رکوردهایی که به ازای آنها ACcept صحیح باشد نمایش داده میشود.البته برای اعمال باید خاصیت Filtered را False و True کنی.فرض کنیدعبارتی را که داری تایپ میکنی در Edit1 باشدبنابراین برای فیلتر کردن باید در رویداد Onfilterrecord جدول بصورت زیر بنویسی:


If pos(alltrim(edit1.text),table1.fieldbyname('test') .asstring)<>0 then accept:=true
else
accept:=false;

ودر رویدادonchange مربوط به edit1 فیلتر را True و False کنی

در کل
من بیشتر با نظر آقای hps موافقم وبهتر است از Like استفاده کنی.

_alish_
دوشنبه 14 دی 1383, 10:27 صبح
در onchange Edit1 بنویسید


Query.Locate('Name',Edit1.Text,[loPartialKey]);

spenans
پنج شنبه 17 دی 1383, 12:02 عصر
باسلام
دستور Pos نیاز به کدنویسی و پردازش جانبی دارد که راحتتر است در Event فیلتر یعنی Onfilterrecord شرط را بنویسی.بدین صورت که اگر pos کلمه ای را که شروع به نوشتن آن کردی در فیلد مورد نظر وجود داشته باشد تابع Pos مقداری غیر صفر را بر میگرداند که در اینصورت باید Accept را True کنی در غیر اینصورت Accept برابر False شود. رکوردهایی که به ازای آنها ACcept صحیح باشد نمایش داده میشود.البته برای اعمال باید خاصیت Filtered را False و True کنی.فرض کنیدعبارتی را که داری تایپ میکنی در Edit1 باشدبنابراین برای فیلتر کردن باید در رویداد Onfilterrecord جدول بصورت زیر بنویسی:


If pos(alltrim(edit1.text),table1.fieldbyname('test') .asstring)<>0 then accept:=true
else
accept:=false;

ودر رویدادonchange مربوط به edit1 فیلتر را True و False کنی

در کل
من بیشتر با نظر آقای hps موافقم وبهتر است از Like استفاده کنی.
دوست عزیز من از راهنمایی خوبت تشکر میکنم ولی موقع ای که می خوام برنامه رو اجرا کنم یه مشکلی ایجاد میشه
من بعد از ایجاد جدول و edit1 طبق فرمایش جناب عالی در event مربوط به onfilterrecord این تابع رو نوشتم ولی باید alltrim رو بصورت string در ابتدای تابع معرفی کرد وگرنه ایراد میگیره ولی جالبه به خود دستور اولی یعنی pos هم که شکلش رو اینطوری نوتم یه ایراد دیگه گرفت
procedure TForm1.Table1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var
alltrim:string;
begin
if pos(alltrim(edit1.Text),table1.fieldbyname('Name') .asstring)<>0 then
accept:=true
else
accept:=false;
end;
end.
پیغام خطا هم به این صورته
missing operator or semicolon
ولی من هرچی تغییر میدم نمیشه لطفا منو راهنمایی کنید

Mahdi_S_T
پنج شنبه 17 دی 1383, 15:48 عصر
من که همچین تابعی در Help دلفی ندیدم :گیج:

اگر منظورتان حذف فضای خالی از دو طرف رشته مورد نظر است باید از تابع Trim استفاده کنی :موفق:

spenans
پنج شنبه 17 دی 1383, 17:32 عصر
من که همچین تابعی در Help دلفی ندیدم :گیج:

اگر منظورتان حذف فضای خالی از دو طرف رشته مورد نظر است باید از تابع Trim استفاده کنی :موفق:
دوست من این تابع رو یکی از دوستان پاسخ دهنده نوشته من عین اون تابع رو نوشتم با همان جزئیات ولی error میده حالا من کاری ندارم به این که این تابع در help دلفی هستش یا نه برای من مهم حل شدن این مسله هستش

spenans
پنج شنبه 17 دی 1383, 18:22 عصر
من که همچین تابعی در Help دلفی ندیدم :گیج:

اگر منظورتان حذف فضای خالی از دو طرف رشته مورد نظر است باید از تابع Trim استفاده کنی :موفق:
دوست من این تابع رو یکی از دوستان پاسخ دهنده نوشته من عین اون تابع رو نوشتم با همان جزئیات ولی error میده حالا من کاری ندارم به این که این تابع در help دلفی هستش یا نه برای من مهم حل شدن این مسله هستش
دوست خوب من من ALLTRIM رو به TRIM تبدیل کردم و برنامه خیلی خوب حل شد در ضمن دو لینک واسه TRUE و FALSE فیلتر جدول گذاشتم
اما یه سوال اگه من بخوام رو کلمات جلو برم چی أیا واسه این کار هم راه حل ای داری مثلا حرف اول B باشه و بعده این که کلمات با حرف B ضاهر شد ادامه جستجو رئ بصورت BO یعنی کلماتی که حروف اولشون BO هست بیاد
تشکر فراوان :flower:

Mahdi_S_T
پنج شنبه 17 دی 1383, 21:57 عصر
دوست عزیز با همین روش و تابع pos می توان اینکار را کرد یعنی وقتی در edit حرف a را بزنی تمامی a ها ظاهر میشود و وقتی ab را بزنی تمامی db ها فقط باید وقتی از edit خارج میشوی یکبار filter را false و سپس true کنی تا فیلتر جدید اعمال شود

spenans
شنبه 19 دی 1383, 20:19 عصر
دوست عزیز با همین روش و تابع pos می توان اینکار را کرد یعنی وقتی در edit حرف a را بزنی تمامی a ها ظاهر میشود و وقتی ab را بزنی تمامی db ها فقط باید وقتی از edit خارج میشوی یکبار filter را false و سپس true کنی تا فیلتر جدید اعمال شود
مهدی جان من علاوه بر این روش از مقاله ای در مورد تکنیک های جستجو که توسط یکی از دوستان در اول این قسمت نوشته شده بود استفاده کردم یعنی مقاله ای در مورد تکنیک های جستجو قسمت جستجوی گروهی ولی این در مورد بانک اطلاعاتی من که sql server هستش در اطلاعات فارسی درست در نمی یاد ولی روش pos مشکلی نداره اما اون روش بهتر از pos هست چرا که لازم نیست فیلتر رو هی true و false کنیم
اگه دوست من اشکالی در کارم هست منو راهنمایی کن ممنون شما (spenans)

hghodsi
یک شنبه 20 دی 1383, 13:53 عصر
روش pos مشکلی نداره اما اون روش بهتر از pos هست چرا که لازم نیست فیلتر رو هی true و false کنیم

اگر امکان داشته باشد توضیح دهید که چرا از دستور Like استفاده نمی کنید ؟ مگه چه ایرادی داره ؟

spenans
یک شنبه 20 دی 1383, 17:58 عصر
روش pos مشکلی نداره اما اون روش بهتر از pos هست چرا که لازم نیست فیلتر رو هی true و false کنیم

اگر امکان داشته باشد توضیح دهید که چرا از دستور Like استفاده نمی کنید ؟ مگه چه ایرادی داره ؟
دوست عزیز اول از همه می خوام ببینم چرا روش جستجوی گروهی که در مقاله مذکور اومده در sqlserver درست درنمی یاد در حالی که در جداول paradox مشکلی نداره اینه گفتم چون در روش pos با بانک اطلاعاتی sqlserver مشکلی ندارم
ضمنا من همچنان که گفتم همیشه در جستجو ها از روش فیلتر استفاده کردم و اطلاع کلی از روش های مختلف جستجو ندارم به جز روش pos و همان دومین روش پس اگه ممکنه بفرمایید like چطور هستش تا هم من و هم سایر دوستان یاد بگیرند
باز از همه دوستان عزیز که راهنمای من در یادگیری تکنیک های جستجو بودند متشکرم