繰り返し処理

20.1 繰り返し処理

1. 繰り返し処理

ABAPのループ処理の代表は「LOOP」です。
またそれ以外の繰り返し処理についても解説いたします。

  • DOループ命令
  • WHILEループ命令
  • LOOP命令
  • 強制終了命令

DOループ命令

DOループ命令は、強制終了命令が発行されるまでDO~ENDDO内の処理を繰り返し行います。強制終了命令を発行しない場合は、無限ループ状態となりますので注意が必要です。
ここでは、以下DO ループ命令を紹介します。

  • 回数を指定しないループ
  • 回数を指定するループ

回数を指定しないループ

上記でも説明しましたが、強制終了命令を発行しない場合は、無限ループ状態となりますので注意が必要です。

サンプルコード

回数を指定しないループ

REPORT Z_SAMPLE_S12_309 NO STANDARD PAGE HEADING.

*&---------------------------------------------------------------------*
* TYPES宣言
*&---------------------------------------------------------------------*
* 構造データ型
  TYPES:
    BEGIN OF TYP_ST,
      NAME  TYPE C LENGTH 10,
      CODE  TYPE C LENGTH 10,
      VALUE TYPE C LENGTH 10,
    END   OF TYP_ST.

* テーブルデータ型
  TYPES TYP_T TYPE STANDARD TABLE OF TYP_ST.
*&---------------------------------------------------------------------*
* DATA宣言
*&---------------------------------------------------------------------*
*変数
DATA WK_IT_CNT TYPE I.
* 構造(通称:作業領域)
DATA ST_TEST TYPE TYP_ST.
* 内部テーブル
DATA IT_TEST TYPE STANDARD TABLE OF TYP_ST.

START-OF-SELECTION.
*①DO~ENDDO命令

ST_TEST-NAME = 'りんご'.
ST_TEST-CODE = '0001'.
ST_TEST-VALUE = '100'.

DO.

  APPEND ST_TEST TO IT_TEST.

  WK_IT_CNT = WK_IT_CNT + 1.

*強制終了命令
  IF WK_IT_CNT = 5.
    EXIT.
  ENDIF.

ENDDO. 

END-OF-SELECTION.

結果

デバック画面にて、繰り返し処理がされていることが確認できる。

補足(WK_IT_CNTについて)

サンプルのDOループのカウンターとして、WK_IT_CNTが使っていますが、
変数宣言時(その後も)特に、初期値を指定してません。

サンプルのような使い方をすると
ABAPでは、数値項目で宣言をしたら、初期値として\”0\”がセットされます。

13章のTYPES命令の「事前定義済みデータ型」の表の初期値欄を参照してください。

回数を指定するループ

回数を指定するDOループは、次の通りです。指定した回数(n)分だけDO~ENDDO内の処理を繰り返し行います。

サンプルコード

回数を指定するループ

REPORT Z_SAMPLE_S12_309 NO STANDARD PAGE HEADING.

*&---------------------------------------------------------------------*
* TYPES宣言
*&---------------------------------------------------------------------*
* 構造データ型
  TYPES:
    BEGIN OF TYP_ST,
      NAME  TYPE C LENGTH 10,
      CODE  TYPE C LENGTH 10,
      VALUE TYPE C LENGTH 10,
    END   OF TYP_ST.

* テーブルデータ型
  TYPES TYP_T TYPE STANDARD TABLE OF TYP_ST.
*&---------------------------------------------------------------------*
* DATA宣言
*&---------------------------------------------------------------------*
*変数
DATA WK_IT_CNT TYPE I.
* 構造(通称:作業領域)
DATA ST_TEST TYPE TYP_ST.
* 内部テーブル
DATA IT_TEST TYPE STANDARD TABLE OF TYP_ST.

START-OF-SELECTION.

ST_TEST-NAME = 'りんご'.
ST_TEST-CODE = '0001'.
ST_TEST-VALUE = '100'.

DO 3 TIMES.

  APPEND ST_TEST TO IT_TEST.

ENDDO.
END-OF-SELECTION.

結果

