全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:966
推到 Plurk!
推到 Facebook!

資料庫搜尋的程式碼問題

尚未結案
tv66
一般會員


發表:5
回覆:3
積分:1
註冊:2004-03-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-20 14:54:35 IP:211.76.xxx.xxx 未訂閱
各位高手你好 我是DELPHI初學者需要一些建議 請各位幫幫忙~~    我在做一個會員資料管理系統時(資料庫是用Detabase Desktop做的Table) 我想要在Edit15輸入資料對應ComboBox1的欄位來做搜尋 然後搜尋後的資料列在DBGrid1中~ 請問要寫什麼程式碼呢~ 因為對搜尋的寫法不懂~所以完全不知道如果著手~ 請問用兩種以上條件來搜尋~又必須打什麼語法呢? 請問用DataSource1+DBGrid1可以直接在列表上做修改嗎?
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-20 16:16:30 IP:202.62.xxx.xxx 未訂閱
您好﹗    一般來講﹐資料庫的查詢方法可分成普通查詢﹐過濾和SQL語法查詢三種﹐基于您的問題﹐此三種方法皆可﹐看您使用何種資料集元件吧﹒ 若是使用Table等無SQL語法功能的資料集元件﹐可使用Locate; LookUp; SetKey三種較常用的方法﹐在這三種方法中﹐就您的問題而言﹐因為是單欄位的查詢﹐故Locate方法較為适合﹐相關的使用方法如下﹕
begin
  Table1.Locate(ComboBox1.Text, Edit15.Text, [loCaseInsensitive];
end;
資料集元件需在開啟狀態才可進行查詢﹐當查詢到資料的時候﹐資料錄指針就會指向此筆資料錄﹐loCaseInsensitive參數是指查詢中不分大小寫﹐另外還有一個loPartialkey的參數﹐其意義是只要部分資料符合﹐此筆資料就算符合﹒也可參考Delphi中的Help 若是使用Query等支援SQL語法功能的資料集元件﹐可直接使用SQL查詢語句來進行查詢﹐相關的使用方法如下﹕
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select * From 資料表 Where FieldTemp ');
  Query1.SQL.Add('= ''' ComboBox1.Text '''');
  Query1.SQL.Text := StringReplace(Query1.SQL.Text, 'FieldTemp', 
    ComboBox1.Text, [rfReplaceAll, reIgnoreCase];
  Query1.Open;
end;
此時只有符合SQL查詢條件的資料才會顯示出來﹐即如果您的DBGrid元件正确通過DataSource元件連接到此Query元件﹐符合查詢條件的資料即會在DBGrid元件中顯示出來﹒ 至于過濾方法(Filter)﹐也可配合DBGrid元件將過濾后的資料顯示出來﹐不符合過濾條件的則不顯示﹐方法如下﹕
Var
  Str : String;
begin
  Try
    Table1.Filtered := False;
    Str := ComboBox1.Text   '='   Edit15.Text;
    Table1.Filter := Str;
    Table1.Filtered := True;
  Except
    ShowMessage('過濾條件錯誤');
    Table1.Filtered := False;
  end;
end;
========================= 大病初愈﹐休養調整中... =========================
------
忻晟
tv66
一般會員


發表:5
回覆:3
積分:1
註冊:2004-03-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-25 13:05:30 IP:211.76.xxx.xxx 未訂閱
感謝版主的回應~ 我輸入下列的程式碼 可是搜尋不到任何東西~ 請問是不是我的語法有輸入錯誤呢? procedure TFTC1.Button1Click(Sender: TObject); begin dm.CU1Query.Close; dm.CU1Query.SQL.Clear; dm.CU1Query.SQL.Add('Select * From CU1.db Where ' Edit15.Text ' '); dm.CU1Query.SQL.Add('= ''' ComboBox1.Text ''''); dm.CU1Query.SQL.Text := StringReplace(dm.CU1Query.SQL.Text, Edit15.Text ,ComboBox1.Text, [rfReplaceAll,rfIgnoreCase]) ; dm.CU1Query.Open; end; 我之後修改成下列後 雖然是能搜尋了~但是卻不知道如何做特殊條件搜尋(大小寫,多筆條件) procedure TFTC1.Button1Click(Sender: TObject); begin dm.CU1Query.Close; dm.CU1Query.SQL.Clear; dm.CU1Query.SQL.Add('Select * From CU1.db Where ' ComboBox1.Text '= ''' Edit15.Text ''''); dm.CU1Query.Open; end; 最後~ 我也試了用locate試了一下 table1.locate(ComboBox1.Text,Edit15.Text,[loCaseInsensitive, loPartialKey]); 請問這樣的語法有錯誤嗎~?~ 還有Table要怎麼用呢?
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-25 17:05:04 IP:220.134.xxx.xxx 未訂閱
抱歉 插個花 LOCATE方式搜尋資料時 cashxin2002兄已有說明loCaseInsensitive與loPartialKey的使用時機 以SQL方式來作 'Select * From CU1.db Where ' ComboBox1.Text '= ''' Edit15.Text ''' And ' Conbobox2.Text ' = ''' Edit16.Text ''' '; 你可依照需求來選擇使用And 或OR的方式及條件中LIKE與 = 的用法.建議你可買本有關DELPHI資料庫方面的參考書籍. ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
jbinfo
一般會員


發表:9
回覆:25
積分:16
註冊:2004-05-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-25 17:20:11 IP:61.60.xxx.xxx 未訂閱
tv66兄你好: 多筆查詢的部份,或許可以參考一下這樣子的寫法 procedure TFTC1.Button1Click(Sender: TObject); var SQLText,s:String; begin s:='N'; SQLText:='Select * From CU1.db'; if (ComBox1.Text<>'') AND (Edit15.Text<>'') then begin s:='Y'; SQLText:=SQLText Format('Where %s=''%s''',[ComBox1.Text,Edit15.Text]); end; if (ComBox2.Text<>'') AND (Edit16.Text<>'') then begin if s='Y' then SQLText:=SQLText Format(' AND %s=''%s''',[ComBox2.Text,Edit16.Text]) else SQLText:=SQLText Format('Where %s=''%s''',[ComBox2.Text,Edit16.Text]); end; with dm do begin CU1Query.Close; CU1Query.SQL.Clear; CU1Query.SQL.ADD(SQLText); CU1Query.Open; end; end; 不知道這樣對你有沒有幫助
tv66
一般會員


發表:5
回覆:3
積分:1
註冊:2004-03-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-27 16:10:49 IP:211.76.xxx.xxx 未訂閱
感謝likush跟jbinfo兩位版友的回應~    試過之後目前能跑成功的只有 dm.CU1Query.SQL.Add('Select * From CU1.db Where ' + ComboBox1.Text + '= ''' + Edit15.Text +''' And '+Combobox2.Text+ ' = '''+Edit16.Text+''' '); 請問用SQL的話能做到loCaseInsensitive與loPartialKey的功能嗎?    關於jbinfo版友所寫的~ 我輸入條件後按搜尋 結果跑出下面訊息~ 請問是哪裡的問題呢? procedure TFTC1.Button1Click(Sender: TObject); var SQLText,s:String; begin s:='N'; SQLText:='Select * From CU1.db'; if (ComboBox1.Text<>'') AND (Edit15.Text<>'') then begin s:='Y'; SQLText:=SQLText + Format('Where %s=''%s''',[ComboBox1.Text,Edit15.Text]); end; if (ComboBox2.Text<>'') AND (Edit16.Text<>'') then begin if s='Y' then SQLText:=SQLText + Format(' AND %s=''%s''',[ComboBox2.Text,Edit16.Text]) else SQLText:=SQLText + Format('Where %s=''%s''',[ComboBox2.Text,Edit16.Text]); end; with dm do begin CU1Query.Close; CU1Query.SQL.Clear; CU1Query.SQL.ADD(SQLText); CU1Query.Open; end; end;
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-27 18:44:27 IP:202.62.xxx.xxx 未訂閱
您好﹗    查查看程式碼中或使用者選擇﹑輸入的資料中是否有關鍵字﹐若有的話﹐更改其關鍵字名稱﹒    ========================= 大病初愈﹐休養調整中... =========================
------
忻晟
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-28 01:57:10 IP:220.134.xxx.xxx 未訂閱
光看問題 實在很難瞭解你的語法錯在那裡 建議你可以將語法貼至資料庫中直接執行看看,或貼到站上由其他先進為你解答. 再來 就你的需求來說 我是建議採用FILTER的方式,設定FILTEROPTIONS是否區分大小寫及運用LIKE語法來作資料部份符合就取值的作法.至於FILTER的用法,文中已有cashxin2002兄提出,就不再重打.參考看看 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
系統時間:2024-05-19 9:45:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!