簡體   English   中英

如何通過計算記錄除以匯總DBGRID Delphi來得出百分比

[英]How to make percentage from calculation record divided with summary DBGRID Delphi

我有顯示列小計和列百分比的dbgrid,如何從此公式顯示列百分比:(小計/總計)* 100%? 有關詳細信息,請參見下圖

在此處輸入圖片說明

我無法修改我的SQL,因為我的SQL非常復雜,所以我認為解決方案可能使用計算字段,不是嗎? 有人可以幫我解決這個問題。 提前致謝。

以下假設您的數據集實際上不包含顯示的最后一行,而是包含“ 111077,100”的行-如果包含,那么下面顯示的用於計算GrandTotal的步驟是不必要的,您只需要填充瑣碎的Percent計算字段。

如果您的數據集是TClientDataSet ,則可以使用TAggregateField代表GrandTotal和計算字段代表每個數據行對GrandTotal的貢獻,很容易地實現Percent值。 請參見下面的代碼。

如果尚未使用TClientDataSet,則有幾種選擇,包括

  • 如果您的數據集是支持aggregate fields的類型,則可以執行以下代碼的等效操作。

  • 使用現有的DataSet作為TDataSetProvider的數據集源,並使用TDataSetProvider作為TClientDataSetProvider ,並使用TClientDataSet將數據提供給網格。

  • 不要使用TClientDataSet和/或TAggregateField ,而是使用現有的DataSet進行以下顯示,但是如果您的DataSet類型支持,請將Percent字段設置為fkInternalCalc字段,否則將其設置為fkCalculated ,請省略GrantTotal TAggregateField字段並在代碼中計算GrandTotal。 一種方法是打開數據集后,通過一次遍歷數據集( while not DataSet.Eof ... )來計算它。

在下面的代碼中,我已經在代碼中創建了所有字段,而不是使用對象檢查器的字段編輯器,因此您可以輕松地確切地看到使TAggregateField起作用所需的最小設置是什么。

注意:我可能是錯的,但是您認為您無法獲得標准的TDBGrid來顯示屏幕快照的最后100%。 使用Developer Express TcxGrid等可以進行類似的操作,但是如果您需要TDBGrid來執行此操作,則應詢問如何提出新問題。

  TForm1 = class(TForm)
    CDS: TClientDataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    procedure CDSCalcFields(DataSet: TDataSet);
    procedure FormCreate(Sender: TObject);
  private
    CDSID : TIntegerField;
    CDSTotal : TCurrencyField;
    CDSPercent : TFloatField;
    CDSGrandTotal : TAggregateField;
  public
    procedure SetUp;
  end;

[...]

procedure TForm1.SetUp;
var
  i : Integer;
begin
  CDSID := TIntegerField.Create(Self);
  CDSID.FieldName := 'ID';
  CDSID.FieldKind := fkData;
  CDSID.DataSet := CDS;

  CDSTotal := TCurrencyField.Create(Self);
  CDSTotal.FieldName := 'Total';
  CDSTotal.FieldKind := fkData;
  CDSTotal.DataSet := CDS;

  CDSPercent := TFloatField.Create(Self);
  CDSPercent.FieldName := 'Percent';
  CDSPercent.FieldKind := fkInternalCalc;
  CDSPercent.DataSet := CDS;

  CDSGrandTotal := TAggregateField.Create(Self);
  CDSGrandTotal.FieldName := 'GrandTotal';
  CDSGrandTotal.FieldKind := fkAggregate;
  CDSGrandTotal.Expression := 'Sum(Total)';
  CDSGrandTotal.DataSet := CDS;
  CDSGrandTotal.Active := True;

  CDS.OnCalcFields := CDSCalcFields;
  CDS.IndexFieldNames := 'ID';

  CDS.CreateDataSet;
  for i := 1 to 2 do begin
    CDS.InsertRecord([i, i]);
  end;

  CDS.First;
end;

procedure TForm1.CDSCalcFields(DataSet: TDataSet);
var
  Value : Double;
  V : Variant;
begin
  V := CDSGrandTotal.Value;
  if not VarIsNull(V) then begin
    Value := CDSTotal.AsFloat;
    Value := Value * 100 / V;
    CDSPercent.Value := Value;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetUp;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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