下記のようにDO 3 TIME のため3回繰り返し処理を行っているため3行データが格納されている。

WHILEループ命令

WHILEループ命令は、条件が真の間、WHILE~ENDWHILE内の処理を繰り返し行います。
なお、強制終了命令を使用した場合は、条件に関わらずループパスが終了します。

WHILEループ命令

WHILEループ命令の構文は、以下となります。

条件式には「SY-INDEX > 10」のような限定的に成り立つ条件を指定しないと、無限ループに陥ります。

サンプルコード

WHILEループ命令

REPORT Z_SAMPLE_S12_309 NO STANDARD PAGE HEADING.
*&---------------------------------------------------------------------*
* 構造データ型
  TYPES:
    BEGIN OF TYP_ST,
      NAME  TYPE C LENGTH 10,
      CODE  TYPE C LENGTH 10,
      VALUE TYPE C LENGTH 10,
    END   OF TYP_ST.

* テーブルデータ型
  TYPES TYP_T TYPE STANDARD TABLE OF TYP_ST.
*&---------------------------------------------------------------------*
* DATA宣言
*&---------------------------------------------------------------------*
* 変数
  DATA WK_IT_CNT TYPE I.  "内部テーブル件数 
* 構造(通称:作業領域)
  DATA ST_TEST TYPE TYP_ST.
* 内部テーブル
*  DATA IT_TEST TYPE TY_T.
  DATA IT_TEST TYPE STANDARD TABLE OF TYP_ST.
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
  START-OF-SELECTION. 
*&---------------------------------------------------------------------*
* WHILE~ENDWHILE命令
*&---------------------------------------------------------------------*
*   構造(ST_TEST)にデータを設定
    ST_TEST-NAME  = 'りんご'.
    ST_TEST-CODE  = '0001'.
    ST_TEST-VALUE = '100'.

*   WHILE命令で内部テーブル(IT_TEST)に構造(ST_TEST)を指定条件内で繰り返し格納する。
    WHILE WK_IT_CNT < 4.

      APPEND ST_TEST TO IT_TEST.

*     内部テーブルの件数をカウント
      WK_IT_CNT = WK_IT_CNT + 1.
*
    ENDWHILE.
*   結果→デバッグにて確認
    BREAK-POINT.
  END-OF-SELECTION.

結果

下記のように条件式が「WK_IT_CNT < 4 」のため4回繰り返し処理を行っているため4行データが格納されている。

LOOP命令

LOOP命令は、「同じ処理の繰り返し」を行い、
内部テーブルから「特定のデータを抽出して処理を行う場合」に利用されます。

LOOP命令①

LOOP命令の構文は、以下となります。

<ポイント>
① LOOP処理を行う内部テーブルを指定すること
② LOOP処理で対象となるレコードを格納する構造を指定すること

LOOP命令②

LOOPでは、内部テーブル を 1行1行処理 を していきます。
このとき、留意する必要があるのが、LOOP ATでは指定した内部テーブルを直接処理するのではなく、一時的に別の構造に対象の行を格納して処理を進める、という点です。
以下のようなイメージです。

内部テーブルの1行1行を別の構造に格納して処理を進める

したがって、LOOP~ENDLOOPには、①対象の内部テーブルと②作業エリア(構造)の指定が必要となるのです。

サンプルコード

LOOP命令(条件指定なし)

REPORT Z_SAMPLE_S12_309 NO STANDARD PAGE HEADING.
*&---------------------------------------------------------------------*
* 構造データ型
  TYPES:
    BEGIN OF TYP_ST,
      NAME  TYPE C LENGTH 10,
      CODE  TYPE C LENGTH 10,
      VALUE TYPE C LENGTH 10,
    END   OF TYP_ST.

* テーブルデータ型
  TYPES TYP_T TYPE STANDARD TABLE OF TYP_ST.

*&---------------------------------------------------------------------*
* DATA宣言
*&---------------------------------------------------------------------*
* 変数
  DATA WK_IT_CNT TYPE I.  "内部テーブル件数 

* 構造(通称:作業領域)
  DATA ST_TEST TYPE TYP_ST.
