END-ALL
|
||||||||||
[AND]
|
||||||||||
SORT
|
|
THEM
|
|
[BY]
|
|
operand1 |
|
ASCENDING
|
|
|
RECORDS
|
DESCENDING
|
|||||||||
| USING-clause | ||||||||||
| [GIVE-clause] | ||||||||||
|
statement
|
||||||||||
END-SORT [(r)]
|
* Wenn ein Statement-Label angegeben wird, muss es vor dem Schlüsselwort
SORT, aber nach
END-ALL (und AND) stehen.
SORT
|
|
THEM
|
|
[BY]
|
|
operand1 |
|
ASCENDING
|
|
|
RECORDS
|
DESCENDING
|
|||||||||
| [USING-clause] | ||||||||||
| [GIVE-clause] | ||||||||||
|
statement
|
||||||||||
LOOP [(r)] |
||||||||||
Dieser Abschnitt behandelt folgende Themen:
Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.
Verwandtes Statement: FIND mit
SORTED BY-Option
Gehört zur Funktionsgruppe: Schleifenverarbeitung
Das Statement SORT dient dazu, eine Sortieroperation durchzuführen und die
Datensätze aus allen Verarbeitungsschleifen, die zum Zeitpunkt der
SORT-Ausführung aktiv sind, zu sortieren.
Für die Sortieroperation wird Naturals internes Sortierprogramm verwendet. Es kann stattdessen auch ein anderes, externes Sortierprogramm verwendet werden.
Das SORT-Statement muss im selben Objekt stehen wie die
Verarbeitungsschleifen, deren Datensätze es sortiert.
Geschachtelte SORT-Statements sind nicht erlaubt.
Die Gesamtlänge eines zu sortierenden Datensatzes darf 10240 Bytes nicht überschreiten.
Die Anzahl der Sortierkriterien darf 10 nicht überschreiten.
Operanden-Definitionstabelle:
| Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| operand1 | S | A | N | P | I | F | B | D | T | nein | nein | ||||||||
Syntax-Element-Beschreibung:
| Syntax-Element | Beschreibung |
|---|---|
END-ALL
|
Schließen aller zurzeit aktiven Schleifen:
Im Structured Mode müssen Sie vor dem Anmerkung |
operand1
|
Sortierkriterien:
operand1 sind die Felder/Variablen, die als Sortierkriterium dienen. 1 bis 10 Felder dürfen angegeben werden. Hierbei kann es sich um Datenbankfelder (Deskriptoren oder Nicht-Deskriptoren) und/oder Benutzervariablen handeln. Multiple Felder oder Felder aus einer Periodengruppe können ebenfalls verwendet werden; eine Feldgruppe oder ein Array kann nicht verwendet werden. Anmerkung |
ASCENDING
|
Sortierreihenfolge:
Wird nichts anderes angegeben, so gilt Das Schlüsselwort |
DESCENDING
|
|
USING |
USING-Klausel: Siehe USING-Klausel weiter
unten.
Anmerkung |
GIVE |
GIVE-Klausel: Siehe GIVE-Klausel weiter
unten.
|
END-SORT
(r)
|
Ende des SORT-Statements:
Im Structured Mode muss das für Natural reservierte Wort Im Structured Mode können Sie bei Im Reporting Mode wird das Natural-Statement Im Reporting Mode können Sie bei |
LOOP
(r)
|
In der USING-Klausel geben Sie die Felder an, die in den
Sortier-Zwischenspeicher geschrieben werden sollen. Die USING-Klausel ist
im Structured Mode unbedingt erforderlich, im Reporting Mode nicht; allerdings wird
dringend empfohlen, sie auch im Reporting Mode zu verwenden, um Speicherplatz zu
sparen.
|
|
USING
{operand2}...
|
|
USING KEYS
|
Operanden-Definitionstabelle:
| Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| operand2 | S | A | A | N | P | I | F | B | D | T | L | C | nein | nein | |||||
Syntax-Element-Beschreibung:
Verwenden Sie keine USING-Klausel, so werden alle Datenbankfelder aus vor
dem SORT-Statement initiierten Verarbeitungsschleifen sowie alle vor dem
SORT-Statement definierten Benutzervariablen in den
Sortier-Zwischenspeicher geschrieben.
Wird nach Ausführung des SORT-Statements ein Feld referenziert, das nicht
in den Sortier-Zwischenspeicher geschrieben wurde, so ist der Wert des Feldes der, den
es vor der SORT-Operation hatte.
Die GIVE-Klausel dient dazu, Natural-Systemfunktionen
(MAX, MIN usw.) anzugeben, die in der ersten Phase des
Sortiervorgangs ausgewertet werden und dann in der dritten Phase referenziert werden
können (siehe Abschnitt Phasen der
SORT-Verarbeitung). Wird nach dem SORT-Statement
eine Systemfunktion referenziert, muss ihrem Namen ein Stern vorangestellt werden;
Beispiel: *AVER(SALARY).
Anmerkung
Anstelle des Schlüsselworts GIVE können Sie auch das Schlüsselwort
GIVING verwenden.
|
|
|
MAX
|
|
|
||||||
MIN
|
||||||||||
NMIN |
||||||||||
COUNT |
||||||||||
GIVE
|
NCOUNT |
[OF]
|
|
(operand3
|
|
[(NL=nn)]
|
||||
OLD |
operand3
|
|||||||||
AVER |
||||||||||
NAVER |
||||||||||
SUM |
||||||||||
TOTAL |
Operanden-Definitionstabelle:
| Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| operand3 | S | A | * | ja | nein | ||||||||||||||
* je nach Funktion
Syntax-Element-Beschreibung:
| Syntax-Element | Beschreibung |
|---|---|
MAX | MIN |
NMIN |
COUNT |
NCOUNT |
OLD |
AVER |
NAVER |
SUM |
TOTAL
|
Näheres zu den einzelnen Systemfunktionen finden Sie in der Systemfunktionen-Dokumentation. |
operand3
|
operand3 ist der Feldname. |
(NL=nn.m)
|
Diese Option gilt nur für Diese Option kann dazu verwendet werden, einen arithmetischen Überlauf bei der Auswertung von Systemfunktionen zu vermeiden; sie ist unter Format- und Längenerfordernisse bei AVER, NAVER, SUM und TOTAL in der Systemfunktionen-Dokumentation beschrieben. |
Ein Programm, das ein SORT-Statement enthält, wird in drei Phasen
ausgeführt:
Die Statements vor dem SORT-Statement werden ausgeführt. Die in der
USING-Klausel angegebenen Daten werden in den Sortier-Zwischenspeicher
geschrieben.
Im Reporting Mode dürfen Variablen, die nach dem Sortieren als Akkumulatoren verwendet
werden, nicht vor dem SORT-Statement definiert werden.
Im Structured Mode dürfen sie nicht in der USING-Klausel angegeben werden.
In den Sortier-Zwischenspeicher geschriebene Felder können als Akkumulatoren nicht verwendet werden, weil sie in der dritten Phase mit jedem einzelnen Datensatz zurückgeschrieben werden. Folglich hätte die Akkumulationsfunktion nicht das gewünschte Ergebnis, da das Feld bei jedem Datensatz mit dem Wert des jeweiligen Datensatzes überschrieben würde.
Die Anzahl der in den Sortier-Zwischenspeicher geschriebenen Datensätze ergibt sich aus
der Anzahl der Verarbeitungsschleifen und der Anzahl der verarbeiteten Datensätze pro
Schleife. Jedesmal wenn das SORT-Statement in einer Verarbeitungsschleife
ausgeführt wird, wird im internen Sortier-Zwischenspeicher ein Datensatz angelegt.
Bei geschachtelten Schleifen wird ein Datensatz nur in den Sortier-Zwischenspeicher
geschrieben, wenn die innere Schleife ausgeführt wird. Sollen im folgenden Beispiel
Datensätze in den Sortier-Zwischenspeicher geschrieben werden, auch wenn in der inneren
(FIND-)Schleife keine gefunden werden, so muss das FIND-Statement eine IF NO RECORDS
FOUND-Klausel enthalten.
READ ... ... FIND ... ... END-ALL SORT ... DISPLAY ... END-SORT ...
Die Datensätze werden sortiert.
Die Datensätze aus dem Sortier-Zwischenspeicher werden in der angegebenen Sortierfolge
mit den auf das SORT-Statement folgenden Statements weiterverarbeitet. Werden
Datenbankfelder nach dem SORT-Statement referenziert, so muss dies über ein
Statement-Label oder durch Angabe der entsprechenden Quellcode-Zeilennummer erfolgen.
** Example 'SRTEX1S': SORT (structured mode)
************************************************************************
DEFINE DATA LOCAL
1 EMPL-VIEW VIEW OF EMPLOYEES
2 CITY
2 SALARY (1:2)
2 PERSONNEL-ID
2 CURR-CODE (1:2)
*
1 #AVG (P11)
1 #TOTAL-TOTAL (P11)
1 #TOTAL-SALARY (P11)
1 #AVER-PERCENT (N3.2)
END-DEFINE
*
LIMIT 3
FIND EMPL-VIEW WITH CITY = 'BOSTON'
COMPUTE #TOTAL-SALARY = SALARY (1) + SALARY (2)
ACCEPT IF #TOTAL-SALARY GT 0
/*
END-ALL
AND
SORT BY PERSONNEL-ID USING #TOTAL-SALARY SALARY(*) CURR-CODE(1)
GIVE AVER(#TOTAL-SALARY)
/*
AT START OF DATA
WRITE NOTITLE '*' (40)
'AVG CUMULATIVE SALARY:' *AVER (#TOTAL-SALARY) /
MOVE *AVER (#TOTAL-SALARY) TO #AVG
END-START
COMPUTE ROUNDED #AVER-PERCENT = #TOTAL-SALARY / #AVG * 100
ADD #TOTAL-SALARY TO #TOTAL-TOTAL
/*
DISPLAY NOTITLE PERSONNEL-ID SALARY (1) SALARY (2)
#TOTAL-SALARY CURR-CODE (1)
'PERCENT/OF/AVER' #AVER-PERCENT
AT END OF DATA
WRITE / '*' (40) 'TOTAL SALARIES PAID: ' #TOTAL-TOTAL
END-ENDDATA
END-SORT
*
END
Ausgabe des Programms SRTEX1S:
PERSONNEL ANNUAL ANNUAL #TOTAL-SALARY CURRENCY PERCENT
ID SALARY SALARY CODE OF
AVER
--------- ---------- ---------- ------------- -------- -------
**************************************** AVG CUMULATIVE SALARY: 41900
20007000 16000 15200 31200 USD 74.00
20019200 18000 17100 35100 USD 83.00
20020000 30500 28900 59400 USD 141.00
**************************************** TOTAL SALARIES PAID: 125700
Das obige Beispiel wird wie folgt verarbeitet:
Von der EMPLOYEES-Datei werden Datensätze mit CITY =
BOSTON gelesen.
Die ersten beiden Ausprägungen des SALARY-Feldes werden in der
Variablen #TOTAL-SALARY addiert.
Es werden nur Datensätze weiterverarbeitet, bei denen der Wert von
#TOTAL-SALARY größer als 0 ist.
Die Sätze werden in den Sortier-Zwischenspeicher geschrieben. Die Datenbank-Arrays
SALARY (die ersten beiden Ausprägungen) und CURR-CODE
(erste Ausprägung), das Datenbankfeld PERSONNEL-ID und die
Benutzervariable #TOTAL-SALARY werden in den Zwischenspeicher
geschrieben.
Der Durchschnittswert von #TOTAL-SALARY wird errechnet.
Die Datensätze werden sortiert.
Der sortierte Zwischenspeicherinhalt wird gelesen.
Bei der Ausführung des AT START OF DATA-Blocks wird der
Durchschnittswert von #TOTAL-SALARY angezeigt.
Der Wert von #TOTAL-SALARY wird zu #TOTAL-TOTAL
hinzuaddiert; es werden die Felder PERSONNEL-ID, SALARY
(1), SALARY (2), #AVER-PERCENT und
#TOTAL-SALARY angezeigt.
Bei der Ausführung des AT END OF DATA-Blocks wird die Variable
#TOTAL-TOTAL ausgegeben.
Äquivalentes Reporting-Mode-Beispiel: SRTEX1R.
** Example 'SRTEX2': SORT
************************************************************************
DEFINE DATA LOCAL
1 VEHIC-VIEW VIEW OF VEHICLES
2 MAKE
2 YEAR
END-DEFINE
*
LIMIT 10
*
READ VEHIC-VIEW
END-ALL
SORT BY MAKE YEAR USING KEY
DISPLAY NOTITLE (AL=15) MAKE (IS=ON) YEAR
AT BREAK OF MAKE
WRITE '-' (20)
END-BREAK
END-SORT
END
Ausgabe des Programms SRTEX2S:
MAKE YEAR
--------------- -----
FIAT 1980
1982
1984
--------------------
PEUGEOT 1980
1982
1985
--------------------
RENAULT 1980
1980
1982
1982
--------------------
** Example 'SRTEX3': SORT values in an array *********************************************************************** DEFINE DATA LOCAL 1 #I (I4) 1 #J (I4) 1 #X (I1) 1 #TAB (I1/1:6) INIT <2,4,6,5,3,1> END-DEFINE WRITE 'Array before SORT:' #TAB(*) / * FOR #I := 1 TO 6 #X := #TAB(#I) WRITE #X '<-- Put into SORT record' END-ALL SORT #X USING KEYS WRITE #X '<-- Get from SORT' ADD 1 TO #J #TAB(#J) := #X END-SORT * WRITE / 'Array after SORT:' #TAB(*) END
Ausgabe des Programms SRTEX3:
Array before SORT: 2 4 6 5 3 1
2 <-- Put into SORT record
4 <-- Put into SORT record
6 <-- Put into SORT record
5 <-- Put into SORT record
3 <-- Put into SORT record
1 <-- Put into SORT record
1 <-- Get from SORT
2 <-- Get from SORT
3 <-- Get from SORT
4 <-- Get from SORT
5 <-- Get from SORT
6 <-- Get from SORT
Array after SORT: 1 2 3 4 5 6
In Natural werden Sortiervorgänge standardmäßig von Naturals internem Sortierprogramm verarbeitet, wie oben beschrieben. Allerdings kann auch ein externes Sortierprogramm benutzt werden. Dieses externe Sortierprogramm verarbeitet dann die Sortiervorgänge anstatt das internen Sortierprogramms von Natural.
Das zu benutzende externe Sortierprogramm wird vom Natural-Administrator im Makro
NTSORT des Natural-Parametermoduls festgelegt. Zur
Benutzung eines externen Sortierprogrammes ist zusätzliche JCL erforderlich. Wenn Sie
Fragen haben, wenden Sie sich an Ihren Natural-Administrator.