コンテンツフレーム起動

テーブルコントロール: 変更を伴う場合の例 文書を SAP ライブラリストラクチャに組み込む

次の例では、内部テーブルを使用した並行ループを伴う 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 ループでテーブルコントロールが再度内部テーブルから読み込まれるので、画面上の行が削除されます。

 

 

 

コンテンツフレーム終了