* 内部テーブル
*  DATA IT_TEST TYPE TY_T.
  DATA IT_TEST TYPE STANDARD TABLE OF TYP_ST.
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
  START-OF-SELECTION. 
*&---------------------------------------------------------------------*
* ④LOOP~ENDLOOP命令(条件指定なし)
*&---------------------------------------------------------------------*
*   構造(ST_TEST)にデータを設定(1件目)
    ST_TEST-NAME  = 'りんご'.
    ST_TEST-CODE  = '0001'.
    ST_TEST-VALUE = '100'.

*   内部テーブル(IT_TEST)に追加(1件目)
    APPEND ST_TEST TO IT_TEST.

*   構造に別のデータを入れるために、一度初期化
    CLEAR ST_TEST.

*   構造(ST_TEST)にデータを設定(2件目)
    ST_TEST-NAME  = CNS_FRUIT.
    ST_TEST-CODE  = '0002'.
    ST_TEST-VALUE = '30'.

*   内部テーブル(IT_TEST)に追加(2件目)
    APPEND ST_TEST TO IT_TEST.

*   構造に別のデータを入れるために、一度初期化
    CLEAR ST_TEST.

*   構造(ST_TEST)にデータを設定(3件目)
    ST_TEST-NAME  = 'イチゴ'.
    ST_TEST-CODE  = '0003'.
    ST_TEST-VALUE = '80'.

*   内部テーブル(IT_TEST)に追加(3件目)
    APPEND ST_TEST TO IT_TEST.

*   内部テーブルの結果を出力
*   LOOP開始前に一度構造(ST_TEST)を初期化
    CLEAR ST_TEST.

    LOOP AT IT_TEST INTO ST_TEST.
**    現在の行が2行だった場合
      IF SY-TABIX = 2.
*       LOOP自体を終了する(3件目の処理に行かない)
        EXIT.
      ENDIF.

      WRITE /
            ST_TEST.

*     次のLOOP開始前に一度構造(ST_TEST)を初期化
      CLEAR ST_TEST.
*
    ENDLOOP.
END-OF-SELECTION.

結果

補足(SY-TABIXについて)

システム項目の一つで「現在ループしているテーブルの対象行」が格納されます。
LOOP文を使用するとSY-TABIX にテーブルの対象行が格納されると覚えておきましょう。

LOOP命令③

LOOP命令では、WHEREオプションを用いて処理の対象としたいレコードを特定することが可能です。

サンプルコード

LOOP命令(条件指定あり)

REPORT Z_SAMPLE_S12 NO STANDARD PAGE HEADING

*&---------------------------------------------------------------------*
* TYPES宣言
*&---------------------------------------------------------------------*
* 構造データ型
  TYPES:
    BEGIN OF TYP_ST,
      NAME  TYPE C LENGTH 10,
      CODE  TYPE C LENGTH 10,
      VALUE TYPE C LENGTH 10,
    END   OF TYP_ST.

* テーブルデータ型
  TYPES TYP_T TYPE STANDARD TABLE OF TYP_ST.

*&---------------------------------------------------------------------*
* DATA宣言
*&---------------------------------------------------------------------*
* 変数
  DATA WK_IT_CNT TYPE I.  "内部テーブル件数
  DATA WK_DATE   TYPE D.
  DATA WK_TIME   TYPE T.

* 構造(通称:作業領域)
  DATA ST_TEST TYPE TYP_ST.

* 内部テーブル
*  DATA IT_TEST TYPE TY_T.
  DATA IT_TEST TYPE STANDARD TABLE OF TYP_ST.

*&---------------------------------------------------------------------*
* CONSTANTS宣言
*&---------------------------------------------------------------------*
  CONSTANTS CNS_FRUIT TYPE C LENGTH 6 VALUE 'みかん'.





*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
  START-OF-SELECTION.

*&---------------------------------------------------------------------*
* ⑤LOOP~ENDLOOP命令(条件指定あり)
*&---------------------------------------------------------------------*
*   構造(ST_TEST)にデータを設定(1件目)
    ST_TEST-NAME  = 'りんご'.
    ST_TEST-CODE  = '0001'.
    ST_TEST-VALUE = '100'.

