!--a11y-->

以下の命令を使用して、内部テーブルとほぼ同じ方法で抽出データセットをソートすることができます。
SORT
[ASCENDING|DESCENDING] [AS TEXT] [STABLE]
BY <f1> [ASCENDING|DESCENDING]
[AS TEXT]
...
<fn> [ASCENDING|DESCENDING] [AS TEXT].
SORT 命令は、プログラムの抽出データセットの登録を終了し、同時にそのレコードをソートします。BY オプションを指定しない場合、データセットは、HEADER 項目グループで指定されたキーにもとづいてソートされます。
抽出データセットは、各種のキーを必要な数だけ使用して、何度でもプログラムでソートすることができます。唯一の前提条件は、抽出プロセス時にソート対象の全項目が HEADER に格納されていることです。LOOP と ENDLOOP の間で SORT 命令を使用することはできません。ただし、抽出データセットは、任意の順序でソートおよび読込を行うことができます。ソート命令の後で EXTRACT 命令を追加使用することはできません。追加使用すると実行時エラーが発生します。
BY オプションを使用すると、各種のソートキーを定義することができます。その結果、指定されたコンポーネント <f 1> ... <fn> にもとづいてデータセットがソートされます。これらのコンポーネントは、HEADER 項目グループの項目か、または HEADER 項目グループの項目だけを含む項目グループの項目でなければなりません。キー項目数は 50 に制限されています。コンポーネント<f1> ... <fn> の順序によってソート順序が決まります。BY の前に指定したオプションが、BY の後に指定された全項目のデフォルト値として使用されます。個別項目の後に指定したオプションによって、BY の前にオプションを指定した項目が上書きされます。
ソート方向を定義するには、DESCENDING またはASCENDING オプションを使用します ( 昇順がデフォルトの方向です) 。文字列に対しては、AS TEXT オプションを使用してソート方法を定義することができます。この場合は、内部テーブルと同様にアルファベット順ソートが強制されます。抽出データセットを 2 回以上アルファベット順でソートする場合は、パフォーマンス上の理由により、テキスト項目ではなくアルファベット順ソートが可能な項目をソートキーに組み込む必要があります。この項目に書き込むには、CONVERT 命令 を使用します。
BY の前に AS TEXT を配置する場合、このオプションはソートキーのタイプ C 項目にのみ適用されます。項目の後にAS TEXT を配置する場合、その項目はタイプ C でなければなりません。項目グループの後に AS TEXT を配置する場合、このオプションは、その項目グループ内のタイプ C 項目にのみ適用されます。
このソートプロセスは一定していません。つまり、同じソートキーを持つ古いレコードの順序を必ずしも維持する必要はありません。安定したソートを行うには、STABLE オプションを使用します。
データのソートに使用するメインメモリが不足している場合は、ソートプロセス中にデータが外部の補助ファイルに書き込まれます。このファイルの名称は、SAP プロファイルパラメータ DIR_SORTTMP によって決まります。
SORT 命令では、ソートキーの 値 HEX 00 を含む全項目が他の全エントリの前にソートされます。この機能は、論理データベースの使用時には重要です。論理データベースで階層レベルの読込が完了すると、そのレベルの全項目に値 HEX 00 が書き込まれます。同様に、GET 命令 (FIELDS オプション) で項目一覧を使用すると、論理データベースによって、その項目一覧にない全項目に HEX 00 が書き込まれます。
SORT 命令を用いて抽出データセットで実行された各ソートプロセスによって、制御レベルが定義されます。この定義は、後続の制御レベル処理に必要です。

以下のプログラムは、論理データベース F1S にリンクしているものと仮定します。
REPORT DEMO.
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.
SORT DESCENDING 命令を除き、この例は抽出の読込のセクションの例と同じです。SORT 命令は、ループを使用して抽出データセットを読み込む前に、HEADER 項目グループの 3 つの項目によってそのデータセットを降順でソートするようにシステムに指示します。一覧の最後は、次のように表示されます。

値 HEX 00 ( 一覧の未定義の文字) を含む、項目 SFLIGHT-FLDATE のレコードが他のレコードの前にソートされていることに注意してください。この処理は、論理データベースのデータの階層を保持するために、ソート順序とは無関係に行われます。
