PDA

View Full Version : فیلتر کردن بصورت شرطی



mohsenrahx
شنبه 31 شهریور 1386, 13:39 عصر
سلام
من برنامه ای دارم که در اون یک بانک دارم که مثلا 5 تا فیلد داره
روی فرمم 5 تا ادیت می زارم و یک باتون هم روی فرم قرار می دهم.
روی باتون دو بار کلیک می کنم و داخل اون دستور فیلتر رو وارد می کنم.

table1.Filtered:=false;
table1.Filter:='fieldname = ' + QuotedStr(edit1.text);
table1.Filtered:=true;

حالا با توجه به کد بالا من می خواهم که مثلا اگر ادیت1 من خالی نبود کد با لا رو اجرا کنه.
حالا ممکنه بگید خوب اولش یه دستور if می زاریم درست می شه.
اما نه فرض کنید من می خواهم که بر اسال دو فیلد با داده های که از دو ادیت وارد می شود با نک رو فیلتر کنم.
مثلا دوفیلد a و b رو با دو ادیت به نامهای ادیت 1 و ادیت 2 رو می خواهم فیلتر کنم بس در باتون باید بنویسم.

table1.Filtered:=false;
table1.Filter:='a = ' + QuotedStr(edit1.text)+'and'+ 'b = ' + QuotedStr(edit2.text);
table1.Filtered:=true;

اما من می خواهم که اگر یکی از ادیت ها خالی بود با اون ادیت کار نداشته با شه و بر اساس اون ادیتی مه خالی نبود کار انجام بده مثلا ادیت 1 خالی ولی در ادیت 2 می نویسیم 123 که با ید با فیلد a کار نداشته باشه و بر اساس ادیت 2 فیلد b رو فیلتر کنه .
در این کلر چها حالت ممکنه رخ بده مثلا یک با ادیت 1 خالی و ادیت 2 پر. یک بار ادیت دو خالی و ادیت 1 پر. یک بار هر دو خالی که اصلا نباید فیلتر کنه و یک بار هم ممکنه هر دو پر باشه.
حالا این برای دو فیلد از بانکه تصور کنید بانک من 25 فیلد داره اون وقط این تعداد حالات ممکنه به 11645 حالت می رسه.
من می خواهیم که با یک خط همه این کار ها رو انجام بدم می دونم می شه ولی کدشو ندارد هر کسی دارده لطفا برای استفاده همه بزاره.
ممنون از وقتی که صرف خوندن این مطالب کردید.

m-khorsandi
شنبه 31 شهریور 1386, 14:37 عصر
اول باید به شکلی تناظر بین فیلدها و Edit ها رو مشخص کنی،
این کار رو کردی؟