*   内部テーブル(IT_TEST)に追加(1件目)
    APPEND ST_TEST TO IT_TEST.

*   構造に別のデータを入れるために、一度初期化
    CLEAR ST_TEST.

*   構造(ST_TEST)にデータを設定(2件目)
    ST_TEST-NAME  = CNS_FRUIT.
    ST_TEST-CODE  = '0002'.
    ST_TEST-VALUE = '30'.

*   内部テーブル(IT_TEST)に追加(2件目)
    APPEND ST_TEST TO IT_TEST.

*   構造に別のデータを入れるために、一度初期化
    CLEAR ST_TEST.

*   構造(ST_TEST)にデータを設定(3件目)
    ST_TEST-NAME  = 'イチゴ'.
    ST_TEST-CODE  = '0003'.
    ST_TEST-VALUE = '80'.

*   内部テーブル(IT_TEST)に追加(3件目)
    APPEND ST_TEST TO IT_TEST.

*   構造に別のデータを入れるために、一度初期化
    CLEAR ST_TEST.

*   構造(ST_TEST)にデータを設定(4件目)
    ST_TEST-NAME  = CNS_FRUIT.
    ST_TEST-CODE  = '0002'.
    ST_TEST-VALUE = '31'.

*   内部テーブル(IT_TEST)に追加(4件目)
    APPEND ST_TEST TO IT_TEST.

*   内部テーブルの結果を出力
*   LOOP開始前に一度構造(ST_TEST)を初期化
    CLEAR ST_TEST.






*   今回はみかんだけ出力させる

    WRITE: '商品名',
           '商品コード',
           '値段'.

    LOOP AT IT_TEST INTO ST_TEST WHERE NAME = CNS_FRUIT.

      WRITE /
        ST_TEST.

*     次のLOOP開始前に一度構造(ST_TEST)を初期化
      CLEAR ST_TEST.

    ENDLOOP.

  END-OF-SELECTION.

結果

強制終了命令

単一ループパスを終了したり、ループ全体を終了したりする場合は、強制終了命令を使用します。

  • CHECK命令
  • CONTINUE命令
  • EXIT命令

CHECK命令

CHECK命令は、一般的にはある条件を満たさない場合にループ処理を抜ける命令です。
ループの外でCHECK命令を行った場合には、現在の処理ブロックを終了します。

基本的にCHECK命令は、ループ命令で使用します。
条件式が正の場合のみ次の命令に遷移させる、文字通りのチェック用命令です。
偽の場合は、イベントブロック・モジュール・関数の処理を抜けます。

使いどころとしては、FOR ALL ENTRIES命令を使用する前処理にて、取得した内部テーブルが空でないことを確認する際に使用します。

※空でないことを確認する理由:指定する内部テーブルが空っぽの場合、すべてのデータを取得してしまうため注意が必要だ。

サンプルコード

FOR ALL ENTRIES 命令を使用した際のCHECK命令のサンプルコードです。

CHECK命令(内部テーブルが空ではない状態)

REPORT Z_SAMPLE_S10 NO STANDARD PAGE HEADING
                    MESSAGE-ID ZTEST2021.

*&---------------------------------------------------------------------*
* TYPES宣言
*&---------------------------------------------------------------------*
* 構造データ型
  TYPES:
    BEGIN OF TYP_BKPF_TRY,   "会計伝票ヘッダ取得用
      BUKRS TYPE BUKRS,      "会社コード
      BELNR TYPE BELNR_D,    "会計伝票番号
      GJAHR TYPE GJAHR,      "会計年度
      CPUDT TYPE CPUDT,      "会計伝票登録日付
    END   OF TYP_BKPF_TRY,

    BEGIN OF TYP_BSEG_TRY,   "会計伝票明細取得用
      BUKRS TYPE BUKRS,      "会社コード
      BELNR TYPE BELNR_D,    "会計伝票番号
      GJAHR TYPE GJAHR,      "会計年度
      BUZEI TYPE BUZEI,      "会計伝票内の明細番号
    END   OF TYP_BSEG_TRY,

    BEGIN OF TYP_JOIN,       "内部結合確認用
      BUKRS TYPE BKPF-BUKRS, "会社コード
      BELNR TYPE BKPF-BELNR, "会計伝票番号
      GJAHR TYPE BKPF-GJAHR, "会計年度
      CPUDT TYPE BKPF-CPUDT, "会計伝票登録日付
      BUZEI TYPE BSIS-BUZEI, "会計伝票内の明細番号
    END   OF TYP_JOIN.

