!--a11y-->

次の例では、内部テーブルを使用した並行ループを伴わない LOOP によってテーブルコントロールが処理されます。スクロールバーに加えて、ユーザは、機能コードを含むプログラム制御のスクロールを実行することもできます。

REPORT demo_dynpro_tabcont_loop.
CONTROLS flights TYPE TABLEVIEW USING SCREEN 100.
DATA: ok_code TYPE
sy-ucomm,
save_ok TYPE sy-ucomm.
DATA: itab TYPE TABLE OF
demo_conn,
fill TYPE i.
TABLES demo_conn.
DATA: lines TYPE i,
limit TYPE i.
SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE itab.
CALL SCREEN 100.
MODULE status_0100
OUTPUT.
SET PF-STATUS 'SCREEN_100'.
DESCRIBE TABLE itab LINES fill.
flights-lines = fill.
ENDMODULE.
MODULE fill_table_control
OUTPUT.
READ TABLE itab INTO demo_conn INDEX flights-current_line.
ENDMODULE.
MODULE cancel
INPUT.
LEAVE PROGRAM.
ENDMODULE.
MODULE read_table_control
INPUT.
lines = sy-loopc.
MODIFY itab FROM demo_conn INDEX flights-current_line.
ENDMODULE.
MODULE user_command_0100
INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE
save_ok.
WHEN 'NEXT_LINE'.
flights-top_line = flights-top_line + 1.
limit = fill - lines + 1.
IF flights-top_line >
limit.
flights-top_line = limit.
ENDIF.
WHEN 'PREV_LINE'.
flights-top_line = flights-top_line - 1.
IF flights-top_line < 0.
flights-top_line = 0.
ENDIF.
WHEN 'NEXT_PAGE'.
flights-top_line = flights-top_line + lines.
limit = fill - lines + 1.
IF flights-top_line >
limit.
flights-top_line = limit.
ENDIF.
WHEN 'PREV_PAGE'.
flights-top_line = flights-top_line - lines.
IF flights-top_line < 0.
flights-top_line = 0.
ENDIF.
WHEN 'LAST_PAGE'.
flights-top_line = fill - lines + 1.
WHEN 'FIRST_PAGE'.
flights-top_line = 0.
ENDCASE.
ENDMODULE.
Dynpro 100 のレイアウトは次のとおりです。

サイズ調整可能なテーブルコントロール FLIGHTS が定義されています。テーブルコントロールの項目は、ABAP ディクショナリの構造 DEMO_CONN から転送されています。最初の 2 列はリード列です。対応する項目は出力項目です。表題バー、列ヘッダ、および選択列が生成されています。文字型で長さ 1 の、構造 DEMO_CONN 内のコンポーネント MARK が、選択列に割り当てられています。1 つの列と複数の行を選択することができます。
制御ロジックは次のとおりです。
PROCESS BEFORE
OUTPUT.
MODULE status_0100.
LOOP WITH CONTROL flights.
MODULE fill_table_control.
ENDLOOP.
PROCESS AFTER
INPUT.
MODULE cancel AT EXIT-COMMAND.
LOOP WITH CONTROL flights.
MODULE read_table_control.
ENDLOOP.
MODULE user_command_0100.
テーブルコントロール FLIGHTS を使用して、PBO および PAI でループが実行されます。PBO ループ時に、ABAP プログラムのテーブル ITAB からテーブルコントロールに値を書き込むモジュールが呼び出されます。PAI ループ時に、テーブル ITAB を変更するモジュールが呼び出されます。
PBO ループの前に、モジュール STATUS_0100 で、内部テーブル ITAB の現在の行数がコントロール構造 FLIGHTS のコンポーネント LINES に格納されます。これにより、テーブルコントロールのスクロールバーが適切にインストールされます。
PBO ループ時に、モジュールFILL_TABLE_CONTROL で、作業領域 DEMO_CONN に内部テーブルの値が書き込まれます。この内部テーブルの行索引は、テーブルコントロールの現在の行に対応します。
PAI ループ時に、モジュールREAD_TABLE_CONTROL で、テーブルコントロールの表示行数 SY-LOOPC の現在の数が補助変数に格納されます。この数は、Dynpro のサイズによって異なります。行索引がテーブルコントロールの現在の行に対応する内部テーブルの行が、作業領域 DEMO_CONN の内容で上書きされます。コントロールの入力項目から内部テーブルにユーザ入力が転送されます。特に、内部テーブルでは、テーブルコントロールの行が選択されているかどうかを示すフラグも列 MARK に格納されます。
PAI ループの後、モジュール USER_COMMAND でユーザ入力が処理されます。GUI ステータスSCREEN_100 によって、該当する機能コードが提供されます。行ごとまたはページごとにスクロールしたり、最初または最後のページにジャンプしたりすることができます。スクロールを実装するには、コントロール構造 FLIGHTS のコンポーネント TOP_LINE を設定します。ページごとのスクロールについては、PAI ループで SY-LOOPC によって書き込まれる補助変数がステップサイズとして使用されます。