!--a11y-->

テーブルコントロールは、ステップループテクニックを使用して処理されます。
ステップループはテーブルコントロールの前身で、現在では使用されなくなっています。ただし、既存のステップループは、スクリーンペインタでテーブルコントロールに変更することができます。ここでは、完全性のため、および Dynpro と ABAP プログラムのテーブル間のデータ転送のテクニックを説明するために、ステップループ、特にステップループテクニックについて説明します。
テーブルコントロールと同様に、ステップループは、テーブルタイプのデータを画面に表示するための Dynpro エレメントです。プログラムの観点では、特にデータ転送については、テーブルコントロールとステップループはほとんど同じです。テーブルコントロールは結局、エンドユーザによる使いやすさに関して、ステップループを改善したものです。
ステップループも、
スクリーンペインタで定義します。テーブルコントロールとは異なり複数行にまたがることができる Dynpro
エレメントは、ステップループ内で複数回繰り返される 1
つのグループに結合されます。最初のグループの Dynpro
エレメントの属性によって、ステップループ全体の属性が定義されます。グループの項目は、対応する Dynpro
の項目一覧に一度だけ表示されます。そのため、ABAP
プログラムに一度登録すればよいだけです。Dynpro
には、複数のステップループを含めることができます。ただし、Dynpro
エレメントのように、ステップループには個々の名称はありません。
スクリーンペインタでは、ステップループのサイズが固定であるか可変であるかを定義することができます。ユーザがウィンドウのサイズを垂直方向に変更すると、可変ステップループの垂直方向のサイズが変わります。
各 Dynpro
について、固定ステップループはいくつでも定義することができますが、可変ステップループは 1
つしか定義することができません。Dynpro
に可変ステップループが定義されている場合、垂直方向にサイズが変更されるたびに PAI
がトリガされます。固定ステップループについては、繰返グループの数を事前に定義します。
ステップループ ( ステップループテクニック) を処理する際には、Dynpro 制御ロジックでループが実行されます。制御ロジック内の関連するコマンドは次のとおりです。
LOOP
...
...
ENDLOOP.
これらの制御コマンドを、同じ名称の ABAP 命令と混同しないでください。LOOP と ENDLOOP 間では、FIELD 、MODULE 、SELECT 、VALUES 、および CHAIN といった他の制御ロジックキーワードを使用することができます。PBO および PAI 処理ブロックの両方で、ステップループごとに少なくとも 1 つの空の LOOP が必要です。ループ時に、ABAP プログラムと Dynpro の同名の項目間で、ステップループの内容が双方向に移送されます。ディクショナリ参照によって定義されたステップループ項目は、インタフェース作業領域として TABLES を使用して、前述のように、ABAP プログラムで定義する必要がある点に注意してください。
制御ロジックの個々のループでステップループが処理される順序は、Dynpro のステップループ順序によって決まります。Dynpro における順序は、第一に行、第二に列にもとづきます。
表示されるテーブルのサイズが可変の場合、ユーザがウィンドウの高さを変更すると、表示されるステップループの行数が変わることがあります。この場合、PAI イベントごとに異なる行数を ABAP プログラムに転送することができます。
データ移送のフローとカーソル位置については、テーブルコントロールの場合と同様です。システム項目 SY-STPL および SY-LOOPC にも、ループ内で値が書き込まれます。
次の 2 つのループテクニックが区別されます。
制御ロジックのコマンドは次のとおりです。
LOOP.
...
ENDLOOP.
これらの命令によって、画面に表示されるステップループ行のループパスが生成され、PAI では ABAP プログラムの同名の項目に各グループのデータが転送され、PBO では ABAP プログラムからステップループ項目にデータが転送されます。LOOP-ENDLOOP ループ内で、転送されたデータを処理し、PBO については内部テーブルから読み込み、PAI については内部テーブルに格納するモジュールを呼び出すことができます。
この形式の処理では、ステップループ表示にスクロールバーは含まれません。スクロールできるようにするには、ABAP プログラムで指定する必要があります。
制御ロジックのコマンドは次のとおりです。
LOOP AT <itab> CURSOR <c> [INTO <wa>] [FROM <n1>] [TO
<n2>].
...
ENDLOOP.
これらの命令によって、画面に表示されるステップループ行と ABAP プログラムの内部テーブル<itab> の並行ループパスが生成されます。PBO ではオプション INTO 、CURSOR 、および FROM を使用することができますが、PAI では使用することができません。
この形式の処理では、ステップループ表示にスクロールバーが含まれます。スクロール機能は、システムによって自動的に定義されます。スクロール可能なステップループ行は、ABAP プログラムで内部テーブルからコピーされます。スクロールによって PAI イベントがトリガされます。
PBO で CURSOR オプションを使用して、画面に最初に表示される内部テーブル行を制御することができます。<c> は、データ型 I の ABAP プログラムのデータオブジェクトです。一方、各 PAI イベントについては、<c> は、表示される最初のテーブル行の値に設定されます。これにより、ABAP プログラムの内部テーブルと表示されるステップループ行を同期することができます。スクロールによって <c> の値が変更されるので、PBO の開始時に補助変数に<c> を格納し、ループ内では評価しないようにすることをお奨めします。
INTO オプションを使用すると、PBO で内部テーブル <itab> の項目が作業領域 <wa> に書き込まれ、<wa> の内容が Dynpro 上のステップループの同名の項目に 1 行ずつ移送されます。INTO オプションを使用しない場合は、ヘッダ行がある内部テーブルを使用する必要があります。これにより、PBO で、ヘッダ行の内容が Dynpro 上のステップループの同名の項目に 1 行ずつ移送されます。したがって、ステップループ行に値を書き込むモジュールは不要です。
一方、PAI では、内部テーブル行にステップループ行の内容が自動的に書き込まれるわけではありません。代わりに、ループ内でテーブルに値を書き込むモジュールを呼び出す必要があります。ただし、その場合も、PAI でオプション AT <itab> を指定する必要があります。このオプションを指定しなかった場合は、スクロールバーによるスクロールが機能しません。
FROM および TO オプションを使用して、ステップループの内部テーブルの表示や作業領域を制限することができます。<n1> および <n2> は、データ型 I の ABAP プログラムのデータオブジェクトです。これらのパラメータを指定しなかった場合、表示または処理の範囲として内部テーブルの先頭や末尾が使用されます。<c> が範囲<n1> から <n2> 外の場合、後者が優先されます。
ステップループの内部テーブルの開始行と表示行数を指定する、LOOP AT 命令のオプションCURSOR <c> および FROM <n1> TO <n2> は、制御ロジックのテーブルコントロールで使用可能ですが、必須では ありません。TABLE CONTROLS については、ABAP プログラムの構造 CXTAB_CONTROL を使用することで表示が制御されます。
キ CURSOR <c> の代わりに、テーブルコントロールには必ずコンポーネント TOP_LINE を使用する必要があります。このコンポーネントには常に、最上位に表示される行が格納されます。
キ テーブルコントロールに <n1> も指定すると、コンポーネント CURRENT_LINE の計算式がSY-STEPL + (TOP_LINE - 1) + (<n1> - 1) に変わります。

