Announcement

Collapse
No announcement yet.

SELECT SUM und GROUP BY selbst gemacht

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

  • SELECT SUM und GROUP BY selbst gemacht

    Hallo Gemeinde,

    irgendwie stehe ich an der Wand:<br>
    ich habe ein Listenobjekt, das ein Objekt ähnlich wie ein Record enthält - also im Prinzip so was wie eine Tabelle. Die Daten in dieser "Tabelle" liegen in sortierter Form vor. In dieser "Tabelle" gibt es zwei Felder: Artikelnummer und Menge. Es können identische Daten in der "Spalte" Artikelnummer sein, aber unterschiedliche (oder ggf. auch gleiche) Daten für Menge.<br>
    Ich möchte nun durch meine "Tabelle" iterieren und solange eine Summe aus 'Menge' bilden, bis der Eintrag in 'Artikelnummer' nicht mehr dem vorherigen entspricht.<br>
    Ich hab's mit deiner for Schleife versucht, habe Schwierigkeiten mit den Anfangsbedingungen.

    Wer hat einen Lösungsansatz?

    Vielen Dank
    Uwe

  • #2
    Hallo,<br>
    ich würde das irgendwie so machen...<br>
    <pre>
    type
    TArtikel = record
    Artikelnummer : integer;
    Menge : integer;
    end;<br>

    TArtikelStamm = array of TArtikel;<br>

    function findFirstEntry(ID:integer; ArtikelStamm:TArtikel; var iResult:integer):boolean;
    begin
    result:=false;
    for iResult:=low(ArtikelStamm) to high(ArtikelStamm) do
    if ArtikelStamm[iResult].ArtikelNummer = ID then
    begin
    result:=true;
    exit;
    end;
    end;<br>

    function GetSumme(ID:integer; ArtikelStamm:TArtikelStamm):integer;
    var iStart:integer; bBreak:boolean;
    begin
    result:=0;
    bBreak:=false
    if FindFirstEntry(ID, ArtikelStamm,iStart)then
    while not bBreak do
    begin
    inc(result, ArtikelStamm[iStart].Menge)
    inc(iStart);
    bBreak:=(iStart>high(ArtikelStamm)) or (ArtikelStamm[iStart].ArtikelNummer<>ID);
    end;
    end;
    </pre>
    <br>
    Gruß<br>
    Patric

    Comment


    • #3
      Hallo Patrick,

      ersma merci für Deine prompte Hilfe. <br>
      Nur leider hat das nicht gefunzt. Zum einen müssen Zählervars lokal Variablen sein. Die (iResult) hab ich zwar durch eine weitere erstzen können und der dann den Wert von iResult zuweisen können, aber die Ergebnisse waren nicht das, was ich brauche. Als Ergebnis von GetSumme kam nur die Summe des letzten(!) Artikel in der Liste. Auch nach vielen "Rumbasteln" kam kein vernünftiges Ergebnis zustande. <br>
      Mein Lösungsvorschlag(so hat's dann auch gefunzt):<br>
      Anlegen einer TStringList; durch folgende Funktion darin Werte einfügen:
      <PRE>
      var
      i : Integer;
      ArtNr : String
      begin
      ArtNr:= '';
      for i:= 0 to ZugangListe.Count - 1 do
      if ArtNr <> ZugangListe[i].ItemNr then
      Liste.Items.Add(ZugangListe[i].ItemNr); //Liste ist die TStringList
      ArtNr:= ZugangListe[i].ItemNr;
      <PRE>
      Auf diese Weise habe ich schon mal das "GROUP BY" nachgebaut. Danach lasse ich in einer weiteren "for"-Schleife die Werte der Stringliste durch die Zugangliste laufen:<br>
      <PRE>
      function GetSumme(ZugangListe : TZugangListe) : Integer;
      var
      i: Integer;
      begin
      for i:= 0 to ZugangListe.Count - 1 do
      if ZugangListe[i].ItemNr = TempList[i]
      then Result:= Result + ZugangListe[j].Amount;
      <PRE>
      Dann habe ich noch zwei dynamische Arrays mit der Länge TempList.Count dimensioniert und mit folgender Prozedure gefüllt:
      <PRE>
      procedure FillArrays;
      var
      i : Integer;
      begin
      for i:= 0 to TempList.Count - 1 do
      ItemNrArray[i]:= TempList[i];
      AmountArray[i]:= GetSumme(TempList[i]);
      end;
      <PRE>
      Und schwupp - hab ich ein wunderbares "SELECT SUM FROM Table GROUP BY Feld"!
      <br>
      <br>
      Viele Grüße

      Uw

      Comment

      Working...
      X