* テーブルデータ型
  TYPES: TYP_T_BKPF_TRY TYPE STANDARD TABLE OF TYP_BKPF_TRY,
         TYP_T_BSEG_TRY TYPE STANDARD TABLE OF TYP_BSEG_TRY,
         TYP_T_JOIN     TYPE STANDARD TABLE OF TYP_JOIN.

*&---------------------------------------------------------------------*
* DATA宣言
*&---------------------------------------------------------------------*
* 構造(通称:作業領域)
  DATA:
    ST_BSEG_TRY TYPE TYP_BSEG_TRY,
    ST_JOIN     TYPE TYP_JOIN,

* 内部テーブル
  DATA:
    IT_BKPF_TRY TYPE TYP_T_BKPF_TRY,
    IT_BSEG_TRY TYPE TYP_T_BSEG_TRY,
    IT_JOIN     TYPE TYP_T_JOIN.



*&---------------------------------------------------------------------*
* CONSTANTS宣言
*&---------------------------------------------------------------------*
  CONSTANTS CNS_FCY TYPE GJAHR VALUE '2021'.

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
  START-OF-SELECTION.

*&---------------------------------------------------------------------*
* ①FOR ALL ENTRIES IN(データ取得時に、内部テーブルの値を取得条件に設定)
*&---------------------------------------------------------------------*
*★本処理の目的→会計伝票ヘッダ(BKPF)に紐づく会計伝票明細(BSEG)を取得する★
*   まずは前提となる会計伝票ヘッダを取得
    SELECT BUKRS  "会社コード
           BELNR  "会計伝票番号
           GJAHR  "会計年度
           CPUDT  "会計伝票登録日付
      FROM BKPF
      INTO TABLE IT_BKPF_TRY
*     WHERE BUKRS = '1000'    "会社コード
     WHERE BUKRS BETWEEN '1000' AND '2000'   "会社コード
*       AND BELNR BETWEEN '0100000000' AND '0100000005'
       AND BELNR BETWEEN '0100000000' AND '9000000000'
       AND GJAHR = CNS_FCY.  "会計年度

* FOR ALL ENTRIESを使うときは、前提条件の内部テーブルが空白でないことを必ず確認する。
    CHECK IT_BKPF_TRY IS NOT INITIAL.  "←BKPFからデータが取れていない場合、処理をやめる命令
    IF IT_BKPF_TRY IS NOT INITIAL “左記でも同様の処理が可能
       RETURN.
    END

* SY-SUBRCというシステム変数は、処理成功の場合「0」、処理失敗の場合「0」以外が自動で設定される
    IF SY-SUBRC <> 0.
*     エラーとして処理を抜ける
      RETURN.
    ENDIF.

*   本題の会計伝票明細を取得
    SELECT BUKRS  "会社コード
           BELNR  "会計伝票番号
           GJAHR  "会計年度
           BUZEI  "会計伝票内の明細番号
      FROM BSEG
      INTO TABLE IT_BSEG_TRY
       FOR ALL ENTRIES IN IT_BKPF_TRY  "ここでFOR ALL ENTRIES を使用
     WHERE BUKRS = IT_BKPF_TRY-BUKRS   "会社コード
       AND BELNR = IT_BKPF_TRY-BELNR   "会計伝票番号
       AND GJAHR = IT_BKPF_TRY-GJAHR.  "会計年度



* ソート命令で伝票番号を降順に並べ替え
  SORT IT_BKPF_TRY BY BELNR DESCENDING.

*   結果→デバッグにて確認
    BREAK-POINT.

結果

