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

虛擬欄位的問題

尚未結案
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-17 13:14:58 IP:211.74.xxx.xxx 未訂閱
各位大大好:    我有一個  sql  語法
   
  select goods_no,price,quantity,(price*quantity) as amount from goods 
  其中 amount  是虛擬欄位,我的程式是三層式的,所以這個 sql 在 APSERVER
  產生並取得資料在傳到後端,前端是透過如下方式串接資料      //BillData 是  OleVariant 型態
  cds:=TClientDataSet.Create(self);
  CDS.dATA:=BillData;
  ds.DataSet:=cds;
  fdbgrid.DataSource:=ds
  當我在編輯資料時,如果 price 或 quantity 任一欄位有修改到
  只要我不去點選  amount 欄位,就不會有錯誤產生,但當我去點選 amount 欄位,並跳離此欄位時,就會出現錯誤訊息,並告訴我此欄位不能修改    
請問我該如何解決此問題 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-17 13:45:55 IP:211.74.xxx.xxx 未訂閱
對不起,更正問題,我如果先將 amount 的 ReadOnly 設為 false 就不會有錯誤訊息產生了,但當我存檔時錯誤又會發生 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-18 14:44:56 IP:220.135.xxx.xxx 未訂閱
你雙擊ClientDateSet 打開欄位編輯器 選取amount欄位 在屬性編輯器中 將 ProviderFlags的pfInUpdate,pfInWhere設成False 混心雜欲 棄修身~唉
------
唉~
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-18 15:37:04 IP:61.70.xxx.xxx 未訂閱
因為我的欄位是執行時期產生的,並無法在設計時期就透過 cLIENTDATASET 的欄位編輯器來設定ProviderFlags的pfInUpdate,pfInWhere設成False 我在程式中加入 cds.FieldByName('amount').ProviderFlags 發現後面就沒屬性可以設定了 請問我該如何設定 謝謝大大 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-18 16:10:11 IP:220.135.xxx.xxx 未訂閱
引言: 因為我的欄位是執行時期產生的,並無法在設計時期就透過 cLIENTDATASET 的欄位編輯器來設定ProviderFlags的pfInUpdate,pfInWhere設成False 我在程式中加入 cds.FieldByName('amount').ProviderFlags 發現後面就沒屬性可以設定了
1.ClientDataSet如果你知道欄位結構可以DesignTime時自己手動加入 2.cds.FieldByName('amount').ProviderFlags := []; 混心雜欲 棄修身~唉
------
唉~
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-19 17:15:22 IP:61.70.xxx.xxx 未訂閱
大大: 經過測試結果,還是會出現"TRYING TO MODIFY READ-ONLY FIELD" 的錯誤訊息 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-20 09:10:33 IP:220.135.xxx.xxx 未訂閱
你試試把Provider的UpdateMode改成(upWhereKeyChange) ResolveToDataSet改成False    如過還不行的話我建議你採用另一種做法,不要在sql中產生虛擬欄位 直接在前端ClientDataSet的用Calculated 或InternalCalc欄未來作 大略步驟如下 1.將sql修正為select goods_no,price from goods  2.雙擊ClientDataSet會顯示出空白的欄位編輯器 按右鍵選NewField 3.加入goods_no,price兩欄位 FieldType選Data(Type and Size 必須同資料庫設定) 4.加入amount欄位, FieldType選Calculated或InternalCalc (Type 選currency 或 float 若確定為整數 選integer也可)    5.在ClientDataSet的OnCalculated事件加入下述程式碼
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
 if not(DataSet.FieldByName('goods_no').IsNull or
        DataSet.FieldByName('price').IsNull) then
  DataSet['amount'] :=  DataSet['goods_no'] *  DataSet['price'];
end; 
混心雜欲 棄修身~唉
------
唉~
系統時間:2024-06-29 21:46:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!