PDA

View Full Version : Wie sortiere ich ab besten ..



malzusrex
05-05-04, 08:32
Moin Moin liebes Forum.

Ich grüble gerade darüber, wie ich im folgenden am besten sortiere.
Ich habe 2 Feldgruppen


d F_Kunde_Objekt s dim( MaxIndex ) like(kd_obj)
d F_Menge s 5 0 dim( MaxIndex )
d
d MaxIndex c 9999


In F_Kunde_Objekt wir in "loser" Reihenfolge befüllt, und zu dem entsprechenden Index die Menge in F_Menge gesammelt. Nun möchte ich F_Kunde_Objekt aufsteigend sortieren. wenn ich

c SortA F_Kunde_Objekt
nehme, dann ist zwar die Feldgruppe sortiert, aber passt nicht mehr zu F_Menge. Gibt es hier ne elegante Lösung ?? Oder muss ich wie gehabt die Feldgruppe mit einer Schleife durchlaufen und immer INDEX mit INDEX-1 vergleichen und eventuell vertauschen .

Tschau Ronald

Nachtrag
Version sollte unter V5.1 laufen

Fuerchau
05-05-04, 10:08
D DS
D KundeObject 15 dim(9999) ascend
D Name 10 overlay(KundeObject:1)
D Menge 5 0 overlay(KundeObject:11)

D Index S 5 0
D SuchName S 10

C SORTA Name
C eval Index = %lookup(SuchName:Name)


Durch das Overlay kannst du Tabellenelemente überlagern und nach untergeordneten Elementen sortieren.
%lookup unterstützt bis zu 4 Argumente:
1. Suchfeld
2. Array
3. StartIndex
4. Anzahl Elemente

Aus Performance-Gründen sollte man ggf. immer die Anzahl aktive Elemente angeben, beim Sort besteht das Problem dass leere Einträge nach vorne sortiert werden, alternativ also "descend" oder die Einträge per INZ(*HIVAL) initialisieren.

KM
05-05-04, 11:53
Aus Performance-Gründen sollte man ggf. immer die Anzahl aktive Elemente angeben, beim Sort besteht das Problem dass leere Einträge nach vorne sortiert werden, alternativ also "descend" oder die Einträge per INZ(*HIVAL) initialisieren.

Dieses Problem kann man umgehen, indem man die C-Funktion qsort() anstatt SORTA verwendet.

Gruß,
KM

Fuerchau
05-05-04, 12:09
@KM
Da hast du schon recht, aber bei qsort() muss ich noch eine Vergleichsfunktion angeben, diese definieren und wissen wie der Aufruf von qsort() funktioniert.
Dann kann ich auch an Stelle von %lookup() auch bsearch() verwenden und sollte mir ggf. Gedanken über die Größe der Tabelle machen und ggf. den Platz per %alloc() / %realloc() verwalten.

Da verwende ich in RPG doch lieber sorta und %lookup.

KM
05-05-04, 12:38
@KM
Da hast du schon recht, aber bei qsort() muss ich noch eine Vergleichsfunktion angeben, diese definieren und wissen wie der Aufruf von qsort() funktioniert.

Das sollte doch nicht das Problem sein. Dafür gibt's Beispiele und Handbücher.



Dann kann ich auch an Stelle von %lookup() auch bsearch() verwenden und sollte mir ggf. Gedanken über die Größe der Tabelle machen und ggf. den Platz per %alloc() / %realloc() verwalten.

Das ist alles nicht notwendig.



Da verwende ich in RPG doch lieber sorta und %lookup.

Dann erkläre mir doch mal wie Du z.B. eine Tabelle mit positiven und negativen numerischen Werten korrekt mit SORTA sortieren willst. Hast Du das schon mal versucht ?

Gruß,
KM

Fuerchau
05-05-04, 12:48
Nehme einfach obiges Beispiel. Seit ILE kann ich mit Overlay eine strukturierte Tabelle definieren und der SORTA funktioniert auf JEDEM Overlay-Element !
Und wenn eine Tabelle (Array) numerisch definiert ist hat SORTA das Vorzeichen schon immer beachtet.

malzusrex
05-05-04, 12:52
auf die variante mit dem overlay wollte ich ja auch raus. ich hatte vor längerer zeit schon mal was in der art gemacht, nur leider nicht wieder gefunden. ich habe es jetzt an hand von fuerchaus beispiel umgesetzt, und es funzt so wie es soll.

danke
ronald

B.Hauser
05-05-04, 13:11
Hallo Ronald,

in der iNN - eNews vom Januar, war ein Artikel zu diesem Thema:
Sortierung von Feldgruppen nach Teil-Elementen (Spalten) (http://www.inn-online.de/iNN-eNews0104.html#Tekki1)


auf die variante mit dem overlay wollte ich ja auch raus. ich hatte vor längerer zeit schon mal was in der art gemacht, nur leider nicht wieder gefunden. ich habe es jetzt an hand von fuerchaus beispiel umgesetzt, und es funzt so wie es soll.

danke
ronald

Birgitta

KM
05-05-04, 15:36
@Fuerchau

dass das Vorzeichen schon immer beim SORTA berücksichtigt wurde, kann ich nicht bestätigen. Das war ja der Grund warum wir zum qsort() gewechselt sind. Wenn wir z.B. die Zahlenfolge 4, -1, -2, 2 mit SORTA aufsteigend sortiert haben, erhielten wir als Ergebnis die Reihenfolge
-1, -2, 2, 4. Das ist zwar HEX-mäßig richtig, da "1D" kleiner als "2D" ist, allerdings hat das unserer Anwendung nicht geholfen.

Außerdem, warum soll ich in einer Tabelle die leeren Elemente mit sortieren, die dann bei der Verarbeitung immer ignoriert werden müssen. Da ist der qsort() doch wesentlich angenehmer.

Gruß,
KM

B.Hauser
05-05-04, 15:41
Außerdem, warum soll ich in einer Tabelle die leeren Elemente mit sortieren, die dann bei der Verarbeitung immer ignoriert werden müssen. Da ist der qsort() doch wesentlich angenehmer.


Ab Release V5R3 ist auch dieses Problem behoben. Mit einer neuen Built-in-Funktion (%SubArr) können Teile einer Feldgruppe sortiert werden.

Birgitta