!--a11y-->

抽出データセットをソートすると、抽出データセットの制御レベルが定義されます。制御レベルの一般情報については、ループの内部テーブルの処理を参照してください。抽出データセットの制御レベル階層は、HEADER 項目グループの項目の順序に対応しています。ソート後は、ループ内で AT 命令を使用して、制御ブレーク時、つまり制御レベルの変更時にのみ処理される命令ブロックをプログラムすることができます。
AT NEW <f> | AT END OF <f>.
...
ENDAT.
項目 <f> または現在のレコードの上位項目に、前レコード (AT NEW) または後続レコード (AT END) と異なる値が含まれている場合は、制御ブレークが発生します。項目 <f> は、HEADER 項目グループの一部である必要があります。
抽出データセットがソートされていない場合、AT... ENDAT ブロックは実行されません。さらに、制御ブレークを決定する際、項目 <f> 内の値 HEX 00 を含むすべての抽出レコードは無視されます。
ループ内の AT... ENDAT ブロックは、出現する順序で処理されます。この順序には、ソート順序と同じ名称を指定します。この順序は、必ずしも HEADER 項目グループの項目の順序である必要はありませんが、SORT 命令で指定された順序を使用することもできます。
項目 <f1> 、<f2> 、... によって抽出データセットをソートした場合、制御レベルの処理は、次のように他の制御命令の間に記述する必要があります。
LOOP.
AT
FIRST....ENDAT.
AT NEW
<f1>.......ENDAT.
AT NEW
<f2>.......ENDAT.
...
AT
<fgi>.....ENDAT.
<
制御命令なしの単一行処理>
...
AT END OF
<f2>....ENDAT.
AT END OF
<f1>....ENDAT.
AT LAST.....ENDAT.
ENDLOOP.
上述の命令ブロックをすべて使用する必要はありません。必要なものだけを使用します。

REPORT DEMO.
DATA: T1(4), T2 TYPE I.
FIELD-GROUPS: HEADER.
INSERT T2 T1 INTO HEADER.
T1 ='AABB'.T2 = 1. EXTRACT
HEADER.
T1 ='BBCC'.T2 = 2. EXTRACT
HEADER.
T1 ='AAAA'.T2 = 2. EXTRACT
HEADER.
T1 ='AABB'.T2 = 1. EXTRACT
HEADER.
T1 ='BBBB'.T2 = 2. EXTRACT
HEADER.
T1 ='BBCC'.T2 = 2. EXTRACT
HEADER.
T1 ='AAAA'.T2 = 1. EXTRACT
HEADER.
T1 ='BBBB'.T2 = 1. EXTRACT
HEADER.
T1 ='AAAA'.T2 = 3. EXTRACT
HEADER.
T1 ='AABB'.T2 = 1. EXTRACT
HEADER.
SORT BY T1 T2.
LOOP.
AT FIRST.
WRITE 'Start of LOOP'.
ULINE.
ENDAT.
AT NEW T1.
WRITE / ' New T1:'.
ENDAT.
AT NEW T2.
WRITE / ' New T2:'.
ENDAT.
WRITE: /14 T1, T2.
AT END OF T2.
WRITE / 'End of T2'.
ENDAT.
AT END OF T1.
WRITE / 'End of T1'.
ENDAT.
AT LAST.
ULINE.
ENDAT.
ENDLOOP.
このプログラムでは、HEADER 項目グループの項目だけを含むサンプル抽出が作成されます。ソートプロセス後、抽出データセットには制御レベル T1 と T2 の複数の制御ブレークが下図のように含まれます。

ループ内では、データセットの内容とその関連する制御ブレークが以下のように表示されます。
