Announcement

Collapse
No announcement yet.

Teilsummen im Grid bilden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Teilsummen im Grid bilden

    Folgendes kleines Problem:

    Ich lese eine Textdatei mit Buchungssätzen in ein Grid.

    Danach durchlaufe ich das Grid und errechne einen Wert. Dieser Wert soll dann, wenn die alle Zeilen einer Rechnung durchlaufen worden sind, in einer zusätzlichen Zeile - also nachfolgend - in das Grid eingefügt werden. Ganz so wie es Excel beim teilsummieren macht.

    Da ich weiss dass ich schlecht beschreiben kann kurz ein exemplarisches Beispiel:

    RG-Nr; Umsatz; ......
    1234; 1230
    1234; 780
    1234; 12
    9999; 1200
    9999; 1342
    6667; 1654
    6667; 3131

    Im Grid soll dies dann etwa so aussehen:

    1234; 1230
    1234; 780
    1234; 12
    1234; MeinWert
    9999; 1200
    9999; 1342
    9999; MeinWert
    6667; 1654
    6667; 3131
    6667; MeinWert

    ....

    Wer kann mir ein wenig auf die Sprünge helfen?

    Danke
    Heiko

  • #2
    Moin Heiko,

    die einfachste Lösung wäre, die Berechnung VORHER durchzuführen und dann erst das Grid zu füllen.
    Falls das nicht möglich ist:
    procedure TForm1.CalculateSums;

    procedure InsertSum(i, iRgNrMerk, iSum: integer);
    var
    pSl : TStrings;
    begin
    StringGrid1.RowCount := StringGrid1.RowCount+1;
    pSl := TStringList.Create;
    try
    pSl.Assign(StringGrid1.Cols[0]);
    pSl.Insert(i, IntToStr(iRgNrMerk));
    StringGrid1.Cols[0].Assign(pSl);

    pSl.Assign(StringGrid1.Cols[1]);
    pSl.Insert(i, IntToStr(iSum));
    StringGrid1.Cols[1].Assign(pSl);
    finally
    pSl.Free;
    end;
    end;

    var
    i, iRgNr, iUmsatz, iRgNrMerk, iSum, iCount : integer;
    begin
    iRgNrMerk := -1; // Merker für aktuelle RGNr
    iSum := 0; // Aktuelle Summe
    iCount := 0; // Aktuelle Summanden-Anzahl

    i := 1;
    while (i <= StringGrid1.RowCount-1) do begin
    iRgNr := StrToIntDef(StringGrid1.Cols[0][i], -1);
    iUmsatz := StrToIntDef(StringGrid1.Cols[1][i], 0);
    if (iRgNr >= 0) then begin
    if (iRgNr <> iRgNrMerk) then begin
    if (iCount > 0) then begin // Summe eintragen
    InsertSum(i, iRgNrMerk, iSum);
    Inc(i);
    end;
    //Merker neu setzen
    iRgNrMerk := iRgNr; // Merker für aktuelle RGNr
    iSum := 0; // Aktuelle Summe
    iCount := 0; // Aktuelle Summanden-Anzahl
    end;

    Inc(iCount);
    iSum := iSum + iUmsatz;

    if (i = StringGrid1.RowCount-1) then begin
    InsertSum(i+1, iRgNrMerk, iSum);
    Break;
    end;
    end;
    Inc(i);
    end;
    end;
    Die komplette unit ist als Anhang dabei.
    Gruß,
    Geer

    Comment

    Working...
    X