REPORT demo_dynpro_step_loop.
TYPES: BEGIN OF
t_itab,
col1 TYPE i,
col2 TYPE i,
END OF t_itab.
DATA: itab TYPE STANDARD
TABLE OF t_itab,
wa LIKE LINE OF itab,
fill TYPE i.
DATA: idx TYPE
i,
line TYPE i,
step TYPE i,
limit TYPE i,
c TYPE i,
n1 TYPE i VALUE
5,
n2 TYPE i VALUE
25.
DATA: ok_code TYPE
sy-ucomm,
save_ok TYPE sy-ucomm.
START-OF-SELECTION.
DO 40 TIMES.
wa-col1 = sy-index.
wa-col2 = sy-index ** 2.
APPEND wa TO itab.
ENDDO.
DESCRIBE TABLE itab LINES fill.
CALL SCREEN 100.
MODULE status_0100
OUTPUT.
SET PF-STATUS 'STATUS_100' EXCLUDING 'PREVIOUS'.
ENDMODULE.
MODULE status_0200
OUTPUT.
SET PF-STATUS 'STATUS_200' EXCLUDING 'NEXT'.
ENDMODULE.
MODULE transp_itab_out
OUTPUT.
idx =
sy-stepl + line.
READ TABLE
itab INTO wa INDEX idx.
ENDMODULE.
MODULE transp_itab_in
INPUT.
step =
sy-loopc.
idx =
sy-stepl + line.
MODIFY
itab FROM wa INDEX idx.
ENDMODULE.
MODULE user_command_0100
INPUT.
save_ok =
ok_code.
CLEAR
ok_code.
CASE
save_ok.
WHEN
'NEXT_LINE'.
line = line + 1.
limit = fill - step.
IF line > limit.
line = limit.
ENDIF.
WHEN 'PREV_LINE'.
line = line - 1.
IF line < 0.
line = 0.
ENDIF.
WHEN 'NEXT_PAGE'.
line = line + step.
limit = fill - step.
IF line > limit.
line = limit.
ENDIF.
WHEN 'PREV_PAGE'.
line = line - step.
IF line < 0.
line = 0.
ENDIF.
WHEN 'LAST_PAGE'.
line = fill - step.
WHEN 'FIRST_PAGE'.
line = 0.
WHEN 'NEXT'.
c = line + 1.
LEAVE TO SCREEN 200.
ENDCASE.
ENDMODULE.
MODULE get_first_line
INPUT.
line = c - 1.
ENDMODULE.
MODULE
user_command_0200
INPUT.
save_ok = ok_code.
CASE
save_ok.
WHEN 'PREVIOUS'.
LEAVE TO SCREEN 100.
ENDCASE.
ENDMODULE.
MODULE cancel
INPUT.
LEAVE PROGRAM.
ENDMODULE.
Dynpro 100 のレイアウトは次のとおりです。

