Anfang des Inhaltsbereichs

Interne Tabellen sortieren Dokument im Navigationsbaum lokalisieren

Standard- und Hash-Tabellen können im Programm sortiert werden. Zum Sortieren solcher Tabellen nach ihrem Schlüssel verwendet man die Anweisung:

SORT <itab> [ASCENDING|DESCENDING] [AS TEXT] [STABLE].

Die interne Tabelle <itab> wird aufsteigend nach ihrem Schlüssel sortiert. Diese Anweisung greift immer auf die Tabelle selbst zu und nicht auf eine eventuell vorhandene Kopfzeile. Die Priorität der Sortierung richtet sich dabei nach der Reihenfolge in der die Schlüsselfelder bei der Tabellendefinition angegeben sind. Beim Standardschlüssel ist die Reihenfolge der nichtnumerischen Felder in den Zeilen der Tabelle ausschlaggebend.

Die Sortierreihenfolge kann mit den Zusätzen ASCENDING oder DESCENDING als aufsteigend bzw. als absteigend angegeben werden. Standardmäßig wird aufsteigend sortiert.

Je größer der Sortierschlüssel ist, desto größer ist der Laufzeitverbrauch beim Sortieren. Enthält der Sortierschlüssel sogar eine geschachtelte interne Tabelle, kann der Sortiervorgang sehr langsam werden.

Tabellen der Tabellenart sortierte Tabelle können durch die Anweisung SORT nicht umsortiert werden, da solche Tabellen vom System immer nach ihrem Schlüssel sortiert gehalten werden. Falls statisch erkennbar führt die Anweisung SORT für eine sortierte Tabelle zu einem Syntaxfehler. Bei generischen sortierten Tabellen führt die Anweisung SORT zu Laufzeitfehlern, falls der Sortierschlüssel nicht mit einem Anfangsstück des Tabellenschlüssels übereinstimmt, eine absteigende Sortierreihenfolge oder der Zusatz AS TEXT angegeben ist. Mit anderen Worten ist die Anweisung SORT bei generischen internen Tabellen genau dann erlaubt, wenn sich die interne Sortierung nicht ändert.

Sortieren nach anderem Sortierschlüssel

Falls eine interne Tabelle mit strukturiertem Zeilentyp nach einem anderen Schlüssel sortiert werden soll, kann man diesen in der SORT-Anweisung angeben:

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

Die Tabelle wird statt nach dem Tabellenschlüssel nach den angegebenen Komponenten <f 1 >... <f n > sortiert. Die Zahl der Sortierfelder ist auf 250 begrenzt. Die Priorität der Sortierung richtet sich nach der Reihenfolge, in der die Felder <f i > angegeben sind. Die vor BY angegebene Sortierreihenfolge gilt für alle Felder. Die Sortierreihenfolge hinter einem Feld wirkt nur für die entsprechende Spalte der Tabelle.

Ein Sortierfeld kann dynamisch gesetzt werden, indem man (<f>) anstatt <f i > schreibt. Der Inhalt des Feldes <f> bestimmt den Namen des Sortierfelds. Ist <f> bei Ausführung der Anweisung leer, wird das Feld beim Sortieren ignoriert. Enthält es einen ungültigen Komponentennamen, tritt ein Laufzeitfehler ein.

Falls der Zeilentyp der internen Tabelle Objektreferenzvariablen als Komponenten <comp> enthält oder der gesamte Zeilentyp eine Referenzvariable ist, können die Attribute <attr> des Objekts, auf welches die jeweilige Referenz einer Zeile zeigt, über <comp->attr> bzw. <table_line->attr> als Sortierkriterium angegeben werden.

Alphabetisches Sortieren

Zusätzlich zu den Zusätzen ASCENDING oder DESCENDING kann für die gesamte Sortierung oder für jedes Sortierfeld eine alphabetische Sortierung definiert werden:

SORT <itab>... AS TEXT....

Dieser Zusatz beeinflußt die Sortiermethode für Zeichenketten. Ohne den Zusatz werden Zeichenketten binär nach der plattformabhängigen Darstellung der einzelnen Zeichen sortiert. Mit dem Zusatz AS TEXT werden Zeichenketten alphabetisch nach der eingestellten Textumgebung sortiert. Die Textumgebung wird standardmäßig nach dem Stammsatz des Benutzers eingestellt. Sie kann aber ausnahmsweise auch über die Anweisung

SET LOCALE LANGUAGE

gesetzt werden. Der Zusatz AS TEXT erspart die Konvertierung in ein sortierbares Format von Zeichenketten. Solch eine Konversion ist nur notwendig, wenn

Wenn der Zusatz AS TEXT für die gesamte Sortierung gilt, wirkt er nur auf Sortierfelder vom Typs C im Sortierschlüssel. Wenn AS TEXT speziell für ein Sortierfeld angegeben wird, muß dieses vom Typ C sein.

Stabile Sortierung

Mit dem Zusatz

SORT <itab>... STABLE.

kann eine stabile Sortierung erreicht werden. D.h. die relative Reihenfolge von Zeilen, die sich im Sortierschlüssel nicht unterscheiden bleibt beim Sortieren unverändert. Ohne den Zusatz STABLE bleibt die Reihenfolge nicht erhalten und mehrmaliges Sortieren einer Tabelle nach dem gleichen Sortierschlüssel ändert bei jedem Sortieren erneut die Reihenfolge. Auf der anderen Seite ist der Laufzeitverbrauch beim stabilen Sortieren größer als beim instabilen Sortieren.

Beispiel

REPORT demo_int_tables_sort_stable.

