Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mehrdimensionales Array (Array of array) sortieren (https://www.delphipraxis.net/144401-mehrdimensionales-array-array-array-sortieren.html)

Ykcim 7. Dez 2009 10:18


Mehrdimensionales Array (Array of array) sortieren
 
Hallo Zusammen,

ich habe ein für mich nicht lösbares Problem. Auch wenn ich einige Sachen gefunden habe, konnte ich sie nicht so nachvollziehen, dass ich sie hätte verwenden können, daher habt bitte Geduld mit mir.

Ich als Ergebnis einer SQL-Abfrage ein Array of array. Dieses muss ich jetzt sortiert bekommen und ich weiß nicht einmal, wie ich anfangen soll.

Hier mal ein Beispiel, wie das Array aussieht:

ArtikelNr - Lieferdatum - Menge - Kunde
4711 - 15.12.2009
4822 - 14.12.2009
4822 - 12.12.2009
4822 - 10.01.2010
4711 - 10.12.2009
4711 - 18.12.2009
4822 - 30.01.2010
4711 - 29.01.2010

Und so weiter. Das Array kann durchaus 40.000 Datensätze enthalten.

Ich möchte es jetzt so sortieren, dass das Ergebnis wie folgt aussieht:

ArtikelNr - Lieferdatum - Menge - Kunde
4711 - 10.12.2009
4711 - 15.12.2009
4711 - 18.12.2009
4711 - 29.01.2010
4822 - 12.12.2009
4822 - 14.12.2009
4822 - 10.01.2010
4822 - 30.01.2010

=> Also immer nach ArtikelNr sortiert und innerhalb nach Datum sortiert.

Könnt Ihr mir bei der Bewältigung dieser Aufgabe helfen?

Vielen Dank im Voraus

Ykcim

[edit=alzaimar] Weckstabenverbuchselung im Header korrigiert. Mfg, alzaimar[/edit]

schlecki 7. Dez 2009 10:22

Re: Mherdimensionales Array (Array of array) sortieren
 
Zitat:

Zitat von Ykcim
{...} SQL-Abfrage ein Array of array. Dieses muss ich jetzt sortiert{...}
=> Also immer nach ArtikelNr sortiert und innerhalb nach Datum sortiert.

Hallo,

Eine SQL-Abfrage liefert normalerweise ein Recordset. Dieses kannst auch schon mit SQL formatieren lassen.

Ergänze deine Abfrage einfach (etwa so):

SQL-Code:
select * from <TABLE> where ... order by ARTNR, DATUM
Damit sollte die Reihenfolge wie gewünscht sein

Gruß

himitsu 7. Dez 2009 10:24

Re: Mherdimensionales Array (Array of array) sortieren
 
Du gehst das Haauptarray durch, vergleichst jeweils die ArtikelNr und sortierst es danach,
so wie man es sonst mit einem normalem Array auch macht.
Oder (wie schon gesagt) du läßt dir das Array gleich sortiert geben.

Ykcim 7. Dez 2009 10:32

Re: Mherdimensionales Array (Array of array) sortieren
 
Hallo,

vielen Dank für die schnellen Antworten!

Wenn ich den MySQL-Server die Sortierung vornehmen lasse, dann dauert das gut und gerne 7-8 Sekunden. Da die Funktion häufig verwendet wird, ist das mehr als ich tolleriert wird...

Daher wollte ich es nicht über den MYSQL-Server machen lassen...

Wenn ich das HauptArray durchgehe und nach Artikelnummern vergleiche, dann bekomme wahrscheinlich (ich habe noch nie ein Array sortiert) das Array nach Artikelnummern sortiert, aber nicht auch nach Lieferdatum...

Würde es dann nicht so aussehen?

ArtikelNr - Lieferdatum - Menge - Kunde
4711 - 15.12.2009
4711 - 10.12.2009
4711 - 18.12.2009
4711 - 29.01.2010
4822 - 14.12.2009
4822 - 12.12.2009
4822 - 10.01.2010
4822 - 30.01.2010

Ykcim

himitsu 7. Dez 2009 10:45

Re: Mherdimensionales Array (Array of array) sortieren
 
Hast du je einen Index auf den zu sortierenden Feldern liegen?

'ne einfache Sortierung eines solchen Arrays ginge z.B. so
Delphi-Quellcode:
Type TArr = Array of String;
  TArrArr = Array of TArr;

Var i, k: Integer:
  Temp:  TArr;
  Arr:   TArrArr;

For i := 0 to High(Arr) - 1 do
  For k := i + 1 to High(Arr) do
    If (Arr[i].ArtikelNr > Arr[k].ArtikelNr) or ((Arr[i].ArtikelNr ) Arr[k].ArtikelNr)
        and (Arr[i].Lieferdatum > Arr[k].Lieferdatum)) Then Begin
      Temp  := Arr[i];
      Arr[i] := Arr[k];
      Arr[k] := Temp;
    End;
Dieses kann man dann auch auf QuickSort und Co. anwenden, fals es immernoch zu langsam ist.

PS: es gab dieses Jahr schonmal so'nen Sortierthread, auch wenn ich ihn grad einfach nicht finden kann.
:gruebel:

