PDA

View Full Version : search با چندین field



marmar
شنبه 01 دی 1386, 15:30 عصر
سلام
من یه فرم دارم که توش از طریق 8 تا edit اطلاعات پرسنلی وارد میشه
حالا یه دکمه searchدارم که با آن میتونم با استفاده از یه edit و آنچه که کاربر تایپ می کنه محتویات database رو select کنه که جواب search الزاما یه رکورد نیست و رکورد ها تو dbgrid نمایش داده میشود.
حالا می خوام این یه edit رو گسترش بدم به همه edit ها ، یعنی اگه کاربر هر کدوم از edit ها رو پر کرد بر اساس edit مورد نظر search کنه و اگه دو تا یا 3 تا edit یا اصلا هر تعداد edit رو که پر کرد همه ی edit های پر شده رو در نظر بگیره ،
اول اینکه نمی دونم چطور بر حسب edit های متفاوت این کار انجام بشه
دوم اینکه نمی دونم چطور چند تا edit رو در نظر بگیره
کدی که فعلا برای search بر حسب یه edit دارم اینه:
ADOQuery2.Close;
ADOQuery2.SQL.Text:='select * from personal where position='+QuotedStr(Edit3.Text);
ADOQuery2.Open;
ممنون میشم اگه راهنماییم کنید

SYNDROME
شنبه 01 دی 1386, 18:03 عصر
خوب می توانید به این شکل فیلدها را با هم تلفیق کنید.