DATA: BEGIN OF line,
        land(3)  TYPE c,
        name(10) TYPE c,
        age      TYPE i,
        weight   TYPE p DECIMALS 2,
      END OF line.

DATA itab LIKE STANDARD TABLE OF line WITH NON-UNIQUE KEY land.

line-land = 'G'.   line-name   = 'Hans'.
line-age  = 20.    line-weight = '80.00'.
APPEND line TO itab.

line-land = 'USA'. line-name   = 'Nancy'.
line-age  = 35.    line-weight = '45.00'.
APPEND line TO itab.

line-land = 'USA'. line-name   = 'Howard'.
line-age  = 40.    line-weight = '95.00'.
APPEND line TO itab.

line-land = 'GB'.  line-name   = 'Jenny'.
line-age  = 18.    line-weight = '50.00'.
APPEND line TO itab.

line-land = 'F'.   line-name   = 'Michele'.
line-age  = 30.    line-weight = '60.00'.
APPEND line TO itab.

line-land = 'G'.   line-name   = 'Karl'.
line-age  = 60.    line-weight = '75.00'.
APPEND line TO itab.

PERFORM loop_at_itab.

SORT itab.
PERFORM loop_at_itab.

SORT itab.
PERFORM loop_at_itab.

SORT itab STABLE.
PERFORM loop_at_itab.

SORT itab DESCENDING BY land weight ASCENDING.
PERFORM loop_at_itab.

FORM loop_at_itab.
  LOOP AT itab INTO line.
    WRITE: / line-land, line-name, line-age, line-weight.
  ENDLOOP.
  SKIP.
ENDFORM.

Die Listenausgabe ist:

G   Hans               20         80.00
USA Nancy              35         45.00
USA Howard             40         95.00
GB  Jenny              18         50.00
F   Michele            30         60.00
G   Karl               60         75.00

F   Michele            30         60.00
G   Hans               20         80.00
G   Karl               60         75.00
GB  Jenny              18         50.00
USA Howard             40         95.00
USA Nancy              35         45.00

F   Michele            30         60.00
G   Karl               60         75.00
G   Hans               20         80.00
GB  Jenny              18         50.00
USA Howard             40         95.00
USA Nancy              35         45.00

F   Michele            30         60.00
G   Karl               60         75.00
G   Hans               20         80.00
GB  Jenny              18         50.00
USA Howard             40         95.00
USA Nancy              35         45.00

USA Nancy              35         45.00
USA Howard             40         95.00
GB  Jenny              18         50.00
G   Karl               60         75.00
G   Hans               20         80.00
F   Michele            30         60.00

Es werden vier Sortiervorgänge auf einer Standard-Tabelle mit einem Schlüsselfeld durchgeführt. Zuerst wird zweimal hintereinander ohne den Zusatz STABLE nach dem Schlüssel der Tabelle (LAND) sortiert. Die Sortierung ist instabil. Die Reihenfolge der zweiten und dritten Zeile ändert sich. Dann wird die gleiche Sortierung mit dem Zusatz STABLE durchgeführt. Die Sortierung ist stabil. Die Reihenfolge der Zeilen bleibt bestehen. Schließlich wird nach einem neuen durch LAND und WEIGHT definierten Sortierschlüssel sortiert. Die allgemeine Sortierreihenfolge ist absteigend, aber für WEIGHT wird aufsteigend definiert.

Beispiel

REPORT demo_int_tables_sort_text.
DATA: BEGIN OF line,
        text(6) TYPE c,
        xtext(160) TYPE x,
      END OF line.

DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY text.

line-text = 'Muller'.
CONVERT TEXT line-text INTO SORTABLE CODE line-xtext.
INSERT line INTO TABLE itab.

line-text = 'Möller'.
CONVERT TEXT line-text INTO SORTABLE CODE line-xtext.
INSERT line INTO TABLE itab.

line-text = 'Moller'.
CONVERT TEXT line-text INTO SORTABLE CODE line-xtext.
INSERT line INTO TABLE itab.

line-text = 'Miller'.
CONVERT TEXT line-text INTO SORTABLE CODE line-xtext.
INSERT line INTO TABLE itab.

SORT itab.
PERFORM loop_at_itab.

SORT itab BY xtext.
PERFORM loop_at_itab.

SORT itab AS TEXT.
PERFORM loop_at_itab.

FORM loop_at_itab.
  LOOP AT itab INTO line.
    WRITE / line-text.
  ENDLOOP.
  SKIP.
ENDFORM.

Dss Beispiel demonstriert die alphabetische Sortierung von Zeichenketten. Die Tabelle ITAB enthält eine Spalte mit Textfeldern und eine Spalte mit zugehörigen länderspezifisch sortierbaren binären Zeichen, die durch Konvertierung in ein sortierbares Format erzeugt werden. Die Tabelle wird dreimal sortiert. Erst binär nach dem Schlüsselfeld TEXT, dann binär nach dem Feld XTEXT, schließlich alphabetisch nach dem Schlüsselfeld TEXT. Die Listenausgabe ist im Fall einer deutschen Textumgebung:

Miller
Moller
Muller
Möller

Miller
Moller
Möller
Muller

Miller
Moller
Möller
Muller

Bei der ersten Sortierung folgt 'Möller' hinter 'Muller', da die interne Darstellung des Zeichens 'ö' hinter der Darstellung für 'u' liegt. Die beiden anderen Sortierungen sind alphabetisch. Die binäre Sortierung nach XTEXT hat das gleiche Ergebnis, wie die alphabetische Sortierung nach dem Feld TEXT.

Ende des Inhaltsbereichs