FOR ALL ENTRIES で取得する条件となる内部テーブルにデータが格納されていることが確認できます。

取得した内部テーブルのデータとDBテーブル「BSEG」を元にWHERE句の条件に合致するデータを抽出出来ていることが確認できます。

サンプルコード

内部テーブルが空の状態の場合は、CHECK命令にて処理が終了します。

CHECK命令(内部テーブルが空の状態)

REPORT Z_SAMPLE_S10 NO STANDARD PAGE HEADING
                    MESSAGE-ID ZTEST2021.

*&---------------------------------------------------------------------*
* TYPES宣言
*&---------------------------------------------------------------------*
* 構造データ型
  TYPES:
    BEGIN OF TYP_BKPF_TRY,   "会計伝票ヘッダ取得用
      BUKRS TYPE BUKRS,      "会社コード
      BELNR TYPE BELNR_D,    "会計伝票番号
      GJAHR TYPE GJAHR,      "会計年度
      CPUDT TYPE CPUDT,      "会計伝票登録日付
    END   OF TYP_BKPF_TRY,

    BEGIN OF TYP_BSEG_TRY,   "会計伝票明細取得用
      BUKRS TYPE BUKRS,      "会社コード
      BELNR TYPE BELNR_D,    "会計伝票番号
      GJAHR TYPE GJAHR,      "会計年度
      BUZEI TYPE BUZEI,      "会計伝票内の明細番号
    END   OF TYP_BSEG_TRY,

    BEGIN OF TYP_JOIN,       "内部結合確認用
      BUKRS TYPE BKPF-BUKRS, "会社コード
      BELNR TYPE BKPF-BELNR, "会計伝票番号
      GJAHR TYPE BKPF-GJAHR, "会計年度
      CPUDT TYPE BKPF-CPUDT, "会計伝票登録日付
      BUZEI TYPE BSIS-BUZEI, "会計伝票内の明細番号
    END   OF TYP_JOIN.

* テーブルデータ型
  TYPES: TYP_T_BKPF_TRY TYPE STANDARD TABLE OF TYP_BKPF_TRY,
         TYP_T_BSEG_TRY TYPE STANDARD TABLE OF TYP_BSEG_TRY,
         TYP_T_JOIN     TYPE STANDARD TABLE OF TYP_JOIN.

*&---------------------------------------------------------------------*
* DATA宣言
*&---------------------------------------------------------------------*
* 構造(通称:作業領域)
  DATA:
    ST_BSEG_TRY TYPE TYP_BSEG_TRY,
    ST_JOIN     TYPE TYP_JOIN,








* 内部テーブル
  DATA:
    IT_BKPF_TRY TYPE TYP_T_BKPF_TRY,
    IT_BSEG_TRY TYPE TYP_T_BSEG_TRY,
    IT_JOIN     TYPE TYP_T_JOIN.

*&---------------------------------------------------------------------*
* CONSTANTS宣言
*&---------------------------------------------------------------------*
  CONSTANTS CNS_FCY TYPE GJAHR VALUE '2021'.

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
  START-OF-SELECTION.

*&---------------------------------------------------------------------*
* ①FOR ALL ENTRIES IN(データ取得時に、内部テーブルの値を取得条件に設定)
*&---------------------------------------------------------------------*
*★本処理の目的→会計伝票ヘッダ(BKPF)に紐づく会計伝票明細(BSEG)を取得する★
*   まずは前提となる会計伝票ヘッダを取得
    SELECT BUKRS  "会社コード
           BELNR  "会計伝票番号
           GJAHR  "会計年度
           CPUDT  "会計伝票登録日付
      FROM BKPF
      INTO TABLE IT_BKPF_TRY
      WHERE BUKRS = '9999'    "会社コード
        AND GJAHR = CNS_FCY.  "会計年度

* FOR ALL ENTRIESを使うときは、前提条件の内部テーブルが空白でないことを必ず確認する。
    CHECK IT_BKPF_TRY IS NOT INITIAL.  "←BKPFからデータが取れていない場合、処理をやめる命令
    IF IT_BKPF_TRY IS NOT INITIAL “左記でも同様の処理が可能
       RETURN.
    END






















