[英]How to make percentage from calculation record divided with summary DBGRID Delphi
[英]Dbgrid calculation
我有一個DBGrid,我正在嘗試制作一張帳單,但有時它不進行計算。 我該如何避免呢?
procedure TOrcamentos.DBGridEh1ColExit(Sender: TObject);
var
percent: double;
Unid: double;
tot: currency;
vaz: string;
begin
if Dorcamen_SUB.DataSet.State in [dsEdit, dsInsert] then
try
Dorcamen_SUB.DataSet.Post;
finally
vaz := DBGridEh1.Columns[3].Field.text;
if (vaz<> '') then
try
Torcamen_SUB.Edit;
Unid := (Torcamen_SUB.FieldByName('QT').AsFloat);
tot := (Torcamen_SUB.FieldByName('Precovenda').AsFloat);
percent := (Torcamen_SUB.FieldByName('Desconto').AsFloat);
try
tot := tot+(tot * percent)/ 100;
finally
Torcamen_SUB.FieldByName('Total').AsFloat := unid*tot;
Torcamen_SUB.Post;
Orcamentos.TotalExecute(self);
end;
except
end;
end;
end;
實施計算的更好方法是將計算移至網格所鏈接到的TTable組件。 Total字段實際上不應該是數據庫中的一個字段,因為它應該是一個基於其他字段的值的計算字段。 只需使用表的字段編輯器添加一個額外的字段,輸入字段名稱Total,選擇正確的數據類型,然后將字段類型選擇為Calculated。 單擊“確定”,然后為表的OnCalcField事件添加與此類似的代碼:
Torcamen_SUB.FieldByName('Total')。AsFloat:= Torcamen_SUB.FieldByName('QT')。AsFloat *(Torcamen_SUB.FieldByName('Precovenda')。AsFloat +(Torcamen_SUB.FieldByName('Precovenda')。 ('Desconto')。AsFloat)/ 100);
一般的經驗法則是,除非確實有必要,否則不應將計算出的值保存到數據庫中。 最好只是將它們作為計算字段添加到數據集中,然后將網格鏈接到數據集。 然后,所有計算字段將顯示在網格中,並且每一行將基於該行的值顯示正確的計算值。
我認為您正在將業務邏輯(例如計算總數)與用戶交互邏輯(例如某個網格列失去焦點的事件)混合在一起,這就是應用程序行為不穩定的原因。
看起來甚至您都不知道它發生在哪里以及什么地方沒有發生。
考慮使用Field的事件(例如OnChange事件)執行這種計算。
幸運的是,如果您使用的是具有聚合功能的數據集(例如TClientDataSet),因為您只需在TAggregateField中聲明所需內容 ,而無需手動進行計算。
這不是您的問題,但是……請謹慎使用try / finally的方式……例如,在這段代碼中:
try
tot := tot+(tot * percent)/ 100;
finally
Torcamen_SUB.FieldByName('Total').AsFloat := unid*tot;
//other things
end;
請注意,如果由於某些原因在try和finally子句之間的行上發生了異常,則變量tot將具有未定義的值(在這種情況下,是前一個賦值的結果),因此對Torcamen_SUB.total字段的賦值畢竟是錯誤的。 我不確定這是否真的是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.