!--a11y-->

プログラムで、標準テーブルまたはハッシュテーブルをソートすることができます。テーブルをテーブルキーでソートするには、以下の命令を使用します。
SORT <itab> [ASCENDING|DESCENDING] [AS TEXT] [STABLE].
この命令では、内部テーブル <itab> がテーブルキーによって昇順でソートされます。この命令は、常にテーブル自体に適用され、ヘッダ行には適用されません。ソート順序は、内部テーブル内の標準キー項目の順序によって決まります。デフォルトキーはテーブル行の非数値項目で構成されており、それらの項目はそれらが出現する順序で並んでいます。
オプション ASCENDING および DESCENDING を使用して、ソートの方向を指定することができます。デフォルトは昇順です。
ソートキーが大きいほど、テーブルのソートに必要な時間が多くなります。ソートキーに内部テーブルが含まれている場合は、ソートプロセスはかなり遅くなります。
SORT 命令でソートテーブルをソートすることはできません。ソートテーブルは、常に自身のソート順序によって自動的に更新されます。内部テーブルがソートテーブルとして静的に認識できる場合、SORT 命令を使用すると構文エラーが発生します。テーブルがジェネリックソートテーブルである場合は、ソートキーがテーブルキーの先頭の抽出と同じでないときや、降順でソートするか AS TEXT オプションを使用したときに、SORT 命令によって実行時エラーが発生します。つまり、SORT 命令は、内部ソート順序に違反していない場合に限って、ジェネリック内部テーブルに対してのみ使用することができます。
構造化された行データ型を持つ内部テーブルを別のキーでソートしたい場合、以下のように SORT 命令でそのキーを指定することができます。
SORT <itab> [ASCENDING|DESCENDING] [AS TEXT] [STABLE]
BY
<f1> [ASCENDING|DESCENDING] [AS TEXT]
...
<fn> [ASCENDING|DESCENDING] [AS TEXT].
テーブルは、テーブルキーによってではなく、指定したコンポーネント <f1> ... <fn> によってソートされます。ソート項目の数は、250 に制限されます。ソート順序は、項目 <f i >. の順序によって決まります。BY の前に指定したソート順序はすべての項目に適用されます。項目の後ろのソート順序は、テーブルの列にのみ適用されます。
<fi> の代わりに(<f>) を指定して、ソート項目を動的に指定することができます。項目 <f> の内容によって、ソート項目の名前が決定されます。命令の実行時に <f> が空である場合は、その項目はソートで無視されます。項目に無効なコンポーネント名が含まれている場合は、実行時エラーが発生します。
ASCENDING オプションや DESCENDING オプションのほかに、ソート全体または各ソート項目をアルファベット順にするように指定することができます。
SORT <itab> ...AS TEXT ... .
このオプションは、文字列のソート方法に影響します。オプションを使用しないと、文字列はハードウェアプラットフォームによって指定された順序に従ってソートされます。オプション AS TEXT を使用すると、文字項目は現在のテキスト環境に従ってアルファベット順にソートされます。デフォルトでは、テキスト環境はユーザマスタレコードに設定されています。ただし、以下の命令を使用してテキスト環境を明示的に設定することもできます。
SET LOCALE LANGUAGE
AS TEXT オプションを使用すると、文字列をソート可能な書式に変換しなくても済みます。このような変換は、以下の場合にのみ必要です。
キ 内部テーブルをアルファベット順でソートしてからバイナリ検索を使用する場合
キ 文字項目をキーとして使用して内部テーブルを複数回再ソートする場合 ( このようにすると、変換が1 回しか必要なくなるため)
キ プログラムでデータベーステーブル用のアルファベット順の索引を作成する場合
AS TEXT オプションをソート全体に適用した場合は、C 型のソート項目にのみ影響します。AS TEXT オプションを単一のソート項目に適用する場合は、そのソート項目は C 型でなければなりません。
オプション
SORT <itab> ... STABLE.
を使用すると、安定したソートを実行することができます。つまり、ソートによって変化しない行の相対順序は変更されません。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.
出力は以下のようになります。
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
このプログラムでは、標準テーブルが 1 つのキー項目で 4 回ソートされます。まず、STABLE オプションを使用しないで、キー項目 (LAND) で 2 回ソートされます。ソートは安定していません。第 2 行と第 3 行の順序が変化しています。次に、STABLE オプションを使用して同じソートが実行されます。ソートは安定しています。行は同じ順序に保たれています。次に、LAND および WEIGHT として定義されたソートキーでテーブルがソートされます。一般のソート順序は降順として定義されますが、WEIGHT の場合、ソート順序は昇順として定義されます。

DATA: BEGIN OF LINE,
TEXT(6),
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 =
'Mller'.
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.
この例は、文字項目のアルファベット順のソートを示しています。内部テーブル ITAB には、アルファベット順でソートできる、文字項目を持つ列とそれに対応するバイナリコードを持つ列が含まれています。バイナリコードは、CONVERT 命令を使用して作成されます ( 詳細については、ソート可能な書式への変換を参照してください) 。テーブルは 3 回ソートされます。1 回目は、TEXT 項目でバイナリコード順にソートされます。2 回目は、XTEXT 項目でバイナリコード順にソートされます。3 回目は、TEXT 項目でアルファベット順にソートされます。英語では適切な例がないので、ドイツ語のテキスト環境の場合の出力を以下に示します。
Miller
Moller
Muller
Mller
Miller
Moller
Mller
Muller
Miller
Moller
Mller
Muller
1 回目のソートのあと、'Mller' が 'Muller' の後ろになっています。これは、文字 '' の内部コードが 'u' の内部コードの後ろにあるためです。2 回目と 3 回目のソート結果はアルファベット順になっています。XTEXT によるバイナリソートの結果は、項目 TEXT によるアルファベット順のソートと同じになります。