* SY-SUBRCというシステム変数は、処理成功の場合「0」、処理失敗の場合「0」以外が自動で設定される
    IF SY-SUBRC <> 0.
*     エラーとして処理を抜ける
      RETURN.
    ENDIF.

*   本題の会計伝票明細を取得
    SELECT BUKRS  "会社コード
           BELNR  "会計伝票番号
           GJAHR  "会計年度
           BUZEI  "会計伝票内の明細番号
      FROM BSEG
      INTO TABLE IT_BSEG_TRY
       FOR ALL ENTRIES IN IT_BKPF_TRY  "ここでFOR ALL ENTRIES を使用
     WHERE BUKRS = IT_BKPF_TRY-BUKRS   "会社コード
       AND BELNR = IT_BKPF_TRY-BELNR   "会計伝票番号
       AND GJAHR = IT_BKPF_TRY-GJAHR.  "会計年度

* ソート命令で伝票番号を降順に並べ替え
  SORT IT_BKPF_TRY BY BELNR DESCENDING.

*   結果→デバッグにて確認
    BREAK-POINT.

結果

空の状態のため、CHECK命令で処理が終了します。

CONTINUE命令

CONTINUE命令を記述すると、ループ処理を無条件に終了します。

※CONTINUE命令は、ループ内でしか使えません。

サンプルコード

CONTINUE命令

REPORT Z_SAMPLE_KANDA NO STANDARD PAGE HEADING.
*&---------------------------------------------------------------------*
* TYPES宣言
*&---------------------------------------------------------------------*
* 構造データ型
  TYPES:
    BEGIN OF TYP_ST,
      NAME  TYPE C LENGTH 10,
      CODE  TYPE C LENGTH 10,
      VALUE TYPE C LENGTH 10,
    END   OF TYP_ST.

* テーブルデータ型
  TYPES TYP_T TYPE STANDARD TABLE OF TYP_ST.

*&---------------------------------------------------------------------*
* DATA宣言
*&---------------------------------------------------------------------*
* 変数
  DATA WK_IT_CNT TYPE I.  "内部テーブル件数

* 構造(通称:作業領域)
  DATA ST_TEST TYPE TYP_ST.

* 内部テーブル
*  DATA IT_TEST TYPE TY_T.
  DATA IT_TEST TYPE STANDARD TABLE OF TYP_ST.

*&---------------------------------------------------------------------*
* CONSTANTS宣言
*&---------------------------------------------------------------------*
  CONSTANTS CNS_FRUIT TYPE C LENGTH 6 VALUE 'みかん'.

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
  START-OF-SELECTION.

*   構造(ST_TEST)にデータを設定(1件目)
    ST_TEST-NAME  = 'りんご'.
    ST_TEST-CODE  = '0001'.
    ST_TEST-VALUE = '100'.

*   内部テーブル(IT_TEST)に追加(1件目)
    APPEND ST_TEST TO IT_TEST.

*   構造に別のデータを入れるために、一度初期化
    CLEAR ST_TEST.

*   構造(ST_TEST)にデータを設定(2件目)
    ST_TEST-NAME  = CNS_FRUIT.
    ST_TEST-CODE  = '0002'.
    ST_TEST-VALUE = '30'.

*   内部テーブル(IT_TEST)に追加(2件目)
    APPEND ST_TEST TO IT_TEST.

*   構造に別のデータを入れるために、一度初期化
    CLEAR ST_TEST.

*   構造(ST_TEST)にデータを設定(3件目)
    ST_TEST-NAME  = 'イチゴ'.
    ST_TEST-CODE  = '0003'.
    ST_TEST-VALUE = '80'.

*   内部テーブル(IT_TEST)に追加(3件目)
    APPEND ST_TEST TO IT_TEST.

*   内部テーブルの結果を出力
*   LOOP開始前に一度構造(ST_TEST)を初期化
    CLEAR ST_TEST.

    LOOP AT IT_TEST INTO ST_TEST.

      IF SY-TABIX = 2.
