SAP NetWeaver AS ABAP Release 740, ©Copyright 2014 SAP AG. All rights reserved.
ABAP Keyword Documentation → ABAP − Reference → Processing Internal Data → Internal Tables → Processing Statements for Internal Tables →Syntax
SORT itab [STABLE]
{ { [ASCENDING|DESCENDING]
[AS TEXT]
[BY {comp1 [ASCENDING|DESCENDING] [AS TEXT]}
{
comp2 [ASCENDING|DESCENDING] [AS TEXT]}
... ] }
| { [BY (otab)] }
| { [BY expr] } }.
Extras:
1. ... STABLE
2. ... ASCENDING|DESCENDING
3. ... AS TEXT
4. ... BY compi [ASCENDING|DESCENDING] [AS TEXT]
5. ... BY (otab)
6. ... BY expr
Effect
This statement sorts an internal table itab by the size of its components, whereby by default sizes are compared using the general comparison rules for individual operands, that is:
If no explicit sort key is entered using the BY addition, the internal table itab is sorted by the primary table key. The priority of the sort is based on the order in which the key fields are specified in the table definition. In standard keys, the sort is prioritized according to the order of the key fields in the row type of the table. If the primary table key of a standard table is empty, then no sort takes place. If this is statically identifiable, the syntax check produces a warning.
Sorting is unstable by default, which means that the relative order of rows that do not have different sort keys is not retained when they are sorted, and can change when they are sorted more than once. The addition STABLE can be used for stable sorting.
itab expects a standard table or a hashed table.
In both table types, SORT specifies the order in which a subsequent LOOP runs without the addition USING KEY.
Sorted tables cannot be sorted using SORT and applying the SORT statement to sorted tables is prohibited by the syntax. If the system only detects that a sorted table is to be sorted at runtime, then a non-handleable exception is raised if this action could modify the existing sorting. The latter occurs in the following cases:
Otherwise, the statement SORT is ignored for sorted tables.
Notes
... STABLE
Effect
STABLE is used to perform stable sorts, which means that the relative order
of rows (an order that does not change in the sort key) remains unchanged in the sort. Without the
STABLE addition, the order is not stable and multiple sorting of a table using the same sort key can result in a different order each time the table is sorted.
... ASCENDING|DESCENDING
Effect
The addition ASCENDING or DESCENDING can be used
to specify the sort direction explicitly as ascending or descending. If neither of the additions is
specified, the table is sorted in ascending order. This sort direction can be overwritten after the BY addition for components that are individually listed there.
... AS TEXT
Effect
The addition AS TEXT specifies that
text-like components are sorted in accordance with the
locale of the current
text environment.
If AS TEXT is not specified, text-like components are sorted according to
the encoding in the code page of the current text environment. This specification can be overwritten
after the BY addition for the components that are individually listed there.
The text environment is set when an internal session is opened or by using the statement SET LOCALE.
Notes
Example
Sorting a hashed table text_tab by the order in the code page and in accordance with the locale of the current text environment. If a western European text environment is configured, the sorts produce the orders Miller, Moller, Muller, Möller and Miller, Moller, Möller, Muller respectively (also see the executable example and the example for 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( ).
... BY compi [ASCENDING|DESCENDING] [AS TEXT]
Effect
The addition BY compi does not sort the table by the primary table key, but by the components comp1 comp2... specified after it instead. The components are specified as described under Specifying Components. If all components are specified using name variables and these variables contain only blanks, then no sort takes place. The priority of the sort depends on the order in which the components comp1 comp2 ... are specified from left to right. The specified components can also be duplicated or can overlap. The specified components can have any data type. The relevant comparison rules apply to the evaluation.
If neither of the additions ASCENDING or DESCENDING are specified after compi, the sort direction specified by addition 2 is used. If one of the additions ASCENDING or DESCENDING is specified, it overwrites the default for this component.
If the AS TEXT addition is not specified after a text-like component
compi, the specification defined by addition 3 is used. If the addition AS
TEXT is specified after a text-like component, it overwrites the default for this component.
In non-text-like components, AS TEXT cannot be specified, unless a structured
component is specified. In structured components, AS TEXT only affects text-like components.
Notes
... BY (otab)
Effect
The addition BY (otab) does not sort the table by the primary table key, but by the component specified dynamically in the internal table otab instead. Each row of the table otab defines a component of the sort key. The priority of the sort is based on the order of the rows in otab. If the table otab is initial, the table is not sorted.
For otab, a standard table of the table type ABAP_SORTORDER_TAB from ABAP Dictionary must be specified. The row type of this table is the dictionary structure ABAP_SORTORDER with the following components:
If a column of otab has invalid content (that is, if NAME contains the name
of a component that does not exist or an incorrect offset/length or if DESCENDING and ASTEXT do not
contain "X" or the initial value), this raises a handleable exception of the class CX_SY_DYN_TABLE_ILL_COMP_VAL.
Notes
Example
Dynamic import of a database table into a dynamic internal table and dynamic sorting of its content. The name of the database table and the names of the columns by which the table is to be sorted can be entered in a selection screen.
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.
... BY expr
Effect
The addition BY expr can be used to specify an expression or a functional method call expr whose result is an internal table with the same type and content as in the preceding addition BY (otab). expr is a general expression position. The behavior is the same as when specifying a parenthesized internal table directly.
Note
Parentheses cannot be placed around expr.
Example
See Sorting Internal Tables Dynamically.
Non-Catchable Exceptions
CX_SY_DYN_TABLE_ILL_LINE_TYPE
CX_SY_DYN_TABLE_ILL_COMP_VAL
Non-Catchable Exceptions