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

如何修改lookup的欄位值??

尚未結案
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-28 17:35:00 IP:61.220.xxx.xxx 未訂閱
請教各位前輩,小弟若想在lookup欄位的DBEdit直接改資料,目前是無法做任何異動,請問這是lookup欄位的特性ㄇ???
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-28 17:43:03 IP:218.16.xxx.xxx 未訂閱
Lookup 欄位不是真正的欄位,所以不能異動 若你想讓使用者去在 Lookup 名單中選,你可以用 TLookupComboBox 若你想修改 Lookup 名單中的字眼,請直接用 TTable / TQuery 修改存放 Lookup 資料的 Table
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-28 17:43:38 IP:61.221.xxx.xxx 未訂閱
ivankuo, 您好 lookup欄位本身就是唯讀不能修改的,他的顯示資料是由另一筆資料而來的,所以是不能修改的。    ================================= 涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 是非終日有,不聽自然無 天下本無事,庸人自擾之 發表人 - tech_state 於 2003/05/28 17:47:33
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-28 18:11:27 IP:211.76.xxx.xxx 未訂閱
1.lookup並不是唯讀是可以修改
2.修改時機乃在於一筆Record處於dsInsert or dsEdit狀態中,當該Record post
  後,lookup會依DataSet之設定重新改變其內容,所以lookup欄位內容改變是
  暫時的.
3.如合修改如
  字串
  DataSet.FieldByName('xxx').AsString:='xxx';
  整數
  DataSet.FieldByName('xxx').AsInteger:=123;
  和改變一般欄位方式是一樣.
4.修改場合
  CustId 資料欄位
  CustName lookup欄位,隨CustId改變而變
  所以在編輯CustId後離開,此時CustName還是對應舊CustId,因此
  NewCustId -> NewCustName ,以NewCustName 來設定CustName 欄位,
  當Post後DataSet會重新設定CustName,所以其改變只是暫時的.    
發表人 - cmj 於 2003/05/28 18:13:44
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-28 18:13:51 IP:61.221.xxx.xxx 未訂閱
喔~~~我知道了,沒其他方式只好這樣做了. 感謝兩位前輩告知.
------
ivankuo
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-28 18:20:38 IP:61.221.xxx.xxx 未訂閱
不好意思沒看到我先try看看
------
ivankuo
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-28 18:31:08 IP:61.221.xxx.xxx 未訂閱
引言:
1.lookup並不是唯讀是可以修改
2.修改時機乃在於一筆Record處於dsInsert or dsEdit狀態中,當該Record post
  後,lookup會依DataSet之設定重新改變其內容,所以lookup欄位內容改變是
  暫時的.
3.如合修改如
  字串
  DataSet.FieldByName('xxx').AsString:='xxx';
  整數
  DataSet.FieldByName('xxx').AsInteger:=123;
  和改變一般欄位方式是一樣.
4.修改場合
  CustId 資料欄位
  CustName lookup欄位,隨CustId改變而變
  所以在編輯CustId後離開,此時CustName還是對應舊CustId,因此
  NewCustId -> NewCustName ,以NewCustName 來設定CustName 欄位,
  當Post後DataSet會重新設定CustName,所以其改變只是暫時的.    
