簡體   English   中英

dbgrid計算

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM