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

請教一下 在DBGRID裡的欄位值怎麼樣可以去抓資料庫的資料

尚未結案
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-23 00:42:11 IP:211.76.xxx.xxx 未訂閱
不好意思 我想問一下 (我是用SQL2000的資料庫) 在DBGRID裡先跑出一個欄位,當輸入商品編號後(為13碼),會自動觸發其他欄位出來(商品,和價錢的欄位),且會跳到下一行繼續輸入下一個商品的編號,想了很久還是寫不出來,所以想請教大家 謝謝
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-17 16:04:53 IP:210.65.xxx.xxx 未訂閱
Hi :    你可以在 DataSet 中加入兩個 Lookup Field,並將其加入 DBGrid 中,當 keyfield 輸入完後,那兩個欄位的值就會自然會出現在 DBGrid 中了。     ------------------------ 以上言論,純粹為個人意見 ------------------------
------
Fishman
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-17 19:14:06 IP:211.76.xxx.xxx 未訂閱
謝謝這位大大的回答 可是我要做出來的是在DBGRID裡面輸入商品編號,按下ENTER後,他的商品和價錢的欄位也會跟者出來,顯示在同一列 現在是不知道要怎麼樣按下ENTER鍵以後,去資料庫抓到資料出來,所以是主要的問題
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-18 07:14:10 IP:61.231.xxx.xxx 未訂閱
謝這位大大的回答 可是我要做出來的是在DBGRID裡面輸入商品編號,按下ENTER後,他的商品和價錢的欄位也會跟者出來,顯示在同一列 現在是不知道要怎麼樣按下ENTER鍵以後,去資料庫抓到資料出來,所以是主要的問題    您要如此的功能應該用 tstringgrid之類的元件(非資料感知性元件) 做才合乎邏輯,畢竟dbgrid在您開啟連結後,相關的資料就會load進來,若對單一table而言,除非要從另一個table載入相關資料,否則應不須如此做。不知您是否是要從其他table載入相關資料? 「堅持」從洗馬桶做起 Aric 發表人 - huangeider 於 2003/11/18 12:32:25
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-18 15:46:16 IP:210.65.xxx.xxx 未訂閱
Hi:    我的意思是在 DBGrid 所對應的 DataSet 中,加入商品名稱、商品售價的 Lookup Field,當然你必須先建立一個料號的 TQuery 或 TTable,且必須先行 Open。    好處是你不但可以輸入產品編號,按下 Enter 鍵後,商品名稱、商品售價就會自動幫你帶出,甚至在 DBGrid 中,產品名稱會有下拉選單可用,並且會更新產品編號欄位,對不知產品編號而只知產品名稱的使用者而言,一樣可以方便使用。    但缺點就如先前 huangeider 所言,要被 Lookup 的 TQuery 或 TTable 必須先行開啟,就網路與主機的 Loading 而言,會比較重一點,只有先行衡量一下,再決定用法了。    以上一點點意見 ---------------------- 新手上路,請多多指教 ----------------------
------
Fishman
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-23 21:21:34 IP:211.76.xxx.xxx 未訂閱
謝謝Fishman和huangeider的回應 抱歉現在才看到 其實我要做的就像是我們平常去便利商店買東西依樣 刷一下商品 就會出現商品名稱及價錢 所以我想直接用DBGrid把每一筆的資料都帶出來 所以我不太董Fishman的意思 請指教 謝謝 也抱歉這麼晚回你們
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-24 08:43:41 IP:210.65.xxx.xxx 未訂閱
Hi:    papalili 你好,我的意思是 DBGrid 的資料來源是 DataSource,而 DataSource 的資料來自於 DataSet(TQuery or TTable),因此必須在 DataSet 中新增兩個欄位,商品名稱與售價,KeyField 為商品編號,而 LookupField 的資料來源為料號主檔(設定與DBLookupComboBox類似) 1.先對 TQuery Double Click,出現的 Field Editor 中,按下滑鼠右鍵,選擇 Add all Fields 將資料庫之欄位先行加入 2.再按下滑鼠右鍵,選擇 New Field,進行 LookupField 欄位設定 3.於 DBGrid 中,該兩個 LookupField 設定顯示後,如此每一筆 DBGrid 中,都會有售價與料號兩的欄位,且於輸入時,一但打上商品編號,商品名稱與售價將會自動被帶出 試試看 ---------------------- 新手上路,請多多指教 ----------------------
------
Fishman
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-27 22:31:32 IP:211.76.xxx.xxx 未訂閱
謝謝Fishman大大的詳細見解 我也嘗試過了 可是帶出來商品名稱和價格 只是有點問題,就是TTable的active要設成true dbgrid才會出來 可是會全部的資料都會從資料庫帶出來 所以我想問說 可不可以在執行時DBGRID會呈現未輸入資料的狀態 而在輸入商品編號的情況下才會帶出商品名稱和價格且可以跳到下一個輸入 我之前好像看到有討論到說DBGRID裡面好像不能輸入資料 因為在ACTIVE設成true的話就表示會把資料庫的資料通通都秀出來 所以我想不知道這一種方法可不可行 就是先設一個edit然後在裡面輸入商品的編號 按下ENTER以後,就會在DBGRID裡面出現商品的編號順便也可以帶出來 商品的名稱及價格 這是我的想法 只是不知道合不合理 也不知道可不可行
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-28 08:28:06 IP:210.65.xxx.xxx 未訂閱
Hi:    如果是這樣,DBGrid 所指向的 DataSet 改使用 TQuery,並於輸入前記得必須先行 Open,只是 Query 的結果不要讓它有任何資料(比如在條件句中,設定某一欄位為不可能的值),如此一來,DBGrid 中不會有任何資料,且可以進行資料之新增(不能輸入資料的是 IWDBGrid 而不是 DBGrid)。    如果你要用 Edit 來作,不如用 DBEdit,會比較方便,不過可能沒這個必要 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-11-29 15:51:13 IP:211.76.xxx.xxx 未訂閱
謝謝大大的意見    我使用你提供的意見,使用Tquery 可是還是跟之前一樣的問題 可能是我哪裡有弄錯或誤解大大的意思    我現在把我的過程寫出來 我使用的是資料庫是(SQL2000) 裡面有一個資料表叫做GOODS 裡面的欄位有我需要的國際條碼,商品名稱,售價都在同一個資料表裡 以下就是我製作的介面 裡面的Tquery1裡面有直接從資料庫抓出來的國際條碼和用new field增加的 商品名稱和售價,下面的是增加的設定 至於Tquery2都是從資料庫拉出來的國際條碼,商品名稱,售價 我如果在Tquery1裡新增field的type把屬性改調的話 若是執行的話 會呈現空白 但是還是不能輸入資料 所以不知道是我哪你做錯了 請大大指教 謝謝
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-12-01 08:36:04 IP:210.65.xxx.xxx 未訂閱
Hi:    TADOQuery1 的 Command Text 寫法如下(範例) select * from goods where 商品編號 = :p1 在程式中 TADOQuery1.Close; TADOQuery1.ParamByName('P1').AsString := ''; TADOQuery1.Open; 如此一來,TADOQuery1即可被開啟,且無任何資料並允許被新增 至於 TADOQuery2,建議更改為 TADOTable,並與已開啟,如此在你輸入之國際條碼,方可找出對應之商品名稱與售價。 加油,再試試看 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-12-01 19:12:17 IP:211.76.xxx.xxx 未訂閱
謝謝大大的講解 我馬上試過    你說在程式中 TADOQuery1.Close; TADOQuery1.ParamByName(''P1'').AsString := ''''; TADOQuery1.Open;    可是我只能輸入 aoquery1.close; adoquery1.這個後面的函式好像就沒有parambyname可以選擇 所以不知道是我寫錯地方  還是大大有別的涵義 所以我就沒有打這段程式跑跑看    就出現下面的畫面 是可以輸入資訊且是我要的輸入國際條碼就會帶出商品名稱及售價 可是輸入完的時候不會跳到下一列 所以就如果圖上的顯示,只有一列而已 謝謝大大的回答
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-12-02 08:59:12 IP:210.65.xxx.xxx 未訂閱
Hi:    Sorry !! 我沒有用過 TADOQuery,TADOQuery傳參數的指令是 ADOQuery1.Parameters.ParamByName('P1').Value : ='';     -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-12-02 18:21:14 IP:211.76.xxx.xxx 未訂閱
呵呵 謝謝大大 結果寫出來是這樣 adoquery1.Close; adoquery1.Parameters.ParamByName('p1').Value:=''; adoquery1.Open; 是有畫面出來 可是根沒寫程式 跑出來好像一樣也 而且現在還有個問題 就是輸入以後 DBGRID不會跳到下一列 這要寫指令嗎? 還是原本就會自己跳到下一列呢?
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-12-03 09:06:57 IP:210.65.xxx.xxx 未訂閱
Hi:    你可以在 BDGrid 的 OnKeyDown 事件中去判斷,並把 VK_RETURN 改為 VK_DOWN
IF ((Key = RETURN) and (欄位 = 會作用的欄位)) THEN
    BEGIN
        Key := VK_DOWN
    END;
如此即可已將按下Enter 鍵模擬成按向下鍵繼續新增 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-12-03 22:19:42 IP:211.76.xxx.xxx 未訂閱
大大不好意思 因為看不懂 欄位 = 會作用的欄位 這個的意思 這三個欄位都有作用 國際條碼把商品名稱及售價帶出來 那這個意思我不怎麼懂也 可能是我太笨 領悟力太差 不好意思
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-12-04 08:32:51 IP:210.65.xxx.xxx 未訂閱
Hi:    在這裡,我指的是,當你在商品編號欄位按下 Enter 鍵後,直接跳下一筆,因此作用欄位即為商品編號,如此可避免當你在 DBGrid 中按下 Enter 鍵,程式自動幫你轉換為向下鍵的問題,也就是說,你可以設定特定欄位使這個功能生效,而非在整個 DBGrid 中。    此外,我是使用 BDE,經測試後還有一些問題,當按下向下鍵後,你會發現該筆資料會不見(在 DBGrid 中),可是資料庫卻已經寫入,而前端的 RecordCount 卻未增加,經向高人請教,只要使用 TQuery 在 POST 後會有此一問題,必須將該 TQuery 重新 Open 過才會正常,而 TTable 卻無此問題,不知 ADOQuery 會不會如此? -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
kakene
一般會員


發表:22
回覆:52
積分:19
註冊:2003-01-07

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-12-04 10:31:09 IP:203.204.xxx.xxx 未訂閱
引言: 大大不好意思 因為看不懂 欄位 = 會作用的欄位 這個的意思 這三個欄位都有作用 國際條碼把商品名稱及售價帶出來 那這個意思我不怎麼懂也 可能是我太笨 領悟力太差 不好意思
Fishman 大大的意思應該是,按 Enter 後要往下新增一筆的欄位
IF ((Key = vk_RETURN) and (DBGrid1.SelectedIndex = 0)) THEN
BEGIN
  Key := VK_DOWN;
END;
綠色是指dbgrid的第幾個欄位 0 = 第一個欄位 , 1 = 第二個欄位 不知道有沒有誤會Fishman 大大的意思...
kakene
一般會員


發表:22
回覆:52
積分:19
註冊:2003-01-07

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-12-04 10:36:55 IP:203.204.xxx.xxx 未訂閱
引言: Hi: 在這裡,我指的是,當你在商品編號欄位按下 Enter 鍵後,直接跳下一筆,因此作用欄位即為商品編號,如此可避免當你在 DBGrid 中按下 Enter 鍵,程式自動幫你轉換為向下鍵的問題,也就是說,你可以設定特定欄位使這個功能生效,而非在整個 DBGrid 中。 此外,我是使用 BDE,經測試後還有一些問題,當按下向下鍵後,你會發現該筆資料會不見(在 DBGrid 中),可是資料庫卻已經寫入,而前端的 RecordCount 卻未增加,經向高人請教,只要使用 TQuery 在 POST 後會有此一問題,必須將該 TQuery 重新 Open 過才會正常,而 TTable 卻無此問題,不知 ADOQuery 會不會如此? < face="Verdana, Arial, Helvetica"> 小弟看他貼圖是ADO元件,所以就直接拉ADOQuery測試,往下新增時,dbgrid顯示沒問題,關閉程式再開,資料也有存檔.
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#20 引用回覆 回覆 發表時間:2003-12-04 16:21:32 IP:211.76.xxx.xxx 未訂閱
謝謝kakene大大和Fishman大大 用這個IF ((Key = vk_RETURN) and (DBGrid1.SelectedIndex = 0)) 就可以寫出來了 可是跟我實際想出來還有一點點的誤差 因為我是想在國際條碼輸入13碼以後就自己會把商品名稱和售價帶出來 再按下ENTER以後,才會跳到下一列 這樣只要按一次ENTER 若照之前的話 就要在國際條碼輸入ENTER後才會把商品名稱和售價帶出來 再按下ENTER後,才會跳到下一列 這的話,就要按兩次ENTER 所以我是想按一次ENTER 不好意思 太龜毛了 謝謝各位大大
kakene
一般會員


發表:22
回覆:52
積分:19
註冊:2003-01-07

發送簡訊給我
#21 引用回覆 回覆 發表時間:2003-12-04 18:07:46 IP:203.204.xxx.xxx 未訂閱
  IF ((Key = vk_RETURN) and (DBGrid1.SelectedIndex = 0)) THEN
  BEGIN
    ADOQuery1.Append;
  END;
按 Enter 直接就新增一筆 因為不知道你帶出商品名稱及售價寫在哪裡,不知道可不可以...
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#22 引用回覆 回覆 發表時間:2003-12-05 09:26:37 IP:210.65.xxx.xxx 未訂閱
Hi:    試了半天,試不出來,因為抓不到目前DBGrid 中的輸入狀況,如果抓的到,則寫法就與 DBEdit 相同    拉了一個 TDBEdit DataSource 與該 DBGrid 相同,DataField 為商品編號並加入以下程式碼:    
OnChange事件    procedure TForm1.DBEdit1Change(Sender: TObject);
begin
    IF ((Sender AS TDBEdit).DataSource.DataSet.State = dsEdit) or ((Sender AS TDBEdit).DataSource.DataSet.State = dsInsert) THEN
        (Sender AS TDBEdit).DataSource.DataSet.FieldByName((Sender AS TDBEdit).DataField).AsString := (Sender AS TDBEdit).Text;
end;    OnKeyPress事件
procedure TForm1.DBEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    IF ((Key = VK_RETURN) AND (Length((Sender AS TDBEdit).Text) >= 13)) THEN
        (Sender AS TDBEdit).DataSource.DataSet.Append;
end;
-------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
stonys
初階會員


發表:64
回覆:111
積分:38
註冊:2002-09-28

發送簡訊給我
#23 引用回覆 回覆 發表時間:2003-12-05 21:58:46 IP:210.66.xxx.xxx 未訂閱
papalili 您好 小弟剛剛寫了一個範例程式... 不知是否為您想要的,請參考看看! http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41706
papalili
一般會員


發表:28
回覆:31
積分:11
註冊:2003-09-02

發送簡訊給我
#24 引用回覆 回覆 發表時間:2003-12-06 00:58:49 IP:211.76.xxx.xxx 未訂閱
謝謝各位大大的意見 我試過kakene大大的意見 IF ((Key = vk_RETURN) and (DBGrid1.SelectedIndex = 0)) THEN BEGIN ADOQuery1.Append; END; 可以了 所以謝謝你們 stonys大大的也可以 可是不是我之前設的 可是功能也是我想要的 所以也謝謝 最後當然還是要感謝Fishman大大 因為麻煩他很久 也是他讓我進入狀況的 所以感謝各位大大
系統時間:2024-11-24 20:11:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!