ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Interne Daten verarbeiten →  Interne Tabellen →  Verarbeitungsanweisungen für interne Tabellen → 

SORT itab

Kurzreferenz

Syntax

SORT itab [STABLE]
          { { [ASCENDING|DESCENDING]
              [AS TEXT]
              [BY { comp1 [ASCENDING|DESCENDING] [AS TEXT]}
                  { comp2 [ASCENDING|DESCENDING] [AS TEXT]}
                  ... ] }
          | { [BY (otab)] }
          | { [BY expr] } }.


Zusätze:

1. ... STABLE

2. ... ASCENDING|DESCENDING

3. ... AS TEXT

4. ... BY compi [ASCENDING|DESCENDING] [AS TEXT]

5. ... BY (otab)

6. ... BY expr

Wirkung

Diese Anweisung sortiert eine interne Tabelle itab nach dem Inhalt ihrer Komponenten, wobei die Größenvergleiche standardmäßig nach den allgemeinen Vergleichsregeln für einzelne Operanden durchgeführt werden, d.h.:

Falls kein expliziter Sortierschlüssel mit dem Zusatz BY angegeben ist, wird die interne Tabelle itab nach dem primären Tabellenschlüssel sortiert. Die Priorität der Sortierung richtet sich dabei nach der Reihenfolge, in der die Schlüsselfelder bei der Tabellendefinition angegeben sind. Beim Standardschlüssel richtet sich die Priorität der Sortierung nach der Reihenfolge der Schlüsselfelder im Zeilentyp der Tabelle. Wenn der primäre Tabellenschlüssel einer Standardtabelle leer ist, findet keine Sortierung statt. Falls dies statisch erkennbar ist, kommt es zu einer Warnung von der Syntaxprüfung.

Die Sortierung ist standardmäßig instabil, d.h. die relative Reihenfolge von Zeilen, die sich im Sortierschlüssel nicht unterscheiden, bleibt beim Sortieren nicht erhalten. Sie kann sowohl plattformabhängig als auch bei mehrmaligem Sortieren unterschiedlich sein. Eine stabile Sortierung wird mit dem Zusatz STABLE erreicht.

Für itab wird eine Standardtabelle oder Hash-Tabelle erwartet.

Bei beiden Tabellenarten bedingt die Sortierung mit SORT die Reihenfolge, in der eine nachfolgende LOOP-Schleife ohne den Zusatz USING KEY durchlaufen wird.

Sortierte Tabellen können nicht mit SORT sortiert werden und die Anwendung der Anweisung SORT auf sortierte Tabellen ist syntaktisch verboten. Wenn erst zur Laufzeit festgestellt wird, dass eine sortierte Tabelle sortiert werden soll, kommt es zu einer unbehandelbaren Ausnahme, falls sich dadurch die vorliegende Sortierung ändern kann. Letzteres geschieht in folgenden Fällen:

Andernfalls wird die Anweisung SORT für sortierte Tabellen ignoriert.

Hinweise

Zusatz 1

... STABLE

Wirkung

Mit STABLE wird eine stabile Sortierung erreicht, d.h., die relative Reihenfolge von Zeilen, die sich im Sortierschlüssel nicht unterscheiden, bleibt beim Sortieren unverändert. Ohne den Zusatz STABLE ist die Reihenfolge nicht stabil:

Zusatz 2

... ASCENDING|DESCENDING

Wirkung

Mit dem Zusatz ASCENDING bzw. DESCENDING kann die Sortierrichtung explizit als aufsteigend oder absteigend vorgegeben werden. Falls keiner der Zusätze angegeben ist, ist die aufsteigende Sortierung vorgegeben. Diese Sortierrichtung kann hinter dem Zusatz BY für dort einzeln aufgeführte Komponenten überschrieben werden.

Zusatz 3

... AS TEXT

Wirkung

Der Zusatz AS TEXT gibt vor, dass textartige Komponenten gemäß dem Locale der aktuellen Textumgebung sortiert werden. Falls AS TEXT nicht angegeben ist, werden textartige Komponenten nach der Codierung in der Codepage der aktuellen Textumgebung sortiert. Diese Vorgabe kann hinter dem Zusatz BY für dort einzeln aufgeführte Komponenten überschrieben werden. Die Textumgebung wird beim Öffnen einer internen Sitzung oder über die Anweisung SET LOCALE gesetzt.

Hinweise

Beispiel

Sortieren einer Hash-Tabelle text_tab nach Anordnung in der Codepage und gemäß dem Locale der aktuellen Textumgebung. Wenn eine westeuropäische Textumgebung eingestellt ist, ergeben die Sortierungen die Reihenfolgen Miller, Moller, Muller, Möller bzw. Miller, Moller, Möller, Muller (siehe auch das ausführbare Beispiel und das Beispiel zu SET LOCALE).

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
  PRIVATE SECTION.
    CLASS-DATA text_tab TYPE HASHED TABLE OF string
               WITH UNIQUE KEY table_line.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    text_tab = VALUE #(
      ( `Muller` )
      ( `Möller` )
      ( `Moller` )
      ( `Miller` ) ).
    SORT text_tab.
    cl_demo_output=>write_data( text_tab ).
    SORT text_tab AS TEXT.
    cl_demo_output=>display_data( text_tab ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).

Zusatz 4

... BY compi [ASCENDING|DESCENDING] [AS TEXT]

Wirkung

