!--a11y-->

次の例では、内部テーブルを使用した並行ループを伴う LOOP によってテーブルコントロールが処理されます。機能コードを使用すると、列をソートしたり、内部テーブルから行を削除したりすることができます。テーブルコントロール項目の入力可能ステータスは、機能コードを使用して制御されます。

REPORT demo_dynpro_tabcont_loop_at.
CONTROLS flights TYPE
TABLEVIEW USING SCREEN 100.
DATA: cols LIKE LINE OF flights-cols,
lines
TYPE i.
DATA: ok_code TYPE
sy-ucomm,
save_ok TYPE sy-ucomm.
DATA: itab TYPE TABLE OF demo_conn.
TABLES demo_conn.
SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE itab.
LOOP AT flights-cols INTO
cols WHERE index GT 2.
cols-screen-input = '0'.
MODIFY flights-cols FROM cols INDEX sy-tabix.
ENDLOOP.
CALL SCREEN 100.
MODULE status_0100
OUTPUT.
SET PF-STATUS 'SCREEN_100'.
DESCRIBE TABLE itab LINES lines.
flights-lines =
lines.
ENDMODULE.
MODULE cancel
INPUT.
LEAVE PROGRAM.
ENDMODULE.
MODULE read_table_control
INPUT.
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 'TOGGLE'.
LOOP AT flights-cols INTO cols WHERE index GT 2.
IF cols-screen-input
= '0'.
cols-screen-input = '1'.
ELSEIF cols-screen-input = '1'.
cols-screen-input = '0'.
ENDIF.
MODIFY flights-cols FROM cols INDEX sy-tabix.
ENDLOOP.
WHEN 'SORT_UP'.
READ TABLE flights-cols INTO cols WITH KEY selected = 'X'.
IF sy-subrc = 0.
SORT itab STABLE BY
(cols-screen-name+10) ASCENDING.
cols-selected = ' '.
MODIFY flights-cols FROM cols INDEX sy-tabix.
ENDIF.
WHEN 'SORT_DOWN'.
READ TABLE flights-cols INTO cols WITH KEY selected = 'X'.
IF sy-subrc = 0.
SORT itab STABLE BY
(cols-screen-name+10) DESCENDING.
cols-selected = ' '.
MODIFY flights-cols FROM cols INDEX sy-tabix.
ENDIF.
WHEN 'DELETE'.
READ TABLE flights-cols INTO cols
WITH
KEY screen-input = '1'.
IF sy-subrc = 0.
LOOP AT itab INTO demo_conn
WHERE mark = 'X'.
DELETE itab.
ENDLOOP.
ENDIF.
ENDCASE.
ENDMODULE.
Dynpro 100 のレイアウトは次のとおりです。

サイズ調整可能なテーブルコントロール FLIGHTS が定義されています。テーブルコントロールの項目は、ABAP ディクショナリの構造 DEMO_CONN から転送されています。最初の 2 列はリード列です。対応する項目は出力項目です。表題バー、列ヘッダ、および選択列を含んでいます。文字型で長さ 1 の、構造 DEMO_CONN 内のコンポーネント MARK が、選択列に割り当てられています。1 つの列と複数の行を選択することができます。
制御ロジックは次のとおりです。
PROCESS BEFORE OUTPUT.
MODULE status_0100.
LOOP AT itab INTO demo_conn WITH CONTROL
flights.
ENDLOOP.
PROCESS AFTER INPUT.
MODULE cancel AT EXIT-COMMAND.
LOOP AT itab.
MODULE read_table_control.
ENDLOOP.
MODULE user_command_0100.
PBO および PAI で、テーブルコントロール FLIGHTS を使用してループが実行されます。また、ABAP プログラムの内部テーブル ITAB を使用したループも実行されます。PBO ループ時には、ABAP プログラムのテーブル ITAB からテーブルコントロールに値を書き込むモジュールは呼び出されません。ただし、PAI ループ時に、テーブル ITAB を変更するモジュールが呼び出されます。
PBO で、テーブルコントロールのスクロールバーをインストールするために、PBO ループの前にコントロール構造 FLIGHTS のコンポーネント LINES に内部テーブルの現在の行数が明示的に書き込まれます。
PBO ループ時に、モジュールFILL_TABLE_CONTROL で、作業領域 DEMO_CONN に内部テーブルの値が書き込まれます。この内部テーブルの行索引は、テーブルコントロールの現在の行に対応します。
PAI ループ時に、行索引がテーブルコントロールの現在の行に対応する内部テーブルの行が、作業領域 DEMO_CONN の内容で上書きされます。コントロールの入力項目から内部テーブルにユーザ入力が転送されます。特に、内部テーブルでは、テーブルコントロールの行が選択されているかどうかを示すフラグも列 MARK に格納されます。
PAI ループの後、モジュール USER_COMMAND でユーザ入力が処理されます。GUI ステータスSCREEN_100 によって、該当する機能コードが提供されます。
プログラムが呼び出された際には、テーブルコントロールの項目の一部は入力可能ではありません。プログラムの CALL SCREEN の前に、スクリーンペインタにおけるテーブルコントロールの静的指定が変更されます。コントロール構造 FLIGHTS のテーブル COLS が使用されます。テーブルFLIGHT-COLS を使用したループで、列位置が 2 より大きいすべての列が書込不可ステータスに設定されます。機能コード TOGGLE を選択すると、列の入力可能ステータスを変更することができます。
機能コード SORT_UP および SORT_DOWN を使用すると、内部テーブル ITAB の選択列を昇順または降順にソートすることができます。テーブルコントロールの静的設定を使用すると、単一列のみを選択することができます。選択列は、内部テーブルFLIGHT-COLS から取得されます。SORT 命令のソート基準の名称は、コンポーネントCOLS-SCREEN-NAME から動的に特定されます。接頭辞 DEMO_CONN- は、オフセット指定を使用して削除する必要があります。ソート後、選択が取り消され、テーブルFLIGHT-COLS のコンポーネント SELECTED に空白文字が割り当てられます。
機能コード DELETE を使用して、内部テーブル ITAB から選択行を削除することができます。まず、テーブルコントロールの項目が入力可能であるかどうかがチェックされます。その後、内部テーブル ITAB を使用したループで、すべての選択行が削除されます。PBO ループでテーブルコントロールが再度内部テーブルから読み込まれるので、画面上の行が削除されます。