PDA

View Full Version : جستجو



matinebi
یک شنبه 17 آذر 1392, 18:31 عصر
با سلام با توجه به کد زیر اگه کاربر تاریخ وارد کند جستجو به درستی انجام میپذیرد ولی میخوام اگه کاربر هیچ تاریخی وارد نکنه جستجو فقط بر اساس فیلد namekar انجام گیرد

with main.ADOQuery2 do
begin
SQL.Clear;
SQL.Add('select * from kar');
SQL.Add('where(namekar like''%'+Edit2.Text+'%'')and (date1 between '''+ComboBox8.Text+'/'+ComboBox6.Text+'/'+ComboBox1.Text+''' and '''+ComboBox9.Text+'/'+ComboBox7.Text+'/'+ComboBox5.Text+''')');
open;
end;

چطور این کار رو انجام دهم

یوسف زالی
یک شنبه 17 آذر 1392, 20:51 عصر
سلام.


date1 = '''' or date1 between ...

matinebi
چهارشنبه 20 آذر 1392, 19:54 عصر
با تشکر از شما. ولی منظورم از اینکه کاربر تاریخ وارد کند در فرم جستجو است نه در فرم ثبت ........تاریخ در تمامی رکورد ها ثبت میباشد فقط میخواهم کد جستجو را طوری بنویسم که اگر تاریخی وارد نشد(در فرم جستجو) جستجو فقط بر اساس فیلد namekar و اگر تاریخی وارد شد جستجو هم بر اساس namekar و هم بر اساس date1 صورت پذیرد

یوسف زالی
چهارشنبه 20 آذر 1392, 21:43 عصر
دو راه دارید:
1- تاریخ ها در وهله اول از 1300/01/01 باشد تا 1500/12/30
2- باکس تاریخ شما قابلیت خالی بودن داشته باشد

حالت دوم رو توضیح می دم:
فرض کنیم باکس تاریخ یک ادیت هست،


where Date between @D1 and @D2 or @D1 = ''

به جای D@ ها مقدار درون ادیت رو می گذارید.

ATULICUS
پنج شنبه 21 آذر 1392, 15:16 عصر
سلام به همه دوستان !

جواب یوسف از نظر منطقی درسته اما من موفق به پیاده سازی قسمت or نشدم (بسوزه پدر بیسوادی :لبخند: )


or @D1 = ''

ارور data type mismatch میده !


اما ...

من این مشکل رو به این شکل حل کردم :
حرفه ای نیست اما کار راه انداز ه


procedure TForm3.btn_searchClick(Sender: TObject);
begin

if (edt_start.Text <> '') and (edt_end.Text <> '') then

begin


with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from users');
SQL.Add('where (fname like ''%sa%'') ') ;
SQL.Add(' and ( (start_date > :edt_start ) and (start_date < :edt_end) ) ');
Parameters.ParamByName('edt_start').Value := edt_start.Text ;
Parameters.ParamByName('edt_end').Value := edt_end.Text ;

Open;

end;

end
else
begin

with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from users');
SQL.Add('where fname like ''%sa%'' ');
Open;

end;

end;

end;




میدونم راه های دیگه ای هم حتما داره ، این ساده ترینش بود .

______

جدای از جواب این تاپیک بحث جستجو و فیلتر گذاری با کوئری بحث جالبیه !

یه سوال :

"حتما برنامه های دیتابیسی رو دیدید که در قسمت گزارش و جستجو انواع و اقسام فیلتر ها رو روی فرم گذاشتن ، اعم از تاریخ ، متن و ... و با زدن دکمه جستجو ، جستجو بر اساس فیلد هایی که تنظیم شدن صورت میگیره و اون فیلد هایی که خالی هستند تاثیری در نتیجه جستجو ندارند"

میخواستم ببینم این داستان چطوریه و آیا مثل من واسه هر شرایط یه کوئری جدا مینویسن ، یا داستان چیزه دیگه است !!؟


بسه دیگه ، خیلی حرف زدم :لبخند:
پیشاپیش ممنون از راهنمایی هاتون !

__________
موفق باشید

ATULICUS
شنبه 23 آذر 1392, 11:01 صبح
هیچکس نظری نداره !؟

matinebi
شنبه 23 آذر 1392, 19:49 عصر
با تشکر از شما دوست عزیز با استفاده از دستورات if میشه این کار رو انجام داد اما اگه تعداد انتخاب های جستجو بیشتر باشد با دستورات if خیلی مشکل میشود
من دقیقا دنبال این مطلب شما میگردم چطور میشه"با زدن دکمه جستجو ، جستجو بر اساس فیلد هایی که پر شدن صورت میگیره و اون فیلد هایی که خالی هستند تاثیری در نتیجه جستجو ندارند""

یوسف زالی
سه شنبه 26 آذر 1392, 21:15 عصر
اگر دقت کرده باشید در همون کدی که گذاشتم مطلب تمامه. می تونید با ترکیبش تمام حالات رو در بیارید.


select * from TBL where
(@F1 = 0 or F1 = @F1)
and (@F2 = 0 or F2 = @F2)
and (@F3 = '' or F3 = @F3)
.
.

باید جایگذاری مناسب انجام بشه و مقادیر پیش فرض مناسب در نظر گرفته بشه. همین.