![]() |
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] |
Re: Mherdimensionales Array (Array of array) sortieren
Zitat:
Eine SQL-Abfrage liefert normalerweise ein Recordset. Dieses kannst auch schon mit SQL formatieren lassen. Ergänze deine Abfrage einfach (etwa so):
SQL-Code:
Damit sollte die Reihenfolge wie gewünscht sein
select * from <TABLE> where ... order by ARTNR, DATUM
Gruß |
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. |
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 |
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:
Dieses kann man dann auch auf QuickSort und Co. anwenden, fals es immernoch zu langsam ist.
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; PS: es gab dieses Jahr schonmal so'nen Sortierthread, auch wenn ich ihn grad einfach nicht finden kann. :gruebel: |
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 |
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:
![]() |
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:
Ich rate mal: "="?
If (Arr[i].ArtikelNr > Arr[k].ArtikelNr) or ((Arr[i].ArtikelNr ) ??? Arr[k].ArtikelNr)
and (Arr[i].Lieferdatum > Arr[k].Lieferdatum)) Then Begin Danke |
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 |
Re: Mherdimensionales Array (Array of array) sortieren
Hallo,
was heißt eigentlich das
Delphi-Quellcode:
Genaugenommen das
If (Arr[i].ArtikelNr > Arr[k].ArtikelNr) or ((Arr[i].ArtikelNr = Arr[k].ArtikelNr)
and (Arr[i].Lieferdatum > Arr[k].Lieferdatum)) Then Begin
Delphi-Quellcode:
? Ich habe es umgeschrieben in
Arr[i].ArtikelNr
Delphi-Quellcode:
weil ich darüber die Splaten ansteuer.
If (Rows7[0,i] > Rows7[0,k]) or ((Rows7[0,i] = Rows7[0,k])
and (Rows7[1,i] > Rows7[1,k])) Then Begin 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:
Habe ich da einen Denkfehler?
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); Danke Ykcim |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr. |
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