*       LOOP自体は続行、LOOPパスは抜ける(3件目の処理に行く)
        CONTINUE.
      ENDIF.

      WRITE /
            ST_TEST.

*     次のLOOP開始前に一度構造(ST_TEST)を初期化
      CLEAR ST_TEST.

    ENDLOOP.

結果

内部テーブル「IT_TEST」の1行目のため次のループへ

内部テーブル「IT_TEST」の2行目のIF文の条件に合致するため後続処理は行わず
次のループへ

内部テーブル「IT_TEST」の3行目の処理を行う。内部テーブル「IT_TEST」には3レコードだけのためループを抜け、処理完了

出力結果

EXIT命令

EXIT命令を記述すると、CONTINE命令同様 ループ処理を無条件に終了します。

※EXIT命令は、ループの処理の外に記述することが可能です。

ループの処理の外に記載した場合は、処理ブロックを終了する処理を行います。

サンプルコード

EXIT命令

	REPORT Z_SAMPLE_KANDA NO STANDARD PAGE HEADING.
*&---------------------------------------------------------------------*
* TYPES宣言
*&---------------------------------------------------------------------*
* 構造データ型
  TYPES:
    BEGIN OF TYP_ST,
      NAME  TYPE C LENGTH 10,
      CODE  TYPE C LENGTH 10,
      VALUE TYPE C LENGTH 10,
    END   OF TYP_ST.

* テーブルデータ型
  TYPES TYP_T TYPE STANDARD TABLE OF TYP_ST.

*&---------------------------------------------------------------------*
* DATA宣言
*&---------------------------------------------------------------------*
* 変数
  DATA WK_IT_CNT TYPE I.  "内部テーブル件数

* 構造(通称:作業領域)
  DATA ST_TEST TYPE TYP_ST.

* 内部テーブル
*  DATA IT_TEST TYPE TY_T.
  DATA IT_TEST TYPE STANDARD TABLE OF TYP_ST.

*&---------------------------------------------------------------------*
* CONSTANTS宣言
*&---------------------------------------------------------------------*
  CONSTANTS CNS_FRUIT TYPE C LENGTH 6 VALUE 'みかん'.

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
  START-OF-SELECTION.
	
	*   構造(ST_TEST)にデータを設定(1件目)
    ST_TEST-NAME  = 'りんご'.
    ST_TEST-CODE  = '0001'.
    ST_TEST-VALUE = '100'.

*   内部テーブル(IT_TEST)に追加(1件目)
    APPEND ST_TEST TO IT_TEST.

*   構造に別のデータを入れるために、一度初期化
    CLEAR ST_TEST.

*   構造(ST_TEST)にデータを設定(2件目)
    ST_TEST-NAME  = CNS_FRUIT.
    ST_TEST-CODE  = '0002'.
    ST_TEST-VALUE = '30'.

*   内部テーブル(IT_TEST)に追加(2件目)
    APPEND ST_TEST TO IT_TEST.

*   構造に別のデータを入れるために、一度初期化
    CLEAR ST_TEST.

*   構造(ST_TEST)にデータを設定(3件目)
    ST_TEST-NAME  = 'イチゴ'.
    ST_TEST-CODE  = '0003'.
    ST_TEST-VALUE = '80'.

*   内部テーブル(IT_TEST)に追加(3件目)
    APPEND ST_TEST TO IT_TEST.

*   内部テーブルの結果を出力
*   LOOP開始前に一度構造(ST_TEST)を初期化
    CLEAR ST_TEST.

    LOOP AT IT_TEST INTO ST_TEST.

      IF SY-TABIX = 2.
*       LOOP自体を終了する(3件目の処理に行かない)
        EXIT.
      ENDIF.

      WRITE /
            ST_TEST.

*     次のLOOP開始前に一度構造(ST_TEST)を初期化
      CLEAR ST_TEST.

    ENDLOOP.

結果

内部テーブル「IT_TEST」の1行目のため次のループへ

内部テーブル「IT_TEST」の2行目になりIF文の条件に合致するため
EXIT命令をとおり、ループを抜け、処理完了

出力結果


NEXT>> 20.2 日付と時刻の計算(SY)