Ykcim 7. Dez 2009 10:58

Re: Mherdimensionales Array (Array of array) sortieren
 
Hallo,

Was meinst Du mit Index auf den zu sortierenden Feldern? Die Tabelle, aus die Daten kommen, wird mindestens einmal am Tag gellert und mit aktuellen Daten aus dem PPS System gefüllt...


Ich hatte schon einmal überlegt, dass ich vielleicht in zwei Steps arbeiten muss. Erst das Array nach Lieferdatum sortieren, was dann so aussehen könnte:

ArtikelNr - Lieferdatum - Menge - Kunde
4711 - 10.12.2009
4822 - 12.12.2009
4822 - 14.12.2009
4711 - 15.12.2009
4711 - 18.12.2009
4822 - 10.01.2010
4711 - 29.01.2010
4822 - 30.01.2010

Und dann im zweiten Step nach ArtikelNr sortieren, was dann hoffentlich so aussehen würde:

ArtikelNr - Lieferdatum - Menge - Kunde
4711 - 10.12.2009
4711 - 15.12.2009
4711 - 18.12.2009
4711 - 29.01.2010
4822 - 12.12.2009
4822 - 14.12.2009
4822 - 10.01.2010
4822 - 30.01.2010

Ich weiß aber nicht genau, wie die Funktionsweise bei Sortieren eine Arrays funktioniert - ich habe es leider bei den Beispielen, die ich gefunden habe noch nicht hachvollziehen können...

Ich gucke mal, dass ich durch den letzten Beitrag durchsteige...

Ykcim

himitsu 7. Dez 2009 11:02

Re: Mherdimensionales Array (Array of array) sortieren
 
Wenn die Felder in der DB einen Index haben, dann sollte das Sortieren schneller gehn

Eventuell läßt sich die Tabelle auch gleich sortiert anlegen?


Zitat:

Ich hatte schon einmal überlegt, dass ich vielleicht in zwei Steps arbeiten muss.
muß man nicht ... man muß nur die Sortierkriterien entsprechend verknüpfen (siehe das IF im Beispiel)

http://www.delphipraxis.net/internal...%20of%20record

Ykcim 7. Dez 2009 11:16

Re: Mherdimensionales Array (Array of array) sortieren
 
Entschuldige,

ich versuche gerade Deinen Code in mein Programm zu übersetzen.

Kann es sein, dass hier ein Vergleichszeichen fehlt?

Delphi-Quellcode:
If (Arr[i].ArtikelNr > Arr[k].ArtikelNr) or ((Arr[i].ArtikelNr ) ??? Arr[k].ArtikelNr)
        and (Arr[i].Lieferdatum > Arr[k].Lieferdatum)) Then Begin
Ich rate mal: "="?

Danke

himitsu 7. Dez 2009 11:24

Re: Mherdimensionales Array (Array of array) sortieren
 
ups ... ja, das ) ist ein =

Delphi-Quellcode:
If (Arr[i].ArtikelNr > Arr[k].ArtikelNr) or ((Arr[i].ArtikelNr = Arr[k].ArtikelNr)
    and (Arr[i].Lieferdatum > Arr[k].Lieferdatum)) Then Begin

Ykcim 7. Dez 2009 12:03

Re: Mherdimensionales Array (Array of array) sortieren
 
Hallo,

was heißt eigentlich das
Delphi-Quellcode:
If (Arr[i].ArtikelNr > Arr[k].ArtikelNr) or ((Arr[i].ArtikelNr = Arr[k].ArtikelNr)
    and (Arr[i].Lieferdatum > Arr[k].Lieferdatum)) Then Begin
Genaugenommen das
Delphi-Quellcode:
Arr[i].ArtikelNr
? Ich habe es umgeschrieben in
Delphi-Quellcode:
If (Rows7[0,i] > Rows7[0,k]) or ((Rows7[0,i] = Rows7[0,k])
        and (Rows7[1,i] > Rows7[1,k])) Then Begin
weil ich darüber die Splaten ansteuer.

Rows7 ist ein
Delphi-Quellcode:
TCols = array of string;
TRows = array of TCols;
.

Nur dummerweise passiert nichts, wenn ich die Procedure durchführe... der Bereich und die IF-Schleife werden zwar durchlaufen, aber am Ergebnis sehe ich keine Veränderung...

So sieht mein Code aus:
Delphi-Quellcode:
Cols7:=Cols2;
  Rows7:=Rows2;

  For i := 0 to High(Rows7) - 1 do
  For k := i + 1 to High(Rows7) do
    If (Rows7[0,i] > Rows7[0,k]) or ((Rows7[0,i] = Rows7[0,k])
        and (Rows7[1,i] > Rows7[1,k])) Then Begin
      Cols6   := Rows7[i];
      Rows7[i] := Rows7[k];
      Rows7[k] := Cols6;
    End;

  Cols2:=Cols7;
  Rows2:=Rows7;
  FillGrid(SG2, Cols7, Rows7);
Habe ich da einen Denkfehler?

Danke
Ykcim


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz