Show TOC Anfang des Inhaltsbereichs

Extrakt sortieren  Dokument im Navigationsbaum lokalisieren

Ähnlich wie bei der Sortierung interner Tabellen können die Daten eines Extraktdatenbestands mit folgender Anweisung sortiert werden:

SORT [ASCENDING|DESCENDING] [AS TEXT] [STABLE]
      BY f1 [ASCENDING|DESCENDING] [AS TEXT]
       ...
         fn [ASCENDING|DESCENDING] [AS TEXT].

Die Anweisung SORT schließt die Erzeugung des Extraktdatenbestands eines Programms ab und sortiert gleichzeitig dessen Sätze. Ohne den Zusatz BY, wird der Datenbestand nach dem durch die Feldgruppe header festgelegten Schlüssel sortiert.

Ein Extraktdatenbestand kann beliebig oft in einem Programm mit verschiedenen Schlüsseln sortiert werden. Voraussetzung dafür ist lediglich, dass alle Felder, nach denen sortieren werden soll, bereits beim Extrahieren der Daten im header stehen. Die SORT-Anweisung darf nicht in einer LOOP- Schleife stehen. Sortieren und Lesen des Extraktdatenbestands können aber beliebig nacheinander ausgeführt werden. Nach Ausführung der SORT-Anweisung dürfen keine weiteren EXTRACT-Anweisungen mehr verwendet werden. Es kommt ansonsten zu einem Laufzeitfehler.

Mit dem Zusatz BY kann ein anderer Sortierschlüssel definiert werden. Dann wird der Datenbestand nach den angegebenen Komponenten f1 ... fn sortiert. Diese Komponenten müssen entweder Felder der Feldgruppe header sein, oder Feldgruppen, die nur Felder der Feldgruppe header enthalten. Die Zahl der Sortierschlüsselfelder ist auf 50 begrenzt. Die Reihenfolge der Komponenten f1 ... fnbestimmt die Priorität der Sortierung. Die Zusätze, die vor BY stehen, wirken standardmäßig für alle hinter BY angegebenen Felder. Die Zusätze, die hinter den einzelnen Felder stehen, überschreiben für diese Felder die vor BY angegebenen Zusätze.

Die Sortierreihenfolge kann über DESCENDING (absteigend) oder ASCENDING (aufsteigend) definiert werden. Standardmäßig wird aufsteigend sortiert. Für Zeichenketten kann die Sortiermethode über den Zusatz AS TEXT bestimmt werden. Der Zusatz bewirkt wie bei internen Tabellen eine alphabetische Sortierung. Falls ein Extraktdatenbestand mehrfach alphabetisch sortiert werden soll, empfiehlt es sich aus Performancegründen, statt des Textfeldes ein alphabetisch sortierbares Feld in den Sortierschlüssel aufzunehmen, welches mit der CONVERT-Anweisung gefüllt wird.

Wenn AS TEXT vor BY steht, wirkt der Zusatz nur auf Felder des Typs c im Sortierschlüssel. Wenn AS TEXT hinter einem Sortierschlüsselfeld steht, muss dieses vom Typ c sein. Wenn AS TEXT hinter einer Feldgruppe steht wirkt der Zusatz nur auf Felder des Typs c in dieser Gruppe.

Die Sortierung ist standardmäßig nicht stabil, d.h. die alte Reihenfolge von Sätzen mit dem gleichen Sortierschlüssel wird nicht unbedingt beibehalten. Mit dem Zusatz STABLE kann die stabile Sortierung erzwungen werden.

Falls nicht genügend Hauptspeicher zur Sortierung der Daten zur Verfügung steht, werden Daten beim Sortieren in eine externe Hilfsdatei geschrieben, die durch den SAP-Profile-Parameter DIR_SORTTMP bestimmt wird.

Die Anweisung SORT sortiert alle Felder des Sortierschlüssels, die den Inhalt HEX-Null haben immer vor alle andere Einträge. Dies ist wichtig bei der Verwendung logischer Datenbanken. Eine logische Datenbank füllt nach dem Lesen aller Daten einer Hierarchiestufe alle Felder dieser Stufe mit HEX-Null. Bei der Verwendung einer Feldliste in der GET-Anweisung (Zusatz FIELDS) füllt die logische Datenbank alle Felder, die nicht in der Feldliste aufgeführt sind ebenfalls mit HEX-Null.

Jede Sortierung des Extraktdatenbestands mit der SORT-Anweisung definiert Gruppenstufen und ist die Vorraussetzung für die Gruppenstufenverarbeitung.

Beispiel

Das folgende Programm sei mit der logischen Datenbank F1S verknüpft.

REPORT demo_extract_sort.

NODES: spfli, sflight.

FIELD-GROUPS: header, flight_info, flight_date.

INSERT: spfli-carrid spfli-connid sflight-fldate
        INTO header,
        spfli-cityfrom spfli-cityto
        INTO flight_info.

START-OF-SELECTION.

GET spfli.
  EXTRACT flight_info.

GET sflight.
  EXTRACT flight_date.

END-OF-SELECTION.

  SORT DESCENDING.

  LOOP.
    AT FIRST.
      WRITE / 'Start of
LOOP'.
      ULINE.
    ENDAT.
    AT flight_info WITH flight_date.
      WRITE: / 'Info:',
               spfli-carrid , spfli-connid, sflight-fldate,
               spfli-cityfrom, spfli-cityto.
    ENDAT.
    AT flight_date.
      WRITE: / 'Date:',
                spfli-carrid , spfli-connid, sflight-fldate.
    ENDAT.
    AT LAST.
      
ULINE.
      WRITE / 'End of LOOP'.
    ENDAT.
  ENDLOOP.

Dieses Beispiel ist bis auf die Anweisung SORT DESCENDING identisch zum Beispiel unter Extrakt auslesen. Durch die SORT-Anweisung wird der Extraktdatenbestand vor dem Lesen durch die Schleife LOOP - ENDLOOP absteigend nach den drei Feldern in der Feldgruppe header sortiert. Das Ende der Ausgabeliste sieht wie folgt aus:

Diese Grafik wird im zugehörigen Text erklärt

Beachtenswert ist, dass die Sätze mit dem Wert HEX-Null in dem Feld sflight-fldate (undefinierte Zeichen auf der Liste) vor die übrigen Sätze sortiert werden. Dadurch bleibt die Hierarchie der Daten aus der logischen Datenbank unabhängig von der übrigen Sortierreihenfolge erhalten.

 

 

Ende des Inhaltsbereichs