線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1975
推到 Plurk!
推到 Facebook!

搜尋技巧上的問題

答題得分者是:RaynorPao
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-07 19:53:38 IP:59.125.xxx.xxx 未訂閱
今天的問題也是可以算是討論
我解釋一下意思就資料庫有兩個欄位分別為布、廠牌
然後有兩個輸入數值的地方
分別可以搜尋
Edit1->Text ->
Edit2->Text -> 廠牌
使用者可以只輸入
Edit1或Edit2或是兩個搜尋(Edit1.Edit2)都輸入數值 就能進行搜尋

但是今天有一個大問題就今天有
Edit1.Edit2....Edit9共有九個可搜尋空欄
那如果今天還用一下的方法不就要寫2^9=512個組合嗎
我不要用一個搜尋空欄去搜尋資料庫中的所有欄位

有什麼寫法能解決今天的問題嗎
或是其他方法嗎
拜託!拜託! 謝謝!

[code cpp]
void __fastcall TForm2_1::Button1Click(TObject *Sender)
{
int Fin=0;

if(
Edit1->Text=!"")
{ if(
Edit2->Text!="")
{Fin=1;}
else
{Fin=2;}
}
else
{
if(Edit2->Text!="")
{Fin=3;}

else
Fin=4;}

}

ADOQuery1->Close();
ADOQuery1->SQL->Clear();
String
C1,C2;
C1=Edit1->Text;
C2=Edit2->Text;

