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

請教有關FieldKind = fkInternalCalc時該如何撰寫程式?

 
David
一般會員


發表:13
回覆:26
積分:7
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-25 14:51:55 IP:61.221.xxx.xxx 未訂閱
請教各位先進: 在物件Field中有一個property:FieldKind,依照help中說到(如果我沒誤解的話): FieldKind := fkCalculated時,可以在DataSet.OnCalcFields中撰寫計算式,但不會將結果存放在資料庫中,只是暫時的﹔如果要儲存,則可以設定 FieldKind := fkInternalCalc 我做了測試,將計算式寫在DataSet.OnCalcFields內, 用xxFieldName.Value := XXX指定欄位值。 當FieldKind := fkCalculated時,用DBGrid可正確顯示計算結果,也沒真正儲存到資料表格裡。 但當FieldKind := fkInternalCalc時出現DataSet不在編輯或新增狀態,如果加上DataSet.Edit程式則如Help所說,因為DataSet的Open或Edit會觸動DataSet.OnCalcFields,導致recursion,所以也無法進行下去,DBGrid沒有任何資料。 因此,想請教各位先進:如何才能既動態線上計算又能將結果放入實際資料表格內儲存呢? Thanks for your help. PS:資料庫環境是BDE Paradox
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-07-25 15:17:38 IP:61.219.xxx.xxx 未訂閱
如果要儲存,則可以設定FieldKind := fkInternalCalc 不對, 不是指internalCalc可存入資料庫, 而是指存在RunTime之DataSet中 Calculate Field, 由於RunTime之DataSet中除目前顯示中之Record外,實際無值,故在DataSet Record移動時均會重新呼叫onCalculate計算 internalCalc一旦計算過就會保留其值, Record移動時不須重新計算, 但無法存入實體資料庫 發表人 - ccchen 於 2002/07/25 15:18:31
David
一般會員


發表:13
回覆:26
積分:7
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-07-25 16:23:35 IP:61.221.xxx.xxx 未訂閱
引言: 如果要儲存,則可以設定FieldKind := fkInternalCalc 不對, 不是指internalCalc可存入資料庫, 而是指存在RunTime之DataSet中 Calculate Field, 由於RunTime之DataSet中除目前顯示中之Record外,實際無值,故在DataSet Record移動時均會重新呼叫onCalculate計算 internalCalc一旦計算過就會保留其值, Record移動時不須重新計算, 但無法存入實體資料庫 發表人 - ccchen 於 2002/07/25 15:18:31
首先感謝ccchen前輩的解答。 您說 ’internalCalc一旦計算過就會保留其值, Record移動時不須重新計算, 但無法存入實體資料庫’ 1.那設定FieldKind := fkInternalCalc與FieldKind := fkCalculated的差別其實只在於移動record時不會重新計算,都不會存入實體資料庫,故可能是設定為fkInternalCalc速度會較快?! 2.請問當FieldKind := fkInternalCalc時,計算式應寫在哪裡呢?因為我寫在DataSet.OnCalcFields內會出現DataSet不在編輯或新增狀態的錯誤訊息? Thanks for your help again. Best regards.
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-07-25 19:25:45 IP:203.217.xxx.xxx 未訂閱
fkInternalCalc有兩種方法產生 1. 例: select f1,f2, f1+f2 as f3 如此f3為一fkInternalCalc 2. 如同calculate Field一般在onCalculate計算    fkInternalCalc僅限於TClientDataSet(含所有繼承者), 可編輯(不會存),可做為Index或Filter故很有用 設定為fkInternalCalc速度會較快 那可不一定, Calculate每次算但每次算的都不多, fkInternalCalc一次算完那一次可要不少時間, 故選擇還是很有學問, 且須配合PacketRecords, FetchonDemand等Property來考慮
David
一般會員


發表:13
回覆:26
積分:7
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-07-25 19:48:10 IP:61.221.xxx.xxx 未訂閱
引言: fkInternalCalc有兩種方法產生 1. 例: select f1,f2, f1 f2 as f3 如此f3為一fkInternalCalc 2. 如同calculate Field一般在onCalculate計算 fkInternalCalc僅限於TClientDataSet(含所有繼承者), 可編輯(不會存),可做為Index或Filter故很有用 設定為fkInternalCalc速度會較快 那可不一定, Calculate每次算但每次算的都不多, fkInternalCalc一次算完那一次可要不少時間, 故選擇還是很有學問, 且須配合PacketRecords, FetchonDemand等Property來考慮
非常感謝ccchen前輩不厭其煩的指導說明,有您這些指引,讓我有更多認知。Thanks for your help again. Best regards.
系統時間:2024-04-25 7:36:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!