コンテンツフレーム起動

付録: ステップループテクニック 文書を SAP ライブラリストラクチャに組み込む

テーブルコントロールは、ステップループテクニックを使用して処理されます。

ステップループはテーブルコントロールの前身で、現在では使用されなくなっています。ただし、既存のステップループは、スクリーンペインタでテーブルコントロールに変更することができます。ここでは、完全性のため、および Dynpro ABAP プログラムのテーブル間のデータ転送のテクニックを説明するために、ステップループ、特にステップループテクニックについて説明します。

テーブルコントロールと同様に、ステップループは、テーブルタイプのデータを画面に表示するための Dynpro エレメントです。プログラムの観点では、特にデータ転送については、テーブルコントロールとステップループはほとんど同じです。テーブルコントロールは結局、エンドユーザによる使いやすさに関して、ステップループを改善したものです。

ステップループの定義

ステップループも、ストラクチャのリンクスクリーンペインタで定義します。テーブルコントロールとは異なり複数行にまたがることができる Dynpro エレメントは、ステップループ内で複数回繰り返される 1 つのグループに結合されます。最初のグループの Dynpro エレメントの属性によって、ステップループ全体の属性が定義されます。グループの項目は、対応する Dynpro の項目一覧に一度だけ表示されます。そのため、ABAP プログラムに一度登録すればよいだけです。Dynpro には、複数のステップループを含めることができます。ただし、Dynpro エレメントのように、ステップループには個々の名称はありません

ストラクチャのリンクスクリーンペインタでは、ステップループのサイズが固定であるか可変であるかを定義することができます。ユーザがウィンドウのサイズを垂直方向に変更すると、可変ステップループの垂直方向のサイズが変わります。 Dynpro について、固定ステップループはいくつでも定義することができますが、可変ステップループは 1 つしか定義することができません。Dynpro に可変ステップループが定義されている場合、垂直方向にサイズが変更されるたびに PAI がトリガされます。固定ステップループについては、繰返グループの数を事前に定義します。

ステップループの処理

ステップループ ( ステップループテクニック) を処理する際には、Dynpro 制御ロジックでループが実行されます。制御ロジック内の関連するコマンドは次のとおりです。

LOOP ...
  ...
ENDLOOP.

これらの制御コマンドを、同じ名称の ABAP 命令と混同しないでください。LOOP ENDLOOP 間では、FIELDMODULESELECTVALUES 、および 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 ではオプション INTOCURSOR 、および 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_PAGEPREV_PAGEPREV_LINENEXT_LINENEXT_PAGELAST_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 が読み込まれます。  

 

 

コンテンツフレーム終了