PDA

View Full Version : نحوه جستجو +فیلتر+فیلتر در دیتابیس؟



Mahdiseif
یک شنبه 28 دی 1382, 12:21 عصر
سلام بر دوستان

اگر بخواهیم در چند فیلد جستجو و فیلتر ایجاد کنیم به چه نحو باید عمل شود:
1-از بین اسامی نامهایی را انتخاب میکنیم مانند محمد علی حسن حسین (فیلد name)

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c,d:String;
begin
a:='mohamad';
b:='ali';
c:='hasan';
d:='hosein';
DBISAMQuery1.Close;
DBISAMQuery1.SQL.Clear;
DBISAMQuery1.SQL.Add('select * from Table where name='+ QuotedStr(a)+
'or name='+QuotedStr(b)+
'or name='+QuotedStr(c)+
'or name='+QuotedStr(d));
DBISAMQuery1.Open;
end;
2-از نتیجه بالا افراد 20 و 30 ساله فیلتر میشود(فیلد old)

DBISAMQuery1.Filtered:=false;
DBISAMQuery1.Filter:='old='+QuotedStr(e)+'or old='+QuotedStr(f);
DBISAMQuery1.Filtered:=true;
3-از نتیجه بالا افراد تهرانی و مشهدی و اصفهانی فیلتر شود.(فیلد city)

مرحله 1 و2 به خوبی انجام میشود ولی برای مرحله سوم و یا احیانا مرحله چهارم و... چه باید کرد؟
---

مهدی کرامتی
یک شنبه 28 دی 1382, 12:45 عصر
در دستور Select بجای = از Like استفاده کنید.

Mahdiseif
یک شنبه 28 دی 1382, 17:08 عصر
جناب کرامتی

ظاهرا منظور شما را درست متوجه نشدم. از مرحله اول و دوم نتایج صحیحی میگیرم ولی برای مراحل بعدی ؟؟

اگر شرایط مرحله دوم را در مرحله اول بگنجانم و از or استفاده کنم نتیجه غلط بدست میاید. و اگر از and استفاده کنم و دو شرط بگذارم اصلا جواب نمیدهد


procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c,d,e,f:String;
begin
a:='mohamad';
b:='ali';
c:='hasan';
d:='hosein';
e:='20';
f:='30';
DBISAMQuery1.Close;
DBISAMQuery1.SQL.Clear;
DBISAMQuery1.SQL.Add('select * from Table where name like'+ QuotedStr(a)+
'or name like'+QuotedStr(b)+
'or name like'+QuotedStr(c)+
'or name like'+QuotedStr(d)+
'and old like'+QuotedStr(e)+
'and old like'+QuotedStr(f));
DBISAMQuery1.Open;
end;

من میخواهم بعد از اینکه از دستور select نتیجه گرفتم در ان نتیجه فیلتر سن افراد انتخاب شده انجام گیرد و در مرحله بعد از نتیجه فیلتر اول به سراغ فیلتر دوم بروم و همین طور حلقه را تنگتر کنم.
--

moradi_am
یک شنبه 28 دی 1382, 18:45 عصر
DBISAMQuery1.Filtered:=false;
DBISAMQuery1.Filter:='old='+QuotedStr(e)+'or old='+QuotedStr(f);
DBISAMQuery1.Filtered:=true;


دستور فوق فیلتر قبلی را از بین میبرد برای حفظ فیلتر قبلی و اضافه نمودن فیلتر جدید باید از دستور زیر استفاده کنید :


DBISAMQuery1.Filter:=DBISAMQuery1.Filter+'......';

Mahdiseif
یک شنبه 28 دی 1382, 23:19 عصر
سلام
جناب کرامتی و جناب مرادی سپاسگزارم.

با روش زیر مشکل حل شد


procedure TForm1.Button1Click(Sender: TObject);
var
a,b:string;
begin
a:='Mohammad';
b:='Ali';
DBISAMQuery1.Close;
DBISAMQuery1.SQL.Clear;
DBISAMQuery1.SQL.Add('select * from Table where Name in('+QuotedStr(a)+','+
QuotedStr(b)+ ')');
DBISAMQuery1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
c,d,e,f:string;
begin
c:='20';
d:='30';
e:='Tehran';
f:='Meshad';
DBISAMQuery1.Filtered:=false;
DBISAMQuery1.Filter:='Old in('+QuotedStr(d)+','+QuotedStr(c)+')'+
'and City in('+QuotedStr(e)+','+QuotedStr(f)+')';
DBISAMQuery1.Filtered:=true;
end;

شایان ذکر است که سرعت جستجو نسبت به قبل چند برابر افزایش یافت.