10 個の初期繰返グループがある可変ステップループが定義されています。繰返グループの項目は、ABAP プログラムの構造 WA のコンポーネント COL1 および COL2 です。
Dynpro 100 の制御ロジックは次のとおりです。
PROCESS BEFORE
OUTPUT.
MODULE status_0100.
LOOP.
MODULE transp_itab_out.
ENDLOOP.
PROCESS AFTER
INPUT.
MODULE cancel AT EXIT-COMMAND.
LOOP.
MODULE transp_itab_in.
ENDLOOP.
MODULE user_command_0100.
ステータス STATUS 100 で、機能コード FIRST_PAGE 、PREV_PAGE 、PREV_LINE 、NEXT_LINE 、NEXT_PAGE 、LAST_PAGE 、および NEXT が Dynpro 100 のアプリケーションツールバーの押ボタンに割り当てられています。
Dynpro 200 のレイアウトは Dynpro 100 のレイアウトと同じです。ただし、ステップループが可変ではなく、固定である点が異なります。
Dynpro 200 の制御ロジックは次のとおりです。
PROCESS BEFORE
OUTPUT.
MODULE status_0200.
LOOP AT itab INTO wa CURSOR c FROM n1 TO n2.
ENDLOOP.
PROCESS AFTER
INPUT.
MODULE cancel AT EXIT-COMMAND.
MODULE get_first_line.
LOOP AT itab.
MODULE transp_itab_in.
ENDLOOP.
MODULE user_command_0200.
ステータス STATUS 200 で、機能コード PREVIOUS が Dynpro 200 のアプリケーションツールバーの押ボタンに割り当てられています。
プログラムを実行すると、Dynpro 100 にステップループが表示されます。その行数は画面の高さに合わせて調整されていますが、垂直スクロールバーはありません。Dynpro 200 には、固定行数 10 のステップループと垂直スクロールバーが表示されます。
PBO で、両方のステップループに内部テーブル ITAB から値が書き込まれます。Dynpro 100 についてはステップループのみがループされ、Dynpro 200 についてはステップループと内部テーブルが並行してループされます。Dynpro 200 のステップループは、内部テーブルの行 5 から 25 に制限されています。Dynpro 100 については作業領域 WA に値を書き込む PBO モジュールが呼び出されますが、Dynpro 200 については必ずしも呼び出されるわけではありません。
PAI では、ループ内で両方の Dynpro でモジュールが呼び出されます。このモジュールでは、ステップループ行のユーザエントリが内部テーブルの対応する行に転送されます。
Dynpro100 については、ステップループのスクロール機能が PAI モジュールUSER_COMMAND_100 でプログラムされます。この場合、SY-LOOPC にはループ内でのみ値が書き込まれるので、Dynpro のステップループの行数は補助変数 STEP にバッファされます。Dynpro 200 については、スクロール機能をプログラムしなくても、スクロールバーの形でシステムによって自動的に提供されます。
内部テーブルと Dynpro 200 のステップループ間の同期は、LOOP 命令の CURSOR オプションで使用される変数 C によって処理されます。これは、Dynpro 100 のテーブルの表示に従って、Dynpro 200 が呼び出される前に設定されます。Dynpro 200 の PAI で、スクロールバーによるスクロール後に最初のテーブル行を再定義するために C が読み込まれます。