Implementing Loops

Objective

After completing this lesson, you will be able to ループの実装

ループの実装

キーワード DO、ENDDO、LOOP、ENDLOOP を使用して、ループを定義することができます。

ABAP のループは、複数回実行されるコードのブロックで定義されます。

最も単純な形式のループは、DO - ENDDO 命令で囲まれたコードブロックで構成されます。追加の手段がないと、これらの命令によって無限ループが確立される可能性があります。これは、以下のいずれかの方法で回避する必要があります。

指定されたループ数
整数式とそれに続くキーワード TIMES で DO 命令を拡張することで、コードブロックが処理される頻度を明示的に指定することができます。整数式は数値リテラルと同様に単純にできますが、算術計算も使用できます。式の値が 0 の場合、DO と ENDDO の間のコードブロックはまったく実行されず、プログラムは ENDDO の後のコードで即座に続行されます。
論理条件に基づくアボート
EXIT 命令を使用すると、いつでもループを中止することができます。その後、プログラムは ENDDO の後にコードで続行されます。ループ EXIT の外側には異なる効果があることに注意してください。これにより、現在の処理ブロックの処理 (現在のメソッドなど) が強制終了されます。

通常、EXIT は IF と ENDIF で囲まれて、アボート条件に応じてループを終了します。アボート条件が true ではない場合、このようなループは無限ループに変わる可能性があることに注意してください。

もちろん、2 つの手法を組み合わせることができます。つまり、ループ数を明示的に指定してから、EXIT でループを終了します。したがって、ループ数は、実行時に到達しない可能性がある最大数になります。

DO と ENDDO の間のコードブロックでは、ABAP 組込データオブジェクト SY-INDEX への読込アクセスを実装することができます。この整数変数はループカウンタとして機能します。つまり、ABAP ランタイムでは、新しいループの開始時に変数が 1 つずつ増加します。

ABAP 組込変数 SY-TABIX は、ループにも同様の目的を果たすことができます。ただし、SY-TABIX は実際にはカウンタではありませんが、現在のループで処理されるテーブル行の位置を識別することに注意してください。

DO - ENDDO ループの実装

ビジネスシナリオ

DO の使用ENDDO キーワードを使用すると、指定された数のループでループを作成できます。

ステップ

  1. インタフェース IF_OO_ADT_CLASSRUN を使用して、新規 ABAP クラス ZCL_S4D100_XX_DO_ENDDO を登録します。

    1. ZCL_S4D100_XX_ENDDO という名称の新規 ABAP クラスを登録し、インタフェース IF_OO_ADT_CLASSRUN を追加します。

    2. これをパッケージに割り当て、移送依頼に関連付けます。

  2. アプリケーションを有効化します。

    1. Activate (Ctrl+F3) を押します。

  3. メソッド IF_OO_ADT_CLASSRUN~MAIN で、3 回繰り返し、メッセージを出力する LOOP を定義します。

    1. METHOD IF_OO_ADT_CLASSRUN~MAIN で、以下のコードを実装します。

      Code Snippet
      123456789
      CONSTANTS: c_number0 TYPE i VALUE 3. out->write( '---------------------------------' ). out->write( 'Example 1: DO...ENDDO with TIMES' ). out->write( '---------------------------------' ). DO c_number0 TIMES. out->write( 'Hello World' ). ENDDO.
  4. クラスを有効化してテストします。

    1. Activate (Ctrl+F3) を押します。

    2. F9 を押して、クラスを実行します。

    実践する

DO - ENDDO ループの実装 (アボート条件あり)

ビジネスシナリオ

DO の使用ENDDO キーワードを使用すると、キーワード EXIT を使用してアボート条件でループを作成できます。

注記

この演習問題では、XX は各自の番号を表します。

ステップ

  1. クラス ZCL_S4D100_XX_DO_ENDDO を ZCL_S4D100_XX_EXIT にコピーします。

    1. Project ExplorerCLASS ZCL_S4D100_XX_DO_ENDDO を右クリックし、Duplicate を選択します。

    2. パッケージと名称、および新しいクラス名 ZCL_S4D100_XX_EXIT を入力し、Next を押します。

    3. これを移送依頼に追加し、Finish を押します。

  2. アプリケーションを有効化します。

    1. Activate (Ctrl+F3) を押します。

  3. if_oo_adt_classrun~main のコードを変更して、新しい整数 lv_number0 の値を c_number0 * c_number0 に設定します。DO ループを作成し、ループの反復ごとに lv_number0 から 1 を減算します。lv_number0 が c_number0 と等しい場合、ループを終了します。

    1. 以下のコードを使用して、METHOD IF_OO_ADT_CLASSRUN~MAIN. を実装します。

      Code Snippet
      123456789101112131415
      CONSTANTS: c_number0 TYPE i VALUE 3. DATA: lv_number0 TYPE i. lv_number0 = c_number0 * c_number0. * Count backwards from lv_number0 to c_number0 DO. out->write( |{ sy-index }: Value of lv_number0: { lv_number0 }| ). lv_number0 = lv_number0 - 1. * Abort condition IF lv_number0 <= c_number0. "If 3 = 3 EXIT. ENDIF. ENDDO.
  4. プログラムを有効化して、テストします。

    1. Activate (Ctrl+F3) を押します。

    2. F9 を押して、クラスを実行します。

    実践する