發表人 - cmj 於 2003/05/28 18:13:44
cmj 前輩 第4點看不懂耶,可不可以用個範例來看看??
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-28 18:50:49 IP:218.16.xxx.xxx 未訂閱
你是可以在 Lookup Filed 時修改 Lookup Field 的顯示值沒錯,但這一般沒甚麼意義,因為這些修改不會存進數據庫,反而容易誤導了使用者。 而且, "所以在編輯CustId後離開,此時CustName還是對應舊CustId" 這句是錯的 當 CustID 變後不用 post Lookup Field 已是指向新的 CustID 對應的CustName 的了。 所以,說 Lookup Field 不能異動還是沒錯的,雖然可以暫時修改值但這在一般的應用上沒甚麼用處,真的要異動還使用上面提出的方法較容易。
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-28 19:09:21 IP:211.76.xxx.xxx 未訂閱
TbCust客戶資料欄
CUSTID CUSTNAME 
------ --------
001    NAME1 
002    NAME2
003    NAME3    TbOrd訂單檔: ORDNO,CUSTID為DATA , CUSTNAME為Lookup Field
TbOrdCUSTNAME 對應CUSTNAME 設定如下
TbOrdCUSTNAME.FieldKind -> fkLookup
TbOrdCUSTNAME.KeyFields -> CUSTID
TbOrdCUSTNAME.LookDataSet -> TbCust
TbOrdCUSTNAME.LookupKeyFields -> CUSTID
TbOrdCUSTNAME.LookupResultField -> CUSTNAME    ORDNO CUSTID CUSTNAME
----- ------ --------
A001  001    NAME1
A002  002    NAME2
A003  003    NAME3    假設螢幕顯示訂單資料如上
DBEDITCustID.DataField -> CUSTID欄位
DBTEXTCUSTNAME 為 DbText對應TbOrdCUSTNAME之內容    當在編輯DBEDITCustID後去改custname之內容
  CUSTID: 001   改 003
CUSTNAME: NAME1 改 NAME3    所以可在DBEDITCustID的 OnExit事件中

var CustId,CustName:String;
begin
   if TbOrd.State in [dsInsert,dsEdit] then 
    begin
      CustId:=TbOrd.FieldByName('CUSTID').AsString;  
      CustName:=TbCust.Lookup('CUSTID',CustId,'CUSTNAME');
      TbOrd.FieldByName('CUSTNAME').AsString:=CustName;
    end;
end;
程式用法可以查help說明
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-28 19:25:04 IP:218.16.xxx.xxx 未訂閱
引言:
    當在編輯DBEDITCustID後去改custname之內容
  CUSTID: 001   改 003
CUSTNAME: NAME1 改 NAME3    所以可在DBEDITCustID的 OnExit事件中

var CustId,CustName:String;
begin
   if TbOrd.State in [dsInsert,dsEdit] then 
    begin
      CustId:=TbOrd.FieldByName('CUSTID').AsString;  
      CustName:=TbCust.Lookup('CUSTID',CustId,'CUSTNAME');
      TbOrd.FieldByName('CUSTNAME').AsString:=CustName;
    end;
end;
cmj 兄, 跟據我的經驗及剛剛再做的實驗所得,當DBEDITCustID後,即使不加入你的程式碼 CustName 還是會自動改變為新的對應值的。 那加上你那段程式碼有甚麼好處嗎 ? 還是在甚麼情況下 CustID 改了 CustName 的 Lookup 是不會自動改的 ? 謝謝指教。
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-29 09:35:21 IP:61.221.xxx.xxx 未訂閱
cmd前輩 1.我想要的是不修改CustID此欄位,直接異動CustName欄位就好了,比如說 在客戶訂單中的客戶編號是不會變動的,要變動的是此編號所帶出的lookup欄位的內容從 台X電 >> 台A電 ,只是修改名稱而已,並不是換掉台X電的客戶編號. 2.當我設定DBEdit的欄位為lookup欄位的話,其DBEdit就無法做編輯動作耶,這樣無法在DBEdit修改此欄位內容
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-29 09:53:56 IP:218.16.xxx.xxx 未訂閱
ivankuo,    訂單 : 1234 CustID : CustX Lookup 後的 CustName : 台X電    到底你是想 1. 將這張訂單的客戶設成另一客戶 (CustID : CustA; CustName : 台A電) 還是 2. 將客戶 CustX 的 名稱改為 台A電 (所有客戶是 CustX 的 CustName 都會變 台A電)    第一篇回文已說過,情況一用 TDBLookupComboBox,情況二要另開 Table/Query 來異動 Customer Table    Lookup 欄位不可異動,就是這麼簡單的一回事。
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-05-29 10:05:37 IP:61.221.xxx.xxx 未訂閱
Justmade前輩, 不好意思,我本來也是這樣想的,但是cmj前輩神來一筆讓我以為是可以改的.可惜那不是我要的答案吧. 所以還是只能用另外的query或table來做update的動作. 謝謝大家的熱心~~~
------
ivankuo
系統時間:2024-05-18 12:56:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!