2016-05-12 12 views
0

Ich habe dbgrid, welches Spalte Zwischensumme und Spaltenprozentwert anzeigt, wie Spaltenspalte aus dieser Formel angezeigt wird: (Zwischensumme/Gesamtsumme) * 100%? für Detailinformationen unten BildWie man den Prozentsatz aus dem Berechnungssatz dividiert mit der Zusammenfassung DBGRID macht. Delphi

enter image description here

ich meine SQL ändern könnte nicht, weil mein SQL sehr kompliziert ist, so denke ich, Lösung vielleicht berechnetes Feld verwenden, tut es bitte? Könnte jemand mir helfen, dieses Problem zu lösen. Danke in fortgeschrittenem.

+0

Try berechnetes Feld hinzuzufügen, in Felder-Editor – Marusyk

+1

Welche Art von TDataSet-Komponente liefert die Daten an das Netz DBGRID? – MartynA

+0

Ich benutze Zeos Komponente –

Antwort

4

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; 
+0

okay, wird versuchen, bro –