m101_30
یک شنبه 01 مهر 1386, 09:49 صبح
Var StrSQL:String;
begin
Strsql:='';
If (Edit1.Text<>'') or (Edit2.Text<>'') or (Edit3.Text<>'') Then
Begin
If (Edit1.Text<>'') Then
Strsql:='a= '''+Edit1.Text+''' and';
If (Edit2.Text<>'') Then
Strsql:=Strsql+' b= '''+Edit2.Text+''' and';
If (Edit3.Text<>'') Then
Strsql:=Strsql+' c= '''+Edit3.Text+''' and';
End
Else
Strsql:=Strsql+' and';

Strsql:=LeftStr(Strsql,length(Strsql)-3);
table1.Filtered:=false;
table1.Filter:=Strsql;
table1.Filtered:=true;
End;

SYNDROME
یک شنبه 01 مهر 1386, 20:13 عصر
با سلام
می توانستید به جای این کار دستور را اینجوری بنویسید.


SQL := '';
Flag := False;
IF Edit1.Text <> '' Then
Begin
SQL := ' A='''+Edit1.Text+'''';
Flag := True;
End;
IF Edit2.Text <> '' Then
Begin
IF Flag Then SQL := SQL + ' And ';
SQL := SQL + ' B='''+Edit2.Text+'''';
Flag := True;
End;

موفق باشید

mohsenrahx
یک شنبه 01 مهر 1386, 20:15 عصر
سلام ممنون از اینکه جواب دادی اما باید بگم این چیزی نیست که من می خوام .
تمام دستور های بالا رو که نوشتی من نمی خوام بنویسم .
چرا نمی خواهی بنویسی؟
جواب : چون که من 25 فیلد دارم و 25 ادیت اون وقت کد بالا حدود 25 هزار خط می شه کل برنامه من این قدر خط نمی شه.

mohsenrahx
یک شنبه 01 مهر 1386, 20:34 عصر
من یک چیز شبیه این می خواهم
table1.Filter:=if edit1.text<>' ' then begin 'a = ' + QuotedStr(edit1.text) end;;

SYNDROME
یک شنبه 01 مهر 1386, 21:56 عصر
با سلام


جواب : چون که من 25 فیلد دارم و 25 ادیت اون وقت کد بالا حدود 25 هزار خط می شه کل برنامه من این قدر خط نمی شه.
می توانی از ComponentCount استفاده کنی و با یک حلقه مشکل را حل کنی.
موفق باشید

m-khorsandi
دوشنبه 02 مهر 1386, 07:27 صبح
از راهی که Syndrome پیشنهاد کرده هم میتونی استفاده کنی،
از دلفی 6 به بعد ویژگی IfThen به دلفی اضافه شده که به شکل زیر میتونی‌ از اون استفاده کنی :



sFilter := IfThen(Length(Edit1.Text) <> 0, ' Field_A = ' + Edit1.Text) + IfThen(Length(Edit2.Text) <> 0, ' And Field_B = ' + Edit2.Text);

mohsenrahx
دوشنبه 02 مهر 1386, 14:01 عصر
خوب خدا رو شکر داریم به جاهایی می رسیم
سوال: من از دلفی ورژن 7 استفاده می کنم اما ifthen رو تشخیص نمی ده و این خطا رو می ده
[Error] Unit1.pas(39): Undeclared identifier: 'IfThen'
اون sfilter که نوشتی از مقدار بازگشتی intgere است و با دستور زیر ست نیست
table1.Filter:=Sfilter
یعنی خطا می گیره که سمت چپ عبارت ار نوع string است و سمت راست عبارت از نوع integer است.
در ضمن از بانک دی بی استفاده کردم.
اگه بشه این کد رو با توجه به کدی که در ابتدا (پست اول) گفتم بنویسی برام بزاری ممنون می شم.
یک چیز دیکه کامپوننتی که Syndrome گفته چیه و چه خاصیتی داره و از کجا می شه پیدا کرد.

m-khorsandi
دوشنبه 02 مهر 1386, 14:10 عصر
یونیت StrUtils رو Use کن.

SYNDROME
دوشنبه 02 مهر 1386, 22:32 عصر
با سلام


یک چیز دیکه کامپوننتی که Syndrome گفته چیه و چه خاصیتی داره و از کجا می شه پیدا کرد.
دوست عزیز این یک کامپونت نیست یک دستور است که برای خواندن کلیه Objectهای روی فرم به کار می رود.
برای دیدن مثالهای فوق کلمه ComponentCount را جستجو کنید.




sFilter := IfThen(Length(Edit1.Text) <> 0, ' Field_A = ' + Edit1.Text) + IfThen(Length(Edit2.Text) <> 0, ' And Field_B = ' + Edit2.Text);


با احترام
ولی آقا محمد گل اکر مقدار Edit1.Text خالی و Edit2.Text پر باشد آن وقت جواب شرط به شکل زیر می شود که خطا است.(اگر اشتباه می کنم بنده را راهنمایی کنید)


sFilter := ' And Field_B = ' + Edit2.Text

موفق باشید

m-khorsandi
سه شنبه 03 مهر 1386, 07:40 صبح
علی جان این یک نمونه بود از دستور IfThen که مطمئناً نیاز به کنترل بیشتری دارد.