テーブルコントロールTable Controls: スクロールを伴う場合の例

以下の例では、内部テーブルを使用した並行ループを伴わない 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 のレイアウトは、以下のようになります。

  

This graphic is explained in the accompanying text

リサイジングできるテーブルコントロール flights が定義されています。テーブルコントロールの項目は、ABAP ディクショナリの構造 DEMO_CONN から転送されます。最初の 2 列はリード列です。対応する項目は出力項目です。表題バー、列ヘッダ、および選択列が登録されています。文字型で長さ 1 が指定された構造 DEMO_CONN 内のコンポーネント MARK が、選択列に割り当てられています。1 つの列と複数の行を選択することができます。

Dynpro 100 の制御ロジックは、以下のようになります。

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 の現在数が補助変数に格納されます。この数は、画面サイズによって異なります。テーブルコントロールの現在行に対応する行索引を持つ内部テーブルの行が、作業領域 demo_conn の内容で上書きされます。ユーザ入力がコントロールの入力項目から内部テーブルに転送されます。特に、内部テーブルでは、テーブルコントロールの行が選択されているかどうかを示すフラグも列 MARK に含まれます。

PAI ループの後、モジュール user_command_0100 でユーザ入力が処理されます。GUI ステータス SCREEN_100 によって適切な機能コードが提供されます。行単位またはページ単位でスクロールしたり、最初または最後のページにジャンプしたりすることができます。スクロールを実装するには、コントロール構造 flights のコンポーネント top_line を設定します。ページ単位のスクロールについては、PAI ループで sy-loopc によって書き込まれる補助変数がステップサイズとして使用されます。

原文地址:https://www.cnblogs.com/yjyongil/p/12378718.html