PDA

View Full Version : SORTA läuft nicht wie gewünscht



Seiten : [1] 2

FNeurieser
10-03-22, 14:14
Hallo allerseits,

ich stehe momentan im wahrsten Sinne des Wortes auf dem Schlauch.

ich will ein Array sortieren


d ds03 49a DIM(10) DESCEND
d DS03ARTN 8s 0 Overlay(ds03:*next)
d DS03LINR 8s 0 Overlay(ds03:*next)
d DS03LANR 25a Overlay(ds03:*next)
d DS03AEDT 8s 0 Overlay(ds03:*next)


und zwar mit folgendem Befehl:



SORTA %SUBARR(DS03 : 1 : numDS03) %FIELDS(ds03linr : ds03aedt);


Das Feld numDS03 ist wie folgt definiert:


numDS03 s 10I 0


Die Sortierung soll nach DS03LINR und absteigend nach DS03AEDT erfolgen.

Aber, er zeigt mir schon bei der Codeingabe den folgenden Fehler:
Ende des Ausdrucks erwartet.

Was mache ich blos falsch????

Danke für eure Rückmeldungen.

Fuerchau
10-03-22, 14:47
Seit wann soll SORTA eine %Fields() verstehen?
%Fields() ist eine Feldnamenfunktion bei einem Update.

Ansonsten musst du die Felder in der benötigten Reihenfolge in die DS stellen um dann die DS zu sortieren. Wobei da dann generell nach Alpha sortiert wird.
Alternativ kannst du ein neues Feld mit Overlay definieren, dass die beiden Felder in der richtigen Folge zusammen fasst und dann darüber sortieren.
Dies impliziert einen Sort der DS durchdas Overlay-Konstrukt.

Und einen gemischten Sort gibts soweit nicht, da es ja SORTA(A/D) heißt.
Dafür könntest du ein Zonedfeld zusätzlich nehmen und per "999999 - %days(Datum)" ein absteigendes Datum berechnen.

FNeurieser
10-03-22, 15:00
Das habe ich so in der Doku zu 7.3 gelesen:



D emp DS QUALIFIED DIM(25)
D name 25A VARYING
D salary 9P 2
D numEmp S 10I 0

// Initialize the data structure
emp(1).name = 'Maria';
emp(1).salary = 1300;
emp(2).name = 'Pablo';
emp(2).salary = 1200;
emp(3).name = 'Bill';
emp(3).salary = 1100;
emp(4).name = 'Alex';
emp(4).salary = 1200;
numEmp = 4;

// Sort the EMP array using the SALARY and NAME subfields
SORTA %SUBARR(emp : 1 : numEmp) %FIELDS(salary : name);
// emp(1).name = 'Bill'
// emp(1).salary = 1100 <-----
// emp(2).name = 'Alex' <-----
// emp(2).salary = 1200 <-----
// emp(3).name = 'Pablo' <-----
// emp(3).salary = 1200 <-----
// emp(4).name = 'Maria'
// emp(4).salary = 1300 <-----

Robi
10-03-22, 15:16
Mußt du ggf ein QUALIFIED verwenden?

FNeurieser
10-03-22, 16:05
@Robi,

danke, das hat schon mal geholfen, hatte ich glatt übersehen. Jetzt bringt er zumindest nicht diese Fehlermeldung dafür aber


Datenstrukturfeldgruppe muss als DS_ARRAY(*).KEY_SUBF
angegeben werden.

Fuerchau
10-03-22, 17:08
Hm, vielleicht lässt du mal das Overlay weg, denn das ist ja in der DS unnötig.
Du bruchat nur ein Overlay, wenn du ein Feld innerhalb der DS redefinieren willst, was man allerdings besser mit einer geschachtelten DS machen sollte.

B.Hauser
10-03-22, 19:24
Lass mal das DESCEND weg.

camouflage
11-03-22, 07:41
Hast Du die Beispiele in der IBM Dok komplett durchgelesen?
SORTA(D) %subarr(emp(*).salary : 1 : numEmp);

würde einen descend Sort verursachen.
Also, Birgitta's Rat, lass den DESCEND weg.

Fuerchau
17-03-22, 11:19
So, konnte es mal nachprobieren und auch anwenden:
Nicht die DS muss DIM haben, sondern ein Feld in der DS:

d ds03 DS
d DS03Sort 49a DIM(10)
d DS03ARTN 8s 0 Overlay(ds03Sort:1)
d DS03LINR 8s 0 Overlay(ds03Sort:*next)
d DS03LANR 25a Overlay(ds03Sort:*next)
d DS03AEDT 8s 0 Overlay(ds03Sort:*next)

SORTA(D) %subarr(DS03Sort : 1 : numEmp);

FNeurieser
17-03-22, 12:09
Seruvs,
danke dass Du Dir die Mühe gemacht hast. Ich werde das so implementieren.

LG
Franz-Georg