Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

SORT-Anweisung

&pagelevel(4)&pagelevel

Funktion

Format 1

Sortieren von Datensätzen.

Mit der SORT-Anweisung können Datensätze, die entweder in einer Eingabe prozedur erzeugt werden oder in einer Datei enthalten sind, nach einer Anzahl von angegebenen Datenfeldern (Sortierschlüssel) sortiert werden. Die sortierten Sätze werden einer Ausgabeprozedur übergeben oder in eine Datei eingetragen.

Format 2

Sortieren von Tabellen.
Die SORT-Anweisung bewirkt, dass Tabellenelemente entsprechend einer vom Benutzer festgelegten Vergleichsfolge geordnet werden.

Format 1 Sortieren von Datensätzen


SORT sortierdateiname

{ON {DESCENDING | ASCENDING} {KEY | KEY-YY } {datenname-1}... }...

[WITH DUPLICATES IN ORDER]

[COLLATING SEQUENCE IS alphabetname]

{INPUT PROCEDURE IS paragrafenname-1 [{THRU | THROUGH} paragrafenname-2] | USING {dateiname-1}...}

{OUTPUT PROCEDURE IS paragrafenname-3 [{THRU | THROUGH} paragrafenname-4] | GIVING {dateiname-2}...}


Syntaxregeln

  1. Die SORT-Anweisung darf überall in der PROCEDURE DIVISION angegeben werden, außer

      • in DECLARATIVES und

      • in Ein- und Ausgabeprozeduren, die zu einer SORT-Anweisung gehören.

  2. sortierdateiname muss in einer Sortierdateierklärung (SD) in der DATA DIVISION beschrieben sein.

  3. sortierdateiname muss mit dem Sortierdateinamen übereinstimmen, der in der SELECT-Klausel (Format 2) angegeben ist.

  4. datenname-1... sind Sortierschlüssel. Ein Sortierschlüssel ist ein Teil des Datensatzes, der als Sortiergrundlage verwendet wird. Die Sortierschlüssel müssen in einer Datensatzbeschreibung, die zu einer SD-Erklärung gehört, definiert sein und unterliegen folgenden Regeln:

    1. Die Länge der Datenfelder darf nicht variabel sein.

    2. Datennamen, die die Sortierschlüssel beschreiben, dürfen gekennzeichnet sein (siehe „Kennzeichnung").

    3. Enthält die Sortierdateierklärung von sortierdateiname mehrere Datensatzbeschreibungen, müssen die Schlüssel nur in einer Datensatzbeschreibung definiert sein. Die durch den Schlüssel in einer Datensatzbeschreibung angesprochenenen Bytepositionen gelten auch als Schlüssel in allen anderen Datensatzbeschreibungen der Datei.

    4. Ein Sortierschlüssel darf nicht mit einer OCCURS-Klausel beschrieben und nicht einem Datenfeld untergeordnet sein, das mit einer OCCURS-Klausel beschrieben ist.

    5. Enthält die Sortierdatei (sortierdateiname) Sätze mit variabler Länge, müssen alle Sortierschlüssel in den ersten n Zeichenpositionen des Satzes enthalten sein, wobei n die minimale Satzlänge ist, die für die Sortierdatei angegeben wurde.

    6. Für eine Datei können maximal 64 Schlüssel angegeben werden.

    7. Jeder Sortierschlüssel muss innerhalb der ersten 4096 Bytes des Satzes beginnen.

    8. Sortierschlüssel werden in der Reihenfolge ihrer Wichtigkeit für die Sortierung von links nach rechts angegeben, unabhängig davon, ob sie auf- oder absteigend sind. Die erste Angabe von datenname-1 wäre somit der Hauptsortierbegriff, die zweite Angabe von datenname-1 der nachgeschaltete Sortierbegriff.

    9. Die maximale von SORT verarbeitbare Länge eines Sortierschlüssels hängt von dessen Format ab. Sie liegt für das Format PD (packed decimal) bei 16 Bytes, für Zeichenstring maximal bei Satzlänge, für alle übrigen Formate bei 256 Bytes.

    10. Die Sortierschlüssel, die der Angabe KEY-YY folgen, müssen entweder mit PIC 99 USAGE DISPLAY oder USAGE PACKED-DECIMAL definiert sein.

  5. dateiname-1..., dateiname-2... müssen in einer Dateierklärung (FD) der DATA DIVISION beschrieben sein.

  6. Für die Satzlängen der Datensätze aus den Eingabedateien, die an die SORT-Operation übergeben werden, gilt: Hat die Sortierdatei festes Satzformat, wird der Programmlauf beendet, falls der Satz zu lang ist. Ist er zu kurz, werden die fehlenden Stellen mit Blanks aufgefüllt. Hat die Sortierdatei variables Satzformat, werden die Eingabesätze in der eingegebenen Länge übernommen. Diese Länge muss in dem Bereich liegen, der in der RECORD-Klausel für die Sortierdatei festgelegt ist (siehe „RECORD-Klausel" ).

  7. Mindestens eine ASCENDING-/DESCENDING-Angabe muss in einer SORT-Anweisung angegeben sein.

  8. Die in der SORT-Anweisung genannten Sortier- und Eingabedateien dürfen nicht zusammen in derselben SAME SORT AREA oder SAME SORT-MERGE AREA angegeben sein.

  9. Falls dateiname-2 eine indizierte Datei beschreibt, muss die erste Angabe von datenname-1 mit der ASCENDING-Angabe erfolgen. Das durch datenname-1 referenzierte Datenfeld muss in seinem Datensatz dieselben Zeichenstellen belegen wie der Satzschlüssel innerhalb der durch dateiname-2 beschriebenen Datei.

Allgemeine Regeln

  1. Die Sortierreihenfolge wird durch die ASCENDING-/DESCENDING-Angabe festgelegt:

    1. Bei Angabe von ASCENDING wird vom niedrigsten zum höchsten Wert des Sortierschlüssels sortiert (aufsteigende Sortierreihenfolge).

    2. Bei Angabe von DESCENDING wird vom höchsten zum niedrigsten Wert des Sortierschlüssels sortiert (absteigende Sortierreihenfolge).

    Für die Sortierreihenfolge gelten die Regeln für den Vergleich von Operanden in „Vergleichsbedingungen“.

  2. Ist DUPLICATES angegeben und haben mehrere Datensätze den gleichen Inhalt in allen Sortierfeldern, gilt für die Rückgabe aus der Sortierdatei nachstehende Reihenfolge:

    1. Ist keine Eingabeprozedur definiert, werden die Sätze in der Reihenfolge zurückgegeben, wie die zugehörigen Dateien in der SORT-Anweisung angegeben sind. Gibt es Datensätze mit gleichem Sortierfeldinhalt in ein und derselben Datei, werden die Sätze in der Reihenfolge, in der sie eingelesen wurden, zurückgegeben.

    2. Ist eine Eingabeprozedur definiert, werden die Sätze in der Reihenfolge, in der sie die Eingabeprozedur verlassen haben, zurückgegeben.

  3. Ist DUPLICATES nicht angegeben und haben mehrere Datensätze den gleichen Inhalt in allen Sortierfeldern, ist die Reihenfolge der Rückgabe dieser Sätze undefiniert.

  4. Beim Programmablauf ist die Sortierfolge für die Vergleiche von alphanumerischen Sortierfeldern wie folgt festgelegt:

    1. Wenn COLLATING SEQUENCE in der SORT-Anweisung angegeben ist, dann ist diese Angabe Kriterium für die Sortierfolge,

    2. Wenn COLLATING SEQUENCE in der SORT-Anweisung nicht angegeben ist, wird die programmspezifische Sortierfolge verwendet (siehe "OBJECT-COMPUTER-Paragraf" ).

    Für Vergleiche von nationalen Sortierfeldern wird die nationale (maschineneigene) Sortierfolge verwendet.

  5. INPUT PROCEDURE bedeutet, dass der Prozedurteil eine Eingabeprozedur enthält, in der Datensätze vor dem Sortieren bearbeitet werden. Ist INPUT PROCEDURE angegeben, wird die Steuerung dann an die Eingabeprozedur übergeben, wenn der Eingabeteil des Programms SORT bereit ist, den ersten Datensatz zu übernehmen. Beim Durchlaufen einer RELEASE-Anweisung übergibt die Eingabeprozedur die Datensätze an die Sortierdatei (siehe „RELEASE-Anweisung"). Der Compiler fügt einen Rückkehrmechanismus am Ende des letzten Kapitels der Eingabeprozedur ein, d.h., ist die letzte Anweisung in der Eingabeprozedur durchlaufen, wird die Eingabeprozedur abgeschlossen und die übergebenen Datensätze werden in der Sortierdatei sortiert. Für die Eingabeprozedur, die ein abgeschlossener Teil innerhalb der PROCEDURE DIVISION ist, gelten folgende Regeln:

    1. Sie muss aus einem oder mehreren zusammenhängenden Kapiteln bestehen.

    2. Sie muss mindestens eine RELEASE-Anweisung enthalten, damit Datensätze an die Sortierdatei übergeben werden können (siehe „RELEASE-Anweisung").

    3. Sie darf nicht zur Ausführung einer MERGE-, RETURN- oder SORT-Anweisung führen.

    4. Sie kann jede Prozedur enthalten, die erforderlich ist, um Datensätze auszuwählen, zu erzeugen oder zu verändern.

    5. Die Eingabeprozedur darf verlassen werden, falls der Benutzer dafür sorgt, dass einem Sprung aus der Eingabeprozedur ein Rücksprung folgt, um ein ordnungsgemäßes Verlassen dieser Prozedur zu gewährleisten (Durchlaufen der letzten
      Anweisung der Eingabeprozedur).

    6. Von außerhalb darf auf Prozedurnamen in der Eingabeprozedur gesprungen werden, falls dabei keine RELEASE-Anweisung oder das Ende der Eingabeprozedur durchlaufen wird.

  6. Ist eine Eingabeprozedur angegeben, wird sie durchlaufen, bevor die Datensätze in der Sortierdatei sortiert werden.

  7. Ist USING angegeben, werden alle Datensätze der Eingabedateien (dateiname-1...) in die mit sortierdateiname bezeichnete Sortierdatei übertragen. Bei Beginn der Ausfüh-rung der SORT-Anweisung dürfen die Eingabedateien nicht geöffnet sein. Die SORT-Anweisung wird für jede genannte Datei in folgenden Schritten ausgeführt:

    1. Die Verarbeitung der Datei wird eingeleitet. Dies geschieht so, als ob eine OPEN INPUT-Anweisung ausgeführt würde.

    2. Jeder logische Datensatz wird für den Sortiervorgang zur Verfügung gestellt und anschließend freigegeben, als ob eine READ-Anweisung mit NEXT RECORD- und AT END-Angabe ausgeführt würde. Der Inhalt der Satzschlüsselfelder einer relativen Datei ist nach der Ausführung der SORT-Anweisung unbestimmt, falls dateiname-1 nicht auch in der GIVING-Angabe angegeben ist.
      Eine relative Datei muss im FILE-CONTROL-Paragrafen mit ACCESS MODE IS SEQUENTIAL beschrieben sein.

    3. Die Verarbeitung der Datei wird beendet. Dies geschieht so, als ob eine CLOSE-Anweisung ohne Wahlangaben ausgeführt würde. Diese Beendigung ist vollzogen, bevor der Sortiervorgang beginnt.

    Diese impliziten Funktionen werden so durchgeführt, dass alle vereinbarten USE AFTER EXCEPTION/ERROR-Prozeduren vollzogen sind. Gleichwohl darf die Ausführung einer solchen USE-Prozedur nicht die Ausführung irgendeiner Anweisung bewirken, die die Eingabedateien oder deren Satzbereichsvereinbarungen verändert.

  8. OUTPUT PROCEDURE bedeutet, dass die PROCEDURE DIVISION eine Ausgabeprozedur enthält, in der Datensätze nach dem Sortieren bearbeitet werden. Ist OUTPUT PROCEDURE angegeben, wird die Steuerung dann an die Ausgabeprozedur übergeben, nachdem die Sortierdatei durch die SORT-Anweisung bearbeitet worden ist. Beim Durchlaufen einer RETURN-Anweisung übernimmt die Ausgabeprozedur die Datensätze aus der Sortierdatei. Der Compiler fügt einen Rückkehrmechanismus am Ende des letzten Kapitels der Ausgabeprozedur ein, d.h. ist die letzte Anweisung der Ausgabeprozedur durchlaufen, wird die Ausgabeprozedur abgeschlossen und die Steuerung geht an die der SORT-Anweisung folgende Anweisung über.

    Für die Ausgabeprozedur, die ein abgeschlossener Teil innerhalb der PROCEDURE DIVISION ist, gelten folgende Regeln:

    1. Sie muss aus einem oder mehreren zusammenhängenden Kapiteln bestehen, die nicht Teil einer Eingabeprozedur sind.

    2. Sie muss mindestens eine RETURN-Anweisung enthalten, damit die sortierten Datensätze für die Verarbeitung verfügbar sind (siehe „RETURN-Anweisung").

    3. Sie darf nicht zur Ausführung einer MERGE-, RELEASE- oder SORT-Anweisung führen.

    4. Sie kann jede Prozedur enthalten, die erforderlich ist, um Datensätze auszuwählen, zu erzeugen oder zu verändern, bevor sie weitergegeben werden.

    5. Die Ausgabeprozedur darf verlassen werden, falls der Benutzer dafür sorgt, dass einem Sprung aus der Ausgabeprozedur ein Rücksprung folgt, um ein ordnungsgemäßes Verlassen dieser Prozedur zu gewährleisten (Durchlaufen der letzten Anweisung der Ausgabeprozedur).

    6. Von außerhalb darf auf Prozedurnamen in der Ausgabeprozedur gesprungen werden, falls dabei keine RETURN-Anweisung oder das Ende der Ausgabeprozedur durchlaufen wird.

  9. Wird die Angabe INPUT PROCEDURE oder OUTPUT PROCEDURE verwendet, wird eine Programmverzweigung entsprechend einer PERFORM-Anweisung im Format 1 ausgeführt. Das bedeutet, dass alle Kapitel, die die Prozedur bilden, einmal durchlaufen werden und die Ausführung der Prozedur nach Verarbeitung der letzten Anweisung beendet wird. Deshalb darf jede Prozedur (oder beide Prozeduren) durch eine EXIT-Anweisung abgeschlossen werden.

  10. Ist GIVING dateiname-2... angegeben, werden alle sortierten Sätze in die Ausgabedatei (dateiname-2...) geschrieben.
    Bei Beginn der Ausführung der SORT-Anweisung darf die Ausgabedatei nicht geöffnet sein. Die SORT-Anweisung wird für jede genannte Datei in folgenden Schritten ausgeführt:

    1. Die Verarbeitung der Datei wird eingeleitet. Dies geschieht so, als ob eine OPEN OUTPUT-Anweisung ausgeführt würde. Der Startschritt ist nach der Ausführung einer Eingabeprozedur vollzogen.

    2. Die sortierten logischen Datensätze sind verarbeitet und werden in die Ausgabedatei geschrieben, als ob eine WRITE-Anweisung ohne jede Wahlangabe ausgeführt würde. Die Länge dieser Datensätze muss innerhalb der Grenzen liegen, die für die Ausgabedatei festgelegt sind (siehe „RECORD-Klausel").
      Bei einer relativen Datei enthält das Satzschlüsselfeld des ersten verarbeiteten Satzes den Wert „1“, das des zweiten verarbeiteten Satzes den Wert „2“ usw. Nach der Ausführung der SORT-Anweisung zeigt der Inhalt des Satzschlüsselfeldes auf den letzten verarbeiteten Satz der Datei. Die Datei muss im FILE-CONTROL-Paragrafen mit ACCESS MODE IS SEQUENTIAL beschrieben sein.

    3. Die Verarbeitung der Datei wird beendet. Dies geschieht so, als ob eine CLOSE-Anweisung ohne Wahlangaben ausgeführt würde.

    Diese impliziten Funktionen werden so durchgeführt, dass alle vereinbarten USE AFTER EXCEPTION/ERROR-Prozeduren vollzogen sind. Gleichwohl darf die Ausführung einer solchen USE-Prozedur nicht die Ausführung irgendeiner Anweisung bewirken, die die Eingabedateien oder deren Satzbereichsvereinbarungen verändert. Beim ersten Versuch, einen Satz über die für die Datei extern vereinbarten Grenzen hinaus zu schreiben, wird jede für die Datei vereinbarte USE AFTER STANDARD EXCEPTION/ERROR-Prozedur ausgeführt; wenn die Steuerung von dieser USE-Prozedur zurückgekehrt ist oder wenn keine derartige Prozedur vereinbart wurde, wird die Verarbeitung der Datei beendet, wie unter c) beschrieben.

  11. Da die SORT-Anweisung nicht satzorientiert arbeitet, entspricht sie nicht den normalen Ein-/Ausgabe-Anweisungen (READ, WRITE usw.). Die READ-Anweisung liest bei ihrer Ausführung nur einen einzigen Datensatz, die WRITE-Anweisung schreibt einen einzelnen Datensatz. Die SORT-Anweisung dagegen behandelt nicht einen einzelnen Datensatz, sondern eine ganze Datei. Daher muss diese ganze Datei SORT zur Verfügung gestellt werden (entweder durch die USING-Angabe oder durch wiederholte Verwendung einer RELEASE-Anweisung in einer Eingabeprozedur), ehe SORT arbeiten kann. Das Programm SORT verändert die Reihenfolge der Datensätze innerhalb der Datei und daher ist in der Regel der erste Datensatz, der vom Sortierprogramm zurückgegeben wird, nicht der erste Datensatz, der an das Sortierprogramm übergeben wurde. SORT kann keinerlei Ausgabe liefern, ehe es nicht die gesamte Eingabe erhalten hat.

Beispiele für Dateien-SORT

Beispiel 8-74

Sortieren mit einer Ausgabedatei

IDENTIFICATION DIVISION.
PROGRAM-ID. SORTIER1.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT EINGABE ASSIGN TO "EINGABE".
    SELECT AUSGABE ASSIGN TO "AUSGABE".
    SELECT SORTIER ASSIGN TO "SORTWK".
DATA DIVISION.
FILE SECTION.
FD  EINGABE LABEL RECORD STANDARD.
01  ESATZ.
    02  E0            PIC X.
    02  E1            PIC 9(4). 
    02  E2            PIC 9(4).
    02  E3            PIC 9(4).
FD  AUSGABE LABEL RECORD STANDARD.
01  ASATZ 
    02  A0            PIC X. 
    02  A1            PIC 9(4).
    02  A2            PIC 9(4).
    02  A3            PIC 9(4).
SD  SORTIER LABEL RECORD STANDARD.
01  SSATZ.
    02  S0            PIC X.
    02  S1            PIC 9(4).
    02  S2            PIC 9(4).
    02  S3            PIC 9(4). 
PROCEDURE DIVISION.
P1 SECTION. 
SORTIEREN.
    SORT SORTIER ASCENDING S1 S2 S3           (1)
                                               |
         USING EINGABE GIVING AUSGABE.        (1) 
    STOP RUN.

(1)

Das Sortieren läuft in folgenden Schritten ab:
  1. Übergabe der Sätze aus der Eingabedatei EINGABE an die Sortierdatei SORTIER.

  2. Sortieren der Sätze in der Sortierdatei nach aufsteigendem S1. Bei Gleichheit von S1 in mehreren Sätzen entsprechend nach aufsteigendem S2 und bei Gleichheit von S1 und S2 nach aufsteigendem S3.

  3. Übergabe der Sätze aus der Sortierdatei an die Ausgabedatei AUSGABE.


Beispiel 8-75

Sortieren mit zwei Ausgabedateien


IDENTIFICATION DIVISION.
PROGRAM-ID. SORTIER2.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT EINGABE ASSIGN TO "EINGABE".
    SELECT AUSGABE1 ASSIGN TO "AUSGABE1".
    SELECT AUSGABE2 ASSIGN TO "AUSGABE2".
    SELECT SORTIER ASSIGN TO "SORTWK".
DATA DIVISION.
FILE SECTION.
FD  EINGABE LABEL RECORD STANDARD.
01  ESATZ.
    02  E0           PIC X.
    02  E1           PIC 9(4).
    02  E2           PIC 9(4).
    02  E3           PIC 9(4).
FD  AUSGABE1 LABEL RECORD STANDARD.
01  A1SATZ PIC X(13).
FD  AUSGABE2 LABEL RECORD STANDARD.
01  A2SATZ PIC X(13).
SD  SORTIER LABEL RECORD STANDARD.
01  SSATZ.
    02  S0           PIC X.
    02  S1           PIC 9(4).
    02  S2           PIC 9(4).
    02  S3           PIC 9(4).
WORKING-STORAGE SECTION.
01  EINGABE-STATUS PIC X VALUE LOW-VALUE.
    88  EINGABE-END VALUE HIGH-VALUE.
01  SORTIER-STATUS PIC X VALUE LOW-VALUE.
    88  SORTIER-ENDE VALUE HIGH-VALUE.
PROCEDURE DIVISION.
HAUPT SECTION.
H1.
    OPEN INPUT EINGABE OUTPUT AUSGABE1 AUSGABE2.
    SORT SORTIER ASCENDING S1 S2 S3                         (1)
                                                             |
         INPUT PROCEDURE EINGANG OUTPUT PROCEDURE AUSGANG.  (1)
    CLOSE EINGABE AUSGABE1 AUSGABE2.
HE.
    STOP RUN.
EINGANG SECTION.
E0.
    PERFORM UNTIL EINGABE-ENDE                              (2)
      READ EINGABE                                           |
      AT END                                                 |
        SET EINGABE-ENDE TO TRUE                             |
      NOT AT END                                             |
        IF E0 NOT = "C"                                      |
          THEN                                               |
          RELEASE SSATZ FROM ESATZ                           |
        END-IF                                               |
      END-READ                                               |
    END-PERFORM.                                            (2)
AUSGANG SECTION.
A0.
    PERFORM UNTIL SORTIER-ENDE                              (3)
      RETURN SORTIER                                         |
      AT END                                                 |
        SET SORTIER-ENDE TO TRUE                             |
      NOT AT END                                             |
        IF S0 = "A"                                          |
        THEN                                                 |
          WRITE AUSGABE1 FROM SSATZ                          |
        ELSE                                                 |
          WRITE AUSGABE2 FROM SSATZ                          |
        END-IF                                               |
      END-RETURN                                             |
    END-PERFORM.                                            (3)

(1)

  1. Die Steuerung wird an die Eingabeprozedur abgegeben (EINGANG SECTION).
  2. Die Sätze in der Sortierdatei werden aufsteigend nach S1 S2 S3 sortiert.

  3. Die Steuerung geht an die Ausgabeprozedur über (AUSGANG SECTION).

(2)

Ein SATZ der Eingabedatei wird eingelesen. Nur solche Sätze, die an der ersten Stelle kein „C“ enthalten, sollen verarbeitet werden. Ist der Satz ESATZ gültig, wird er an die Sortierdatei (als SSATZ) übergeben. Dies wird so lange durchgeführt, bis das Ende der Eingabedatei erkannt wird. Dann geht die Steuerung wieder zur SORT-Anweisung.

(3)

Ein Satz wird aus der Sortierdatei übernommen. Enthält er als erstes Zeichen ein „A“, wird er in die 1. Ausgabedatei (AUSGABE1) geschrieben. Andere Sätze werden in die 2. Ausgabedatei (AUSGABE2) geschrieben. Wenn alle Sätze der Sortierdatei verarbeitet sind, wird die der SORT-Anweisung folgende Anweisung ausgeführt.


Format 2 Sortieren von Tabellen


SORT datenname-2 {ON {ASCENDING | DESCENDING} {KEY | KEY-YY} {datenname-1}... }...

[WITH DUPLICATES IN ORDER]

[COLLATING SEQUENCE IS alphabetname]

[USING datenname-3]


Syntaxregeln

  1. Die SORT-Anweisung darf überall in der PROCEDURE DIVISION angegeben werden, außer in DECLARATIVES und in Ein- und Ausgabeprozeduren, die zu einer SORT-Anweisung gehören.

  2. datenname-2 bzw. datenname-3, falls USING angegeben ist, bezeichnen die zu sortierende Tabelle.
    datenname-1... bezeichnet ein oder mehrere Datenfelder, die als Sortierbegriffe verwendet werden sollen (Schlüsselfelder),

  3. Der mit datenname-2 bezeichnete Datensatz muss in einer Datenerklärung definiert sein und unterliegt dabei folgenden Regeln:

    1. datenname-2 darf gekennzeichnet sein.

    2. Die Datenerklärung von datenname-2 muss eine OCCURS-Klausel enthalten, d.h. als Tabellenelement definiert sein.

    3. Wenn die mit datenname-2 bezeichnete Tabelle einer Tabelle untergeordnet ist (mehrdimensionale Tabelle), dann muss datenname-2 als indizierbare Tabelle definiert sein, d.h. in der Datenerklärung der übergeordneten Tabelle mit der INDEXED-BY-Angabe ein Indexname vereinbart sein. Der Indexname muss vor der Ausführung der SORT-Anweisung mit der gewünschten Elementnummer versorgt werden (siehe „Indizierung").

  4. Die mit datenname-1 bezeichneten Schlüsselfelder müssen in der Datenerklärung von datenname-2 definiert sein. Dabei gelten folgenden Regeln:

    1. datenname-1 ist entweder namensgleich mit datenname-2 oder namensgleich mit einem datenname-2 untergeordneten Datenfeld.

    2. datenname-1 darf gekennzeichnet sein.

    3. Bezieht sich datenname-1 auf ein datenname-2 untergeordnetes Datenfeld, so darf die Beschreibung dieses Datenfeldes weder selbst eine OCCURS-Klausel enthalten, noch einem Datenfeld untergeordnet sein, dessen Beschreibung eine

    4. datenname-1 darf sich nicht auf ein Datenfeld beziehen, dessen Beschreibung eine SIGN-Klausel enthält.

    5. Ist das durch datenname-1 bezeichnete Datenfeld als numerisch mit Vorzeichen definiert, darf es nicht länger als 16 Zeichen sein.

    6. Die Sortierschlüssel, die der Angabe KEY-YY folgen, müssen entweder mit PIC 99 USAGE DISPLAY oder USAGE PACKED-DECIMAL definiert sein.

  5. Für datenname-3 gelten dieselben Regeln wie für datenname-2.

  6. Wird die USING-Angabe verwendet, müssen datenname-2 und datenname-3 entweder beide als nationale oder beide als alphanumerische bzw. alphabetische Datenfelder beschrieben sein.

Allgemeine Regeln

  1. Die Schlüsselwörter ASCENDING und DESCENDING wirken über alle nachfolgenden datenname-1-Angaben hinweg bis zum nächsten Schlüsselwort ASCENDING oder DESCENDING.

  2. Die mit datenname-1 benannten Datenfelder sind die Sortierschlüssel. Die Sortierschlüssel werden von links nach rechts hierarchisch für den Sortiervorgang herangezogen, unabhängig davon, ob ASCENDING oder DESCENDING angegeben ist. Die erste Angabe von datenname-1 ist somit der Hauptsortierbegriff, die zweite Angabe von datenname-1 der nachrangige Sortierbegriff usf.

  3. Ist DUPLICATES angegeben, und zwei oder mehr Tabellenelemente stimmen bezüglich aller Schlüsselfelder überein, dann wird die relative Reihenfolge dieser Tabellenelemente durch das Sortieren nicht verändert.

  4. Ist DUPLICATES nicht angegeben, und zwei oder mehr Tabellenelemente stimmen bezüglich aller Schlüsselfelder überein, dann ist die relative Reihenfolge dieser Tabellenelemente nach dem Sortieren unbestimmt.

  5. Die Vergleichsfolge (collating sequence), die zum Vergleich der alphanumerischen Schlüsselfelder verwendet wird, ist bei Ausführungsbeginn der SORT-Anweisung wie folgt festgelegt:

    1. Ist COLLATING SEQUENCE in der SORT-Anweisung angegeben, so ist diese Angabe Kriterium für die Sortierfolge.

    2. Ist COLLATING SEQUENCE in der SORT-Anweisung nicht angegeben, wird die programmspezifische Sortierfolge verwendet (siehe "OBJECT-COMPUTER-Paragraf").

    Für Vergleiche von nationalen Sortierfeldern wird die nationale (maschineneigene) Sortierfolge verwendet.

  6. Die gemäß den ASCENDING- bzw. DESCENDING KEY-Angaben sortierten Tabellenelemente werden in der mit datenname-2 bezeichneten Tabelle abgelegt.

  7. Die Elemente der Tabelle werden sortiert, indem die Inhalte der Datenfelder, die als Sortierschlüssel definiert sind, nach den Regeln für Vergleichsbedingungen verglichen werden:

    1. Wenn die Inhalte der verglichenen Schlüsselfelder nicht gleich sind und die ASCENDING-Angabe wirksam ist, dann hat das Tabellenelement, dessen Schlüsselfeld den niedrigeren Wert enthält, die niedrigere Elementnummer.

    2. Wenn die Inhalte der verglichenen Schlüsselfelder nicht gleich sind und die DESCENDING-Angabe wirksam ist, dann hat das Tabellenelement, dessen Schlüsselfeld den höheren Wert enthält, die niedrigere Elementnummer.

    3. Wenn die Inhalte der verglichenen Schlüsselfelder gleich sind, wird der nächste angegebene Sortierschlüssel zum Vergleich herangezogen.

  8. Die in der SORT-Anweisung angegebenen Sortierschlüssel haben Vorrang gegenüber den ggf. in der Datenerklärung von datenname-2 angegebenen Sortierschlüsseln.

  9. Mit der Angabe USING datenname-3 kann eine zweite Tabelle für den Sortiervorgang herangezogen werden.
    In diesem Fall werden die Elemente der mit datenname-3 bezeichneten Tabelle wie oben beschrieben sortiert und anschließend in die mit datenname-2 bezeichnete Tabelle gemäß den Regeln für die MOVE-Anweisung übertragen. Hinsichtlich der Übertragung der einzelnen Tabellenelemente ist Folgendes zu beachten:
    Ist das Sende-Element kürzer als das Empfangselement, wird es mit Leerzeichen aufgefüllt; ist es länger, wird es abgeschnitten.

  10. Die Übertragung der sortierten Tabellenelemente von datenname-3 in die Tabelle datenname-2 endet mit dem letzten sortierten Tabellenelement (datenname-3) oder mit Erreichen der Anzahl der Tabellenelemente von datenname-2. Das bedeutet: Enthält die Tabelle datenname-3 mehr Elemente als die Tabelle datenname-2, werden die überzähligen Elemente nicht übertragen. Enthält sie weniger, bleiben die überzähligen Elemente der Tabelle datenname-2 unverändert erhalten.

  11. Der Sortiervorgang verändert nicht den Inhalt der Tabelle datenname-3.

Beispiel 8-76

Sortieren einer Tabelle

IDENTIFICATION DIVISION.
PROGRAM-ID. TABSORT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
    TERMINAL IS T.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TABELLE.
   02 TAB-ELEM OCCURS 10 TIMES.
      03 VORNAME     PIC X(8).
      03 FILLER      PIC X(3) VALUE SPACES.
      03 NAME        PIC X(10).
PROCEDURE DIVISION.
EINZIGE SECTION.
INITIALISIEREN.
    MOVE "PETER" TO VORNAME (1) MOVE "KRAUS" TO NAME (1).
    MOVE "JANE" TO VORNAME (2) MOVE "FONDA" TO NAME (2).
    MOVE "PETER" TO VORNAME (3) MOVE "FONDA" TO NAME (3).
    MOVE "KARL" TO VORNAME (4) MOVE "KRAUS" TO NAME (4).
    MOVE "UWE" TO VORNAME (5) MOVE "SEELER" TO NAME (5).
    MOVE "WALT" TO VORNAME (6) MOVE "DISNEY" TO NAME (6).
    MOVE "CLARA" TO VORNAME (7) MOVE "WIECK" TO NAME (7).
    MOVE "LEONID" TO VORNAME (8) MOVE "KOGAN" TO NAME (8).
    MOVE "ERICH" TO VORNAME (9) MOVE "FROMM" TO NAME (9).
    MOVE "ELVIS" TO VORNAME (10) MOVE "PRESLEY" TO NAME (10).
SORTIEREN.
    SORT TAB-ELEM ON ASCENDING KEY NAME VORNAME.
ENDE.
    STOP RUN.

Die folgende Tabelle wird ausgegeben mit AID %DISPLAY TABELLE

Sortierte Tabelle:

Elementnummer
(1)            |WALT    |   |DISNEY
(2)            |JANE    |   |FONDA
(3)            |PETER   |   |FONDA
(4)            |ERICH   |   |FROMM
(5)            |LEONID  |   |KOGAN
(6)            |KARL    |   |KRAUS
(7)            |PETER   |   |KRAUS
(8)            |ELVIS   |   |PRESLEY
(9)            |UWE     |   |SEELER
(10)           |CLARA   |   |WIECK