繰り返し処理
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命令をとおり、ループを抜け、処理完了