switch(Fin)
{
case 1:
{ADOQuery1->SQL->Add("select * from data where [布]='" C1 "' AND [廠牌]='" C2 "'");break;}
case 2:
{ADOQuery1->SQL->Add("select * from data where [
[布]='" C1 "'");break;}
case 3:
{ADOQuery1->SQL->Add("select * from data where
[廠牌]='" C2 "'");break;}
default:
{Application->MessageBox("請輸入資料條件","警告",65); return; }
}
ADOQuery1->Active=true;
ADOQuery1->Open();
}

[/code]
-非常謝謝大大熱心提供你的寶貴意見
謝謝!
------
-謝謝大大熱心的回覆!謝謝!
編輯記錄
taishyang 重新編輯於 2008-07-07 20:09:29, 註解 無‧
l90425 重新編輯於 2008-07-07 23:38:49, 註解 無‧
l90425 重新編輯於 2008-07-08 12:11:40, 註解 無‧
taishyang 重新編輯於 2008-07-08 12:16:21, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5486
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-07 20:15:50 IP:118.169.xxx.xxx 訂閱
請搜尋本站,關鍵字為[FindComponent]
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-07 20:29:47 IP:59.125.xxx.xxx 未訂閱

===================引 用 taishyang 文 章===================
請搜尋本站,關鍵字為[FindComponent]


請問為什麼要使用
FindComponent
今天的問題是要如何不要寫那512個組合而這些組合的sql是沒有重複性的
所以我不太清除為什麼要使用
FindComponent-謝謝大大

------
-謝謝大大熱心的回覆!謝謝!
編輯記錄
l90425 重新編輯於 2008-07-07 23:39:07, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5486
積分:4552
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-07 20:42:27 IP:118.169.xxx.xxx 訂閱
sorry,會錯意 ^^|
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-07 23:05:35 IP:61.60.xxx.xxx 未訂閱
(1)你好像把問題想得太複雜了吧
(2)再仔細想一想,利用程式就可以簡化整個流程
(3)以一個搜尋條件為例:

[code cpp]
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
AnsiString QueryStr="select * from data";

if(Trim(Edit1->Text)!="")
{
QueryStr =" where [布]=" Edit1->Text;
}
ADOQuery1->SQL->Add(QueryStr);
ADOQuery1->Active=true;
ADOQuery1->Open();

[/code]

(4)這樣不管2個條件,或9個條件,應該會寫了吧?(利用 if...else if...else if...動態組合 QueryStr)
(5)不過要注意 where 和 and 在 QueryStr 裡面出現的次數
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
編輯記錄
RaynorPao 重新編輯於 2008-07-07 23:06:42, 註解 無‧
RaynorPao 重新編輯於 2008-07-07 23:12:56, 註解 無‧
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-07 23:44:10 IP:59.125.xxx.xxx 未訂閱
請問各位大大還有更簡潔的方法嗎
-謝謝大大的熱心回覆! 謝謝! 謝謝!
------
-謝謝大大熱心的回覆!謝謝!
編輯記錄
l90425 重新編輯於 2008-07-07 23:45:17, 註解 無‧
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-07-07 23:44:36 IP:59.125.xxx.xxx 未訂閱
因為那樣if...else還是要寫很多,不過還是非常謝謝大大
請問各位大大還有更簡潔的方法嗎
不小心按到兩次對不起
-謝謝大大的熱心回覆! 謝謝! 謝謝!
------
-謝謝大大熱心的回覆!謝謝!
編輯記錄
l90425 重新編輯於 2008-07-07 23:46:05, 註解 無‧
l90425 重新編輯於 2008-07-07 23:50:29, 註解 無‧
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-07-08 05:57:03 IP:203.67.xxx.xxx 訂閱

===================引 用 taishyang 文 章===================
請搜尋本站,關鍵字為[FindComponent]


Taishyang 前輩已經提供了不錯的方法

------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-07-08 07:45:06 IP:220.141.xxx.xxx 訂閱
1. 利用迴圈對form內的元件進行探訪(FindComponent)
2. 若為TEdit時檢查是不是空的
3. 若不為空的,將其加入Sql->Add。
即可動態組成sql語句。
------
努力會更接近成功
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-07-08 10:39:39 IP:59.125.xxx.xxx 未訂閱

===================引 用 pceyes 文 章===================
1. 利用迴圈對form內的元件進行探訪(FindComponent)
2. 若為TEdit時檢查是不是空的
3. 若不為空的,將其加入Sql->Add。
即可動態組成sql語句。


若如果用上面的方式會有一些瓶頸
1.TEdi對應的資料庫欄位都不同
2.該怎麼判斷是要加入where 或 and時機
如果有說錯可能還不懂大大的意思可不可以請大大寫一下程式
-謝謝以上大大熱心的回覆
------
-謝謝大大熱心的回覆!謝謝!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-07-08 11:13:28 IP:59.105.xxx.xxx 未訂閱
提供你參考...
[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{

AnsiString Keys[10] = {
"Key0","Key1","Key2","Key3","Key4",
"Key5","Key6","Key7","Key8","Key9"};

AnsiString s="";
for(int i=0;i<10;i ){
TEdit *e=(TEdit*)FindComponent("Edit" IntToStr(i));
if(e!=NULL&&e->Text.Trim()!=""){
s = e->Text.Trim().sprintf("[%s]='%s' AND ", Keys[i],e->Text.Trim());
}
}

if(s!="")
s="select * from data where " s.SubString(1,s.Length()-5);

Memo1->Lines->Text = s;

}
//---------------------------------------------------------------------------
[/code]
編輯記錄
jow 重新編輯於 2008-07-08 11:18:18, 註解 無‧
jow 重新編輯於 2008-07-08 11:22:35, 註解 無‧
l90425
初階會員


發表:95
回覆:152
積分:49
註冊:2008-04-03

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-07-08 12:10:15 IP:59.125.xxx.xxx 未訂閱
我將taishyang、Raynor、Paopceyes所提供的意見整合後已經做出來了
謝謝以上大大的回覆及其他大大的回覆非常的謝謝你們寶貴的意見!

如果還能有更好的方法請其他的大大繼續提供解答或是有什麼地方還可以改善也請告訴我!
謝謝!謝謝!
[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{

int i=1,a=0;
TEdit *tEdit;

AnsiString QueryStr="select * from data ";

for(i = 1;i<4;i )
{
tEdit=(TEdit *)FindComponent("Edit" IntToStr(i));
if(Trim(tEdit->Text)!="")
{
if(a==0)
{QueryStr ="where";a=1;}
else
{QueryStr ="AND";}
if(i==1)
{QueryStr =" [溫度]=" tEdit->Text;}
else if(i==2)
{QueryStr =" [種類] Like '" tEdit->Text "'";}
else if(i==3)
{QueryStr =" [樹劑]=" tEdit->Text;}
}
else
{}
}

ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(QueryStr);
ADOQuery1->Active=true;
ADOQuery1->Open();
Label1->Caption=QueryStr;
}

[/code]
-謝謝大大的熱心回覆!
------
-謝謝大大熱心的回覆!謝謝!
系統時間:2017-12-14 15:51:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!