Im Folgenden wird davon ausgegangen, dass Ihr Dataset nicht die letzte angezeigte Zeile enthält, die "111077, 100" enthält. Wenn dies der Fall ist, sind die unten angegebenen Schritte zur Berechnung des GrandTotals nicht erforderlich. und Sie müssen nur das berechnete Feld Percent
auffüllen, was trivial ist.
Wenn Ihr Datensatz ein TClientDataSet
ist, können Sie die Prozentwerte implementieren ganz problemlos die Kombination eines TAggregateField
mit dem Grandtotal vertreten und ein berechnetes Feld die Daten jeder Zeile der Beitrag zum Grandtotal zu vertreten. Siehe Code unten.
Wenn Sie kein TClientDataSet verwenden bereits dann haben Sie mehrere Möglichkeiten, einschließlich
Wenn Ihr Datensatz von einem Typ ist, der aggregate fields
unterstützt, dann können Sie das Äquivalent des Codes unten tun.
Verwenden Sie Ihre vorhandenen Datensatz als den Datensatz Quelle eines TDataSetProvider
, und verwenden Sie die TDataSetProvider
als Provider
eines TClientDataSet
und verwenden Sie die TClientDataSet
die Daten auf Ihrem Netz einspeisen.
Verwenden Sie keine TClientDataSet
und/oder TAggregateField
und stattdessen ähnlich tun, was mit Ihrem vorhandenen Datensatz unten gezeigt wird, aber die prozentuale Feld ein fkInternalCalc
Feld, wenn Ihr Dataset-Typ unterstützt, oder ein fkCalculated
eines, wenn nicht , lassen Sie das Feld GrantTotal TAggregateField
aus und berechnen Sie den GrandTotal im Code. Eine Möglichkeit, dies zu tun, wäre, es durch eine einmalige Durchquerung des Datensatzes (while not DataSet.Eof ...
) zu berechnen, nachdem Sie es geöffnet haben.
Im folgenden Code, ich habe alle Felder im Code erstellt, anstatt mit dem Editor Fields Objektinspektor So können genau sehen können, was die minimalen Einstellungen notwendig sind, ein TAggregateField
zur Arbeit zu kommen.
Hinweis: Ich könnte falsch liegen, aber glaube nicht, dass du einen Standard TDBGrid
erhalten kannst, um die letzte 100% -Zeile deines Screenshots anzuzeigen. Ähnliches könnte unter anderem mit dem Developer Express TcxGrid
gemacht werden, aber wenn Sie dafür ein TDBGrid benötigen, sollten Sie nach einer neuen Frage fragen.
-Code
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;
Try berechnetes Feld hinzuzufügen, in Felder-Editor – Marusyk
Welche Art von TDataSet-Komponente liefert die Daten an das Netz DBGRID? – MartynA
Ich benutze Zeos Komponente –