View Full Version : سوال: جستجو بر اساس همه فیلد ها
xboycooper
یک شنبه 11 مهر 1389, 19:21 عصر
سلام دوستان :چشمک:
من یه dbgrid دارم 30-40 تا فیلد(ستون) داره . ممکنه بر اساس هر کدوم از فیلدها نیاز به جستجو داشته باشیم . یا اینکه به صورت ترکیبی (مثلا شرکتهایی با گرایش خدماتی و سرمایه اولیه بیشتر از 10 میلیون) البته خیلی از این ترکیب ها هستش .
چطور میتونم همچین فرم جستجویی درست کنم ؟
البته اگر dbgrid با خاصیت فیلتر مثل excel که بالای هر ستون داده های داخل اوفیلد هستش وجود داشته باشه مشکل تا حد زیادی حل میشه
ممنون
Felony
یک شنبه 11 مهر 1389, 20:20 عصر
سوالتون مربوط به بخش بانک های اطلاعاتی میشه نه مباحث عمومی ؛
میتونید از یه ADOQuery استفاده کنی ، وقتی اطلاعات جدولت رو به وسیله ADOQuery فیلتر کنی ADOQuery فیلتر چندگانه در اختیارتون میزاره ، یعنی وقتی مثلا بانکتون رو بر اساس فیلد X فیلتر میکنید این فیلتر تا زمانی که لغوش نکنید باقی میمونه و میتونید دوباره رو همین فیلتر یه فیلتر دیگه اجرا کنید ، مثلا ابتدا کسانی که سنشون 18 سال است و سپس کسانی که نامشان علی هست رو فیلتر کنید ، اینطوری افرادی که 18 سالشون هست و اسمشون علی هست به عنوان نتیجه فیلتر نمایش داده میشن .
xboycooper
یک شنبه 11 مهر 1389, 20:36 عصر
ممنون ولی مشکل اینجاست مشخص نیست کدوم فیلدها میخوان جستجو بشن ! شاید کاربر همزمان 3-4 تا فیلد رو بخواد فیلتر کنه ...مثلا اسم و سن و شهر و ...
در کل من باید یه فرم با همه فیلد ها طراحی کنم و یه دکمه جستجو بذارم و هر کدوم از فیلدها که پر بود بر اساس اونها جستجو انجام بشه ؟
Felony
یک شنبه 11 مهر 1389, 22:05 عصر
ممنون ولی مشکل اینجاست مشخص نیست کدوم فیلدها میخوان جستجو بشن ! شاید کاربر همزمان 3-4 تا فیلد رو بخواد فیلتر کنه ...مثلا اسم و سن و شهر و ...
در کل من باید یه فرم با همه فیلد ها طراحی کنم و یه دکمه جستجو بذارم و هر کدوم از فیلدها که پر بود بر اساس اونها جستجو انجام بشه ؟
بله ، با همون روشی که گفتم میتونید پیاده سازیش کنید .
Delphi7_love
دوشنبه 12 مهر 1389, 09:08 صبح
من به شکل زیر استفاده میکنم
if e8.Text<>'' then
s:=s+' And field1>='+e8.Text+';
if e10.Text<>'' then
s:=s+' And field2>='+e10.Text+';
if e12.Text<>'' then
s:=s+' And field3>='+e12.Text+';
adq.SQL.Clear;
Adq.SQL.Add('select * from table1 where'+' '+s+' '+'order by field1 desc');
adq.Open;
از اول هر ادیت رو چک میکنم و اگر مقدار داشت اونو در به s اضافه میکنم و درنهایت برای شرطم استفاده میکنم
gbg
دوشنبه 12 مهر 1389, 11:15 صبح
من به شکل زیر استفاده میکنم
if e8.Text<>'' then
s:=s+' And field1>='+e8.Text+';
if e10.Text<>'' then
s:=s+' And field2>='+e10.Text+';
if e12.Text<>'' then
s:=s+' And field3>='+e12.Text+';
adq.SQL.Clear;
Adq.SQL.Add('select * from table1 where'+' '+s+' '+'order by field1 desc');
adq.Open;از اول هر ادیت رو چک میکنم و اگر مقدار داشت اونو در به s اضافه میکنم و درنهایت برای شرطم استفاده میکنم
من هم از این روش استفاده می کنم ، فکر کنم or رو برای همین کار تو دستورات sql گذاشتن
arshad89
دوشنبه 12 مهر 1389, 11:36 صبح
سلام
راه درست اینه که شما برای قسمت where اول یه شرط همیشه درست بذاری. ممکنه کاربر هیچ کدام از موارد رو انتخاب نکنه و بخواهد که کل جدول را نمایش بده. تازه شما ابتدای هر s یک And گذاشتی. اینطوری اگر کاربر فیلدی را انتخاب کنه اینطور میشه
select * from table1 where And field1> e1.text
و اینطوری خطا میده.اینطوری عمل کن.در ابتدا s را مقدار دهی کن.
s:='select * from table1 where 1=1';
حالا همه شرط هاتو که خودت نوشتی بنویس.
Delphi7_love
دوشنبه 12 مهر 1389, 12:11 عصر
سلام
راه درست اینه که شما برای قسمت where اول یه شرط همیشه درست بذاری. ممکنه کاربر هیچ کدام از موارد رو انتخاب نکنه و بخواهد که کل جدول را نمایش بده. تازه شما ابتدای هر s یک And گذاشتی. اینطوری اگر کاربر فیلدی را انتخاب کنه اینطور میشه
select * from table1 where And field1> e1.text
و اینطوری خطا میده.اینطوری عمل کن.در ابتدا s را مقدار دهی کن.
s:='select * from table1 where 1=1';
حالا همه شرط هاتو که خودت نوشتی بنویس.
دوست عزیز حرف شما در مورد and درسته ، ولی من اونو از داخل برنامم کپی کردم و چون طولانی نشه اولشو حذف کردم ، من دوتا ادیت واسه تاریخ دارم که برای جستجو در یک بازه زمانیه و اون دوتا با توجه به نیاز برنامه حتما باید مقدار دهی شده باشه ، حالا اگه مقدار نداشت به کاربر پیغام نشون میده
begin
s:='';
if mask_edit(e1.Text)=false then
begin
e1.SetFocus;
exit;
end;
if mask_edit(e2.Text)=false then
begin
e2.SetFocus;
exit;
end;
s:='s_tar>='+quotedstr(e1.Text)+' and s_tar<='+quotedstr(e2.Text)+'';
پس حالا حتما s مقداردهی شده و از این به بعد برای هر ادیت همون کد قبلی رو می نویسم
البته با توجه به نوع فیلد ها یا گذاشتن or نیاز هست یه بازم تغییری در کد انجام بشه،
من روش کارو گفتم و باید با توجه به نوع جستجو تغییر داده بشه.
nilidelphi
دوشنبه 12 مهر 1389, 12:21 عصر
روش هایی که دوستان گفتن همگی درستن مخصوصا روش آقای تاجیک که گفته از فیلتر استفاده کن.
یه روشم من پیشنهاد کنم دیگه....
بنظر من اسم هر Edit رو به اسم همون فیلدی بذار که می خوای جستجو کنی و بعد در یک باتن تمامی Edit هارو چک کن اگه چر بودن اون وقت با استفاده از نام Edit به اون فیلد دسترسی پیدا میکنی و می تونی جستجو کنی
بذار یه مثال بزنم :
فرض کنیم ما دوتا فیلد تو یک جدول با نام TBL1 داریم با نام های F_name,L_name
پس اسم ادیت هامونو به ترتیب مثل فیلد هامون میزاریم
حالا می خواهیم در یک باتن جستجو کنیم:
if (F_name.Text<>'') and(L_name.Text<>'') then
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.ADD('select * from TBL! where ( '+F_name.name+'='+F_name.Text+' ) AND ('+L_name.Name+' ='+L_name.Text+')');
ADOQuery1.Open;
end;
موفق باشید
Delphi7_love
دوشنبه 12 مهر 1389, 13:21 عصر
مخصوصا روش آقای تاجیک که گفته از فیلتر استفاده کن.
سلام
در این روش اگر 40 تا فیلد داشته باشیم که باید 40 بار فیلتر کنیم ، فکر نمی کنم کار جالبی باشه.
فرض کنیم ما دوتا فیلد تو یک جدول با نام TBL1 داریم با نام های F_name,L_name
پس اسم ادیت هامونو به ترتیب مثل فیلد هامون میزاریم
حالا می خواهیم در یک باتن جستجو کنیم:
کد:
if (F_name.Text<>'') and(L_name.Text<>'') then
beginADOQuery1.SQL.Clear;ADOQuery1.SQL.ADD('select * from TBL! where ( '+F_name.name+'='+F_name.Text+' ) AND ('+L_name.Name+' ='+L_name.Text+')')
;ADOQuery1.Open;
end;
باز در این روش که یه مشکل بزرگتر هست
جستجو فقط زمانی انجام میشه که تمام فیلدها مقدار دهی ده باشه در صورتی که دوستمون گفتند مشخص نیست بر اساس یک ، دو یا چند فیلد بخوان جستجو کنن
Felony
دوشنبه 12 مهر 1389, 15:34 عصر
سلام
در این روش اگر 40 تا فیلد داشته باشیم که باید 40 بار فیلتر کنیم ، فکر نمی کنم کار جالبی باشه.
کافی بود یکم روش فکر کنید ، نیازی به 40 بار فیلتر کردن نیست .
روال زیر رو براتون نوشتم ، کافیه نام فرم و نام ADOQuery و جدول مور نظر برای فیلتر رو بهش بدید :
Procedure FilterSQL(FormName: TForm; Query: TADOQuery; Const TableName: String);
var
i: Integer;
TempSQL: String;
begin
if Query.Active then
for i:= 0 to FormName.ComponentCount - 1 do
if (FormName.Components[i] is TEdit) and (TEdit(FormName.Components[i]).Text<> '') then
if Query.FieldList.Find(TEdit(FormName.Components[i]).Name)<> nil then
begin
if TempSQL= '' then
TempSQL:= 'SELECT * FROM '+ TableName+ ' WHERE '+ TEdit(FormName.Components[i]).Name+ ' LIKE ' + QuotedStr( TEdit(FormName.Components[i]).Text+ '%')
else
TempSQL:= TempSQL + ' AND '+ TEdit(FormName.Components[i]).Name+ ' LIKE ' + QuotedStr( TEdit(FormName.Components[i]).Text+ '%');
Query.Close;
Query.SQL.Clear;
Query.SQL.Add(TempSQL);
Query.Open
end;
end;
استفاده :
FilterSQL(Form1, ADOQuery1, 'TBL_Member');
نکته : نام Edit ی که توش متن مورد نظر برای جست و جو نوشته میشه باید همنام با فیلد مورد نظر باشه ، مثلا برای جست و جو تو فیلد Name باید اسم شئ Edit هم Name باشه .
موفق باشید .
Delphi7_love
دوشنبه 12 مهر 1389, 17:34 عصر
به نظر شما آقای تاجیک برای جستجو ، فیلتر بهتره یا استفاده از where ؟
اگه کاربرد هرکدوم رو بگید ممنون میشم
xboycooper
دوشنبه 12 مهر 1389, 20:57 عصر
از همه دوستانی که پاسخ دادن واقعا ممنونم و یه تشکر ویژه از آقای تاجیک دارم . واقعا روش عالی بود و جواب داد :تشویق:
idehrayan
دوشنبه 28 مهر 1393, 09:24 صبح
سلام
من این مشکل رو با استفاده از یک ComboBox1 حل کردم روشش اینطوری هستش که:
ابتدا نام کلیه فیلدهایی رو که میخواهیم بر اساس ان جستجو انجام بشه رو تو ایتم کامبوباکس اضافه کردم
حالا کاربر از کامبوباکس فیلد مورد نظرش رو انتخاب میکنه و در کد جستجو بجای نام فیلد مورد جستجو مقدار متن کامبو باکس قرار میگیره
موفق باشین
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.