Mit dem Zusatz BY compi wird nicht nach dem primären Tabellenschlüssel, sondern nach den dahinter angegebenen Komponenten comp1 comp2 ... sortiert. Die Komponenten werden wie unter Angabe der Komponenten beschrieben angegeben. Falls dabei alle Komponenten über Variablen name angegeben werden und diese nur Leerzeichen enthalten, wird nicht sortiert. Die Priorität der Sortierung richtet sich nach der Reihenfolge in der die Komponenten comp1 comp2 ... von links nach rechts angegeben sind. Die angegebenen Komponenten können auch duplikativ oder überlappend sein. Die angegebenen Komponenten können einen beliebigen Datentyp haben. Für die Auswertung gelten die entsprechenden Vergleichsregeln.

Wenn hinter einer Komponente compi keiner der Zusätze ASCENDING oder DESCENDING angegeben ist, wird die durch Zusatz 2 definierte Sortierrichtung übernommen. Ist einer der Zusätze ASCENDING oder DESCENDING angegeben, überschreibt er die Vorgabe für diese Komponente.

Wenn hinter einer textartigen Komponente compi der Zusatz AS TEXT nicht angegeben ist, wird die durch Zusatz 3 festgelegte Vorgabe übernommen. Wenn hinter einer textartigen Komponente der Zusatz AS TEXT angegeben ist, überschreibt er die Vorgabe für diese Komponente. Bei nicht-textartigen Komponenten kann AS TEXT nicht angegeben werden, außer es wird eine strukturierte Komponente angegeben. In strukturierten Komponenten wirkt AS TEXT nur auf die textartigen Komponenten.

Hinweise

Zusatz 5

... BY (otab)

Wirkung

Mit dem Zusatz BY (otab) wird nicht nach dem primären Tabellenschlüssel, sondern nach den in der internen Tabelle otab dynamisch angegebenen Komponenten sortiert. Jede Zeile der Tabelle otab definiert eine Komponente des Sortierschlüssels. Die Priorität der Sortierung richtet sich nach der Reihenfolge der Zeilen in otab. Wenn die Tabelle otab initial ist, wird nicht sortiert.

Für otab muss eine Standardtabelle vom Tabellentyp ABAP_SORTORDER_TAB aus dem ABAP Dictionary angegeben werden. Der Zeilentyp dieser Tabelle ist die Dictionary-Struktur ABAP_SORTORDER mit folgenden Komponenten:

Bei ungültigem Inhalt in einer Spalte von otab, d.h. NAME enthält den Namen einer nicht vorhandenen Komponente oder eine falsche Offset-/Längenangabe, DESCENDING oder ASTEXT enthalten nicht "X" oder den Initialwert, kommt es zu einer behandelbaren Ausnahme der Klasse CX_SY_DYN_TABLE_ILL_COMP_VAL.

Hinweise

Beispiel

Dynamisches Einlesen einer Datenbanktabelle in eine dynamische interne Tabelle und dynamisches Sortieren ihres Inhalts. Der Name der Datenbanktabelle und die Namen der Spalten, nach denen sortiert werden soll, können auf einem Selektionsbild eingegeben werden.

PARAMETERS dbtab TYPE c LENGTH 30.

SELECT-OPTIONS columns FOR dbtab NO INTERVALS.

DATA: otab  TYPE abap_sortorder_tab,
      oline TYPE abap_sortorder,
      dref  TYPE REF TO data.

FIELD-SYMBOLS: <column> LIKE LINE OF columns,
               <itab> TYPE STANDARD TABLE.

TRY.
    CREATE DATA dref TYPE STANDARD TABLE OF (dbtab).
    ASSIGN dref->* TO <itab>.
  CATCH cx_sy_create_data_error.
    MESSAGE 'Wrong data type!' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
ENDTRY.

TRY.
    SELECT *
           FROM (dbtab)
           INTO TABLE @<itab>.
  CATCH cx_sy_dynamic_osql_semantics.
    MESSAGE 'Wrong database table!' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
ENDTRY.

LOOP AT columns ASSIGNING <column>.
  oline-name = <column>-low.
  APPEND oline TO otab.
ENDLOOP.

TRY.
    SORT <itab> BY (otab).
  CATCH cx_sy_dyn_table_ill_comp_val.
    MESSAGE 'Wrong column name!' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
ENDTRY.

Zusatz 6

... BY expr

Wirkung

Mit dem Zusatz BY expr kann ein Ausdruck oder ein funktionaler Methodenaufruf expr angegeben werden, dessen Resultat eine interne Tabelle des gleichen Typs und Inhalts wie beim vorangehenden Zusatz BY (otab) ist. Bei expr handelt es sich um eine allgemeine Ausdrucksposition. Das Verhalten ist wie bei der direkten Angabe einer eingeklammerten internen Tabelle.

Hinweis

Um expr sind keine runden Klammern anzugeben.

Beispiel

Siehe Interne Tabellen dynamisch sortieren.

Ausnahmen

Behandelbare Ausnahmen

CX_SY_DYN_TABLE_ILL_LINE_TYPE

CX_SY_DYN_TABLE_ILL_COMP_VAL

Unbehandelbare Ausnahmen



Weiterlesen
Interne Tabellen sortieren
Interne Tabellen alphabetisch sortieren
Interne Tabellen mit Sekundärschlüssel sortieren
Interne Tabellen dynamisch sortieren