請教有關FieldKind = fkInternalCalc時該如何撰寫程式? |
|
David
一般會員 發表:13 回覆:26 積分:7 註冊:2002-04-14 發送簡訊給我 |
請教各位先進:
在物件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 發送簡訊給我 |
如果要儲存,則可以設定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 發送簡訊給我 |
引言: 如果要儲存,則可以設定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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |