[英]How to make percentage from calculation record divided with summary DBGRID Delphi
以下假設您的數據集實際上不包含顯示的最后一行,而是包含“ 111077,100”的行-如果包含,那么下面顯示的用於計算GrandTotal的步驟是不必要的,您只需要填充瑣碎的Percent
計算字段。
如果您的數據集是TClientDataSet
,則可以使用TAggregateField
代表GrandTotal和計算字段代表每個數據行對GrandTotal的貢獻,很容易地實現Percent值。 請參見下面的代碼。
如果尚未使用TClientDataSet,則有幾種選擇,包括
如果您的數據集是支持aggregate fields
的類型,則可以執行以下代碼的等效操作。
使用現有的DataSet作為TDataSetProvider
的數據集源,並使用TDataSetProvider
作為TClientDataSet
的Provider
,並使用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.