Flag := False;
IF Edit_Name.Text <> '' Then
Begin
Flag := True;
S := 'Field1='+QuotedStr(Edit_Name.Text
End
IF Edit_Family.Text <> '' Then
Begin
IF Flag Then S := S + 'And';
S := 'Field2='+QuotedStr(Edit_Family.Text
Flag := True;
End;

حالا می توانی دستورات بالا را گسترش بدهی.
موفق باشید

MShirzadi
شنبه 01 دی 1386, 18:46 عصر
این شیوه ای که دوستمون گفتند کاملا درست است ولی این نکته رو هم بگم که می تونی از Flag هم استفاده نکنی یعنی :


S:='';
IF Edit_Name.Text <> '' Then
Begin
S := 'Field1='+QuotedStr(Edit_Name.Text)
End
IF Edit_Family.Text <> '' Then
Begin
IF S <> '' Then S := S + 'And';
S := 'Field2='+QuotedStr(Edit_Family.Text)
End;
البته دوست عزیز اگر شما دلیل خاصی داشتی که این کار رو کردیحتما ما رو هم در جریان بزار تا ما هم بدونیم دلیل منطقی چی بوده
مرسی از همه که در این انجمن فعالیت می کنن و به دوستامون در راه یادگیری هر چه بهتر کمک می کنن
با تشکر فراوان اللخصوص به مدیران سایت

delphiprog3000
شنبه 01 دی 1386, 19:42 عصر
سلام. با اجازه اساتید اینهم روشی که خودم استفاده میکنم امیدوارم به دردتون بخوره.



procedure TCust_List.Btn_FindClick(Sender: TObject);
Var Str:string;
begin
Str:=' select * from tblcustomer';
If (cid.Text='') and (cname.Text='') and (Cfamily.Text='') then
Str:='select * from tblcustomer';
If (Cid.Text<>'') then
ُStr:=str+' where Id_c= '+QuotedStr(Cid.Text);
If (cid.Text<>'') and (Cname.Text<>'') Then
Str:=Str+' and Name_c like '+QuotedStr(Cname.Text+'%')
Else
If (Cid.Text='') and (Cname.Text<>'') Then
Str:=Str+' where Name_c like '+QuotedStr(Cname.Text+'%') ;
If (Cfamily.Text<>'') and (Cname.Text<>'') and (Cid.Text='') Then
Str:=str+' where Family_c like '+QuotedStr(Cfamily.Text+'%')
Else
If (Cid.Text<>'') and (Cfamily.Text<>'') and (Cname.Text='') Then
Str:=str+' and Family_c like '+QuotedStr(Cfamily.Text+'%')
Else
If (Cfamily.Text <>'') and (Cname.Text<>'') and (Cid.Text <>'') then
Str:=str+' and family_c like '+QuotedStr(Cfamily.Text+'%')
else
If (Cfamily.Text <>'') and (cname.Text='') and (Cid.Text='') then
Str:=str+' where family_c like '+QuotedStr(Cfamily.Text+'%');
With ADOQuery1 Do
Begin
SQL.text:=str;
Active:=true;
end;

end;

SYNDROME
شنبه 01 دی 1386, 22:57 عصر
سلام. با اجازه اساتید اینهم روشی که خودم استفاده میکنم امیدوارم به دردتون بخوره.

دوست عزیز در این روش شما به تعداد حالتهای ممکن IF می نویسید که باعث می شود با هر فیلدی که اضافه شد تعداد شرط ها بسیار زیاد می شود که روش کند و زمانبری است.
موفق باشید

marmar
یک شنبه 02 دی 1386, 08:25 صبح
سلام و تشکر از توجه و راهنمایی تمام دوستان
آقای شیرزادی من متغیر s رو از چه جنسی انتخاب کنم؟
مرسی

marmar
یک شنبه 02 دی 1386, 09:09 صبح
حالا یه مشکل دیگه
من که s رو که ظاهرا از جنس string هست مقدار دهی می کنم حالا می شه بگید کجا باید تو شرط select از بانک بگنجونم ؟
آخه طبق این کد :
ADOQuery2.SQL.Text:='select * from personal where position='+QuotedStr(Edit3.Text);
هر فیلد جدا جدا باید شرط روش اعمال بشه ولی ما اطلاعات چند فیلد رو تو یه متغیر می ریزیم
میشه واضح تر توضیح بدین من گیج شدم

MShirzadi
یک شنبه 02 دی 1386, 10:44 صبح
خوب بعد دستورت رو به شکل زیر بنویس :


if (str='') then
AdoQuery2.SQL.Text := 'Select * From Personal'
else
AdoQuery2.SQL.Text := 'Select * From Personal where ' + str;


در ضمن کد هایی رو که می نویسی توی tag مربوط به کد بزار تا خوانا تر بشه

delphiprog3000
دوشنبه 13 اسفند 1386, 22:02 عصر
با سلام .
در ادامه گفته های دوستان میتوان برای چک کردن تنها یک edit از یک else در پایان هر شرط استفاده کرد.


به این صورت:



flag:=false;
if (edt_code_id.Text<> '') then
begin
flag:=true;
str1:=' code_id like '+QuotedStr(edt_code_id.Text+'%');
end;
if (edt_name.Text<> '') then
begin
if flag then
begin
str1:=str1+ ' and ';
str1:=' name like '+QuotedStr(edt_name.Text+'%');
flag:=true;
end
else str1:=' name like '+QuotedStr(edt_name.Text+'%'); <============
end;
if (edt_family.Text<> '') then
begin
if flag then
begin
str1:=str1+' and ';
str1:=' family like '+QuotedStr(edt_family.Text+'%');
flag:=true;
end
else str1:=' family like '+QuotedStr(edt_family.Text+'%'); <============
end;
موفق باشید.....

radan63
شنبه 26 مرداد 1387, 13:22 عصر
سلام. با اجازه اساتید اینهم روشی که خودم استفاده میکنم امیدوارم به دردتون بخوره.



procedure TCust_List.Btn_FindClick(Sender: TObject);
Var Str:string;
begin
Str:=' select * from tblcustomer';
If (cid.Text='') and (cname.Text='') and (Cfamily.Text='') then
Str:='select * from tblcustomer';
If (Cid.Text<>'') then
ُStr:=str+' where Id_c= '+QuotedStr(Cid.Text);
If (cid.Text<>'') and (Cname.Text<>'') Then
Str:=Str+' and Name_c like '+QuotedStr(Cname.Text+'%')
Else
If (Cid.Text='') and (Cname.Text<>'') Then
Str:=Str+' where Name_c like '+QuotedStr(Cname.Text+'%') ;
If (Cfamily.Text<>'') and (Cname.Text<>'') and (Cid.Text='') Then
Str:=str+' where Family_c like '+QuotedStr(Cfamily.Text+'%')
Else
If (Cid.Text<>'') and (Cfamily.Text<>'') and (Cname.Text='') Then
Str:=str+' and Family_c like '+QuotedStr(Cfamily.Text+'%')
Else
If (Cfamily.Text <>'') and (Cname.Text<>'') and (Cid.Text <>'') then
Str:=str+' and family_c like '+QuotedStr(Cfamily.Text+'%')
else
If (Cfamily.Text <>'') and (cname.Text='') and (Cid.Text='') then
Str:=str+' where family_c like '+QuotedStr(Cfamily.Text+'%');
With ADOQuery1 Do
Begin
SQL.text:=str;
Active:=true;
end;

end;

خيلي خوب بود .ولي چون منطق كار را نفهميدم نمي تونم آن را براي كار خودم كه 5 تا فيلد است گسترش دهم ممنون مي شوم كمك كنيم.

Hsimple11
شنبه 26 مرداد 1387, 13:31 عصر
چیز خاصی نیست. یک Select معمولی است. SELECT را در بخش SQL SERVER جستجو کنید.

delphiprog3000
یک شنبه 27 مرداد 1387, 15:41 عصر
با سلام .
در ادامه گفته های دوستان میتوان برای چک کردن تنها یک edit از یک else در پایان هر شرط استفاده کرد.


به این صورت:



flag:=false;
if (edt_code_id.Text<> '') then
begin
flag:=true;
str1:=' code_id like '+QuotedStr(edt_code_id.Text+'%');
end;
if (edt_name.Text<> '') then
begin
if flag then
begin
str1:=str1+ ' and ';
str1:=' name like '+QuotedStr(edt_name.Text+'%');
flag:=true;
end
else str1:=' name like '+QuotedStr(edt_name.Text+'%'); <============
end;
if (edt_family.Text<> '') then
begin
if flag then
begin
str1:=str1+' and ';
str1:=' family like '+QuotedStr(edt_family.Text+'%');
flag:=true;
end
else str1:=' family like '+QuotedStr(edt_family.Text+'%'); <============
end;
موفق باشید.....




با سلام دوست عزیز به کد بالا دقت کنید در اینجا سه edit مقایسه شده. شما میتوانید به تعداد Edit ها اضافه نمایید .

منطق این روش نیز بر اساس پر بودن edit میباشد.

به این صورت اگر هر ادیتی مقدار داشته باشد با Flag مشخص میشود و اگر Flag خاصیت True پیدا کند شرط ما And میشود با مقدار قبل. وگر نه مقدار خود ادیت به تنهایی جستجو میشود.

موفق باشید.............