ABAPの制御構文は、他の言語と大きくは変わりません。ただし、業務処理でよく使われる独特の命令(CHECK、EXIT)があり、これらの挙動を正確に理解しておく必要があります。
条件分岐: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 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と同じ動作 |
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-index | DO/WHILEの繰り返し回数 |
| sy-tabix | LOOP中の現在行のインデックス |
| sy-datum | 現在の日付 |
| sy-uzeit | 現在の時刻 |
| sy-uname | ログインユーザー名 |
| sy-mandt | クライアント番号 |
| sy-langu | ログイン言語 |