View Full Version : ADO+FilterOptions
behrooz
جمعه 19 فروردین 1384, 19:28 عصر
من میخوام این نام رو فیلتر کنم
محمد*
تمام کسانی که نام آنها با محمد شروع میشه
ولی ADOTable جواب نمیده
ADOTable1.FilterOptions:=[FoNopartailcompair]
ADOTable1.Filter:='محمد*'
vcldeveloper
شنبه 20 فروردین 1384, 03:42 صبح
وقتی شما از FoNopartailcompair استفاده می کنید، یعنی از DataSet میخواید که * رو بعنوان یه حرف (جزپی از فیلتر) در نظر بگیره، نه بعنوان یک Wildcard.
به متن زیر از راهنمای دلفی توجه کنید:
foNoPartialCompare Asterisks (*) in the filter are treated as literal characters rather than as wildcards. When filter options does not include foNoPartialCompare, strings that end in an asterisk signify a partial string match with the asterisk matching any number of characters.
در نتیجه شما نباید از ADOTable1.FilterOptions:=[FoNopartailcompair] استفاده کنید، چون نتیجه کار دقیقا عکس اون چیزی که شما میخواید میشه!
MOHSEN731
دوشنبه 29 فروردین 1384, 18:37 عصر
علی آقا من هم اساسی مشکل بالا را به صورت زیر دارم اگه عنایتی کنید ممنون میشم :
من در برنامه ام از AdoTable برای ارتباط با فایل اکسس خود استفاده کرده ام حال من در قسمتی از برنامه نیاز دارم که فیلدها name خود را به صورت Name = *Ali* فیلتر کنم یعنی تمام رکوردهایی که در آن (چه اول و چه وسط یا آخر) Ali بود را فیلتر کند مثل Alireza,MoammadAli,..
البته در sql من بوسیله دستور Like %ali% اینکار را انجام می دهم ولی اینجا چون از AdoTable استفاده می کنم اینکار شدنی نیست البته وقتی هم از AdoQuery استفاده می کنم این عمل فقط در اول open شدن بانک امکان بکار بری sql در آن وجود دارد و هر بار که در برنامه توسط کاربر فیلتر می شود باید بانک را بسته و دوباره با دستور sql جدید که شامل فیلتر جدید است باز کنم که این هم به دلیل اینکه من می خواهم از این روش در قسمت جستجو استفاده کنم مشکل هست البته کامپوننت ClientDataSet امکانات فیلتر کردن قوی دارد و نیاز من را بر طرف می کند ولی نوع بانکی که استفاده می کند نمی تواند از نوع اکسس باشد حال از دوستان سوال دارم که چگونه می توان از امکانات فیلتر در ClientDataSet را در Adotable استفاده کرد یا اگر دوستان راه بهتری برای این مشکل می دانند ارائه کنند
شرمنده از اینکه طولانی شد.
:cry: :oops: :embr: ممنون
V60
دوشنبه 29 فروردین 1384, 20:00 عصر
سلام
ببین فکر می کنم مشکل اینکه ADOquery را باید برایش پارامتر تعریف کنی
یعنی اینکه در کد نویسی که در SQL مربوطه انجام می دهی قبل از هر چیز متغیری که می خواهی تعریف کنی
علامت نقل قول بگذاری یعنی پارامتر temp: در این حالت temp یک پارامتر می شود که می توانی درون کد نویسی از آن استفاده کنی به این ترتیب
ADOStoredProc1.Close;
ADOStoredProc1.Parameters.ParamByName('temp').Valu e:=Edit1.Text;
ADOStoredProc1.Open;
با این کار نیازی نیست که کل محتویات Sql را تغییر بدهی
امیدوارم که این مشکلت را تا حدودی حل کرده باشه
:wink:
MOHSEN731
سه شنبه 30 فروردین 1384, 18:43 عصر
اصلاح شد: دوست عزیز، خواهشا حاشیه نرید.
یه تستی می کنم خبر می دم :موفق:
net_ved
یک شنبه 24 شهریور 1387, 08:59 صبح
البته درسته که این مطلب مال خیلی قبله ولی من هم به این مشکل بر خوردم
مشکل استفاده از Query.SQL اینه که با هر بار اجراع این فرمان تمام محتویات جدول دوباره از سرور درخواست می شه و این کار نرم افزار رو کند می کنه مخصوصا اگه جدول بزرگ باشه ...
ولی فیلتر کردن داخل رم صورت می گیره که خیلی سریع تره
جناب آقای کشاورز ADOTable1.Filter:='محمد*' تست کردم کار نمی کنه ... واسم جالبه چون همین فرمان روی جداول BDE کار می کنه ... با اینکه هردو تو یونیت DB هستن و فکر می کنم یکی باشن
فرمان ADOTable1.FilterOptions:=[foNoPartialCompare]; هم زمان اجرا خطا میده
vcldeveloper
یک شنبه 24 شهریور 1387, 13:17 عصر
مشکل استفاده از Query.SQL اینه که با هر بار اجراع این فرمان تمام محتویات جدول دوباره از سرور درخواست می شه و این کار نرم افزار رو کند می کنه
این طبیعی هست. در همه محیط های توسعه نرم افزار به همین شکل هست. وقتی شما SQL را تغییر میدید، دیگه داده های موجود در دیتاست معتبر نیستند، و باید داده های جدید با توجه به دستور جدید دریافت بشند.
مخصوصا اگه جدول بزرگ باشه ...
خیلی کم پیش میاد که یک برنامه در نیاز داشته باشه کل رکوردهای یک جدول بزرگ را یکجا به کلاینت منتقل بکنه. شما باید مدیریت بکنید که فقط داده های مورد نیاز کاربراز بانک دریافت بشند.
ولی فیلتر کردن داخل رم صورت می گیره که خیلی سریع تره
فیلتر کردن نیاز داره که کل رکوردهای جدول در حافظه کلاینت لود بشند، یعنی هم حافظه زیادی مصرف میکنه، هم در هنگام Open کردن جدول، اگر جدول بزرگ باشه، باید زمان بیشتری را صبر کنید تا جدول باز بشه. فیلتر زمانی مناسب هست که شما بخواهید مقداری را در داخل رکوردهای فعلی یک دیتاست جستجو کنید، نه مقداری در کل یک جدول بانک اطلاعاتی.
جناب آقای کشاورز ADOTable1.Filter:='محمد*' تست کردم کار نمی کنه ... واسم جالبه چون همین فرمان روی جداول BDE کار می کنه ... با اینکه هردو تو یونیت DB هستن و فکر می کنم یکی باشن
اینکه در یک یونیت تعریف شدند، دلیلی بر اینکه یکی باشند نیست؛ در واقع هم یکی نیستند.
درباره کارکرد Wildcats در فیلتر برای ADO قبلا تاپیک هایی زده شده بود.
فرمان ADOTable1.FilterOptions:=[foNoPartialCompare]; هم زمان اجرا خطا میده
بله، چون FilterOptions در ADO پیاده سازی نشده، فقط چون در TDataset وجود داشته، به دیتاست های ADO هم به ارث رسیده، ولی این دیتاست ها متد SetFilterOptions را override نکردند.
net_ved
یک شنبه 24 شهریور 1387, 15:33 عصر
جستجو کردم ... هیچ مورد تازه ای یافت نشد.
آقای کشاورز شما از چه تکنیکی برای بار کردن اطلاعات استفاده می کنید
و از چه تکنیکی برای جستجو بین رکرد ها .... مثلا من می خوام تو یه لیست از مشتری ها با استفاده از خاصیت OnChenge یک Edit اسم مشتری رو جستجو کنم ... خوب حلا به نظر شما باید با هر بار cheng شدن داخل edit یه درخواست جدید به Server فرستاده بشه ... یعنی کد زیر درسته ؟
ADOQuery.Close;
ADOQuery.SQL.Text:='select * from Table where FName Like ''+Edit.text+'%'+'';
ADOQuery.Open
آیا این کار درسته ؟
vcldeveloper
یک شنبه 24 شهریور 1387, 15:57 عصر
... یعنی کد زیر درسته ؟
ADOQuery.Close;
ADOQuery.SQL.Text:='select * from Table where FName Like ''+Edit.text+'%'+'';
ADOQuery.Open
آیا این کار درسته ؟
میتونه درست باشه. بستگی به نوع بانک اطلاعاتی شما، سرعت اتصال کلاینت به سرور بانک اطلاعاتی، و حجم داده های برگشت داده شده داره. در ضمن، سرعت همون کوئری را میشه از طریق استفاده از Parameter ها تا حدودی افزایش داد.
درباره افزایش کارایی برنامه های بانک اطلاعاتی خیلی در سایت صحبت کردیم.
V60
پنج شنبه 26 دی 1387, 12:12 عصر
آقای کشاورز سلام
من خودم سه سال پیش یک جوابی به این پست دادم
ولی حالا خودم توش موندم
من یک سوال ساده می کنم و یک جواب ساده می خواهم
چطور به وسیله فیلتر ، ( نه کوری) می توان به سوال اینکه یک چیز با محمد شروع بشه را جواب داد.
من این کد را امتحان کردم و برای اینکه محمد هر جای رکورد باشه جواب می ده
ولی من می خواهم فقط با محمد شروع بشه و این مشکله
QryTransfer.Filter:='Name like ''%'+edit1.text+'%'''
V60
پنج شنبه 26 دی 1387, 12:14 عصر
البته بگم % آخری را هم بر می دارم ولی باز هم جواب نمی ده
V60
پنج شنبه 26 دی 1387, 12:19 عصر
یافتم!!!!
با این مشکل حل می شه ، با جستجوی دوباره در سایت پیدا کردم
adotable1.filter := 'code LIKE ''' + edit1.text + '*''';
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.