セクション 4 / 11

制御構文

条件分岐とループの書き方、CASE文とCHECK文、ループ制御の命令、そして例外処理との関係を解説します。

目次を開く

ABAPの制御構文は、他の言語と大きくは変わりません。ただし、業務処理でよく使われる独特の命令(CHECK、EXIT)があり、これらの挙動を正確に理解しておく必要があります。

条件分岐:IF文

IF文の基本形
IF lv_amount > 10000.
  lv_discount = 10.
ELSEIF lv_amount > 5000.
  lv_discount = 5.
ELSE.
  lv_discount = 0.
ENDIF.

" 複合条件
IF lv_status = 'A' AND lv_amount > 0.
  " 処理
ENDIF.

" 初期値の判定
IF lv_matnr IS INITIAL.
  " 未設定の場合
ENDIF.

" 内部テーブルが空かどうか
IF lt_items IS NOT INITIAL.
  " データがある場合
ENDIF.
比較演算子
演算子別記法意味
=EQ等しい
<>NE等しくない
<LT未満
>GTより大きい
<=LE以下
>=GE以上
BETWEEN a AND b範囲内
IS INITIAL初期値である
INレンジテーブルに含まれる
CS文字列を含む(Contains String)
CPパターンに一致(Contains Pattern)

条件分岐:CASE文

CASE文
CASE lv_status.
  WHEN 'A'.
    lv_text = '受付済'.
  WHEN 'B' OR 'C'.
    lv_text = '処理中'.
  WHEN 'Z'.
    lv_text = '完了'.
  WHEN OTHERS.
    lv_text = '不明'.
ENDCASE.

同じ変数を複数の値と比較する場合は、IF-ELSEIFを連ねるよりCASE文のほうが読みやすくなります。WHEN OTHERSは必ず書いておくと、想定外の値が来たときに気づけます。

ループ:DO文とWHILE文

回数指定と条件指定のループ
" 回数を指定
DO 10 TIMES.
  WRITE: / sy-index.   " sy-index に回数が入る
ENDDO.

" 無限ループ(EXITで抜ける)
DO.
  IF lv_count > 100.
    EXIT.
  ENDIF.
  lv_count = lv_count + 1.
ENDDO.

" 条件が真の間繰り返す
WHILE lv_flag = abap_true.
  " 処理
ENDWHILE.

DOループの中では、システム変数sy-indexに現在の繰り返し回数(1から始まる)が入ります。ネストしたループでは、内側のループのsy-indexが優先されるため、外側の回数を保持したい場合は別の変数に退避します。

ループ:LOOP文

内部テーブルのループ
" 作業領域へコピー
LOOP AT lt_items INTO DATA(ls_item).
  WRITE: / ls_item-matnr, ls_item-menge.
ENDLOOP.

" フィールドシンボルで参照(高速・変更可能)
LOOP AT lt_items ASSIGNING FIELD-SYMBOL(<fs_item>).
  <fs_item>-menge = <fs_item>-menge * 2.
ENDLOOP.

" 条件付きループ
LOOP AT lt_items INTO ls_item WHERE menge > 100.
  " 条件に合う行だけ処理
ENDLOOP.

ループ制御の命令

ループを制御する命令
命令挙動
EXITループを完全に抜ける
CONTINUE現在の繰り返しを中断し、次の繰り返しへ
CHECK 条件条件が偽なら、CONTINUEと同じ動作
CHECK文の挙動
LOOP AT lt_items INTO ls_item.
  CHECK ls_item-menge > 0.   " 0以下ならスキップ
  " ここから先は menge > 0 の行だけ実行される
  lv_total = lv_total + ls_item-menge.
ENDLOOP.

システムフィールド

ABAPには、実行状態を保持するシステムフィールドがあります。制御構文と組み合わせて頻繁に使われます。

フィールド内容
sy-subrc直前の処理の結果コード。0が成功
sy-indexDO/WHILEの繰り返し回数
sy-tabixLOOP中の現在行のインデックス
sy-datum現在の日付
sy-uzeit現在の時刻
sy-unameログインユーザー名
sy-mandtクライアント番号
sy-languログイン言語

📖 わからない用語は SAP用語辞典 で調べられます。

理解度チェック

このセクションの内容を確認しましょう。

確認問題 1

ABAPで変数が初期値かどうかを判定する式はどれか。

確認問題 2

LOOP AT命令は内部テーブルの各行を順に処理するための制御構文である。

確認問題 3

ABAPのループ処理で、現在の繰り返しを中断して次の繰り返しに進む命令はどれか。

確認問題 4

ABAPで「等しくない」ことを表す比較演算子はどれか。

確認問題 5

DO〜ENDDO命令は条件が真の間繰り返す制御構文である。

確認問題 6

複数の固定値と比較して処理を分岐する場合に適した制御構文はどれか。