ABAPにおける「IF文」「CASE文」を利用した条件分岐について解説します。
条件分岐はプログラミング言語すべてに共通する基本知識です。このページでIF文/CASE文の使い分けや構文ルールをしっかり押さえ、適切に条件分岐をコーディングできるようにしておきましょう。
ABAPエンジニアを目指す方であれば、知らないと恥ずかしい超・基本知識ですので、是非最後までご覧ください。
条件分岐とは?
条件分岐とは、プログラム中である条件を満たしているかどうかを判定し、満たしている場合/満たしていない場合に応じて処理を変化させることです。
基本的には、「もし○○ならば××せよ」というような書き方で処理の内容を分岐させていきます。
ABAPでは、この条件分岐を「IF~ENDIF」「CASE~ENDCASE」を用いて記述していきます。
IF文(IF~ENDIF):構文ルール
IF(条件式1).
処理1
ELSEIF(条件式2).
処理2
ELSE.
処理3
ENDIF.
IF sy-subrc = 0 WRITE '成功'. ELSEIF sy-subrc = 4. WRITE '失敗'. ELSE. WRITE '判定不能'. ENDIF.
(条件式) の結果がTRUE:真の場合にそれぞれに該当する処理が1つだけ実行されます。
IF命令の後に記載した条件式は上から下へと順次チェックされていきます。つまり、条件式が真(true)になった時点で処理が実行され、その後の条件式は比較・評価が行われないという点に注意しましょう。
どの条件にも合致しない場合は、ELSEの後に記述した処理が実行されます。
注意点としては ”IF” ”ELSEIF” ”ENDIF” の後にそれぞれピリオドが必要であるという点です。初心者の方ほど見落としがちな点ですが、ピリオドのつけ忘れは構文エラーとなりますので注意しましょう。
「IF 〇〇 = ■■」などのように、条件式を定義する際に必要となるのが、ひあっく演算子の使い方。=や<>など、特定の条件を表す演算子の使い方は下記の記事をご覧ください。
サンプルコード:IF文
具体的なイメージを持つために、以下にサンプルコードを載せておきます。
IF sy-subrc = 0 MESSAGE E001(ZAMCM01). ELSEIF sy-subrc = 4. MESSAGE E001(ZAMCM02). ELSE. MESSAGE E001(ZAMCM03). ENDIF.
上記のサンプルコードでは、システム項目「SY-SUBRC」の値に応じて表示するメッセージを変える処理を行っています。
SY-SUBRCが0の場合、4の場合、それ以外の場合の3つに分岐させています。
CASE文(CASE~ENDCASE):構文ルール
CASE(変数).
WHEN(変数 or 値).
処理1
WHEN(変数 or値).
処理2
WHEN OTHERS .
処理3
ENDCASE.
CASE sy-subrc. WHEN 0. WRITE '成功'. WHEN 4. WRITE '失敗'. WHEN OTHERS. WRITE '判定不能'. ENDCASE.
IF文とはことなり、CASEのオペランド部には式ではなく変数などのデータオブジェクトを指定します。また、CASEと最初のWHENの間に処理ロジックを記載することはできません。
WHENのオペランド部にはデータオブジェクトがとりうる値を指定し、データオブジェクトがそこで指定した値に合致する場合に、記載した処理が1つだけ実行されます。
IF文と同様に、上から順に条件に当てはまるかをチェックしていき、条件が合致した場合に当該処理を実行します。その後、再度条件式の評価が行われることはありません。
サンプルコード:CASE文
CASE sy-subrc. WHEN 0. MESSAGE E001(ZAMCM01). WHEN 4. MESSAGE E001(ZAMCM02). WHEN OTHERS. MESSAGE E001(ZAMCM03). ENDCASE.
IF文のサンプルコードと構造はほぼ同じ。
SY-SUBRCが0の場合、4の場合、それ以外の場合の3つに分岐しています。
IF文とCASE文の使い分け
ここまでの解説でお気づきかと思いますが、IF文とCASE文は手段こそ異なりますが、目的は「条件分岐」で一致しています。
IF文かCASE文のどちらかを覚えておけば、ABAPにおける条件分岐の実装は可能です。実際には、一般的なABAPerはCASE文よりもIF文を使って書いている人が多い印象です。そのため、IF文と比較してCASE文を見る頻度は多くありません。
ただし、CASE文を使ったほうが良い場面でIF文を使われると、コードの可読性が下がり改修やバグの調査がしづらくなります。
この章では、IF文とCASE文の使い分けについて解説をしておきます。
処理速度の違い(CASE > IF)
まず、IF文とCASE文は処理速度が違います。
IF文よりもCASE文の方が若干早く処理が行われるようです。
処理速度の改善を行いたい場合には、IF文とCASE文の置き換えも一案になるかもしれません。ただし、SAP公式見解で「若干」という言葉を使っているので、そこまで劇的な改善は見込めないようです。
分岐の数に応じた使い分け
IF文とCASE文は、条件分岐の数に応じて使い分ける必要があります。
例えば、処理ステータスに応じて処理の内容を変える分岐を入れたいとします。
ステータスが「S:成功」「E:失敗」の二つしか存在しえない場合、これはIF文で書くのが良いでしょう。条件が二つしか存在しない場合を「二分岐」と言います。
「TRUE or FALSE」も二分岐です。本来IF文では、この二分岐の制御を行うものに用いるべき命令です。できればELSEIFを使わずに記述したほうが読みやすく、直感的に分かりやすいコードになります。
対してCASE文は、「多分岐」に向いています。
多分岐というのは、TRUE or FALSEの二択ではなく条件が3つ以上あるものをいいます。例えば、ある人の干支や、星座、年齢などでしょうか?
処理ステータスで例えれば、「S:成功」「E:失敗」に加えて、「N:未処理」「X:処理中」があるとします。
この場合、それぞれの処理ステータスに応じて、処理内容を変えたい場合、向いているのは明らかにCASE文です。「S:成功」なら〇〇をする。「E:失敗」なら□□をする。「N:未処理」なら・・・・。
もちろん、IF文でも書くことはできます。が、可読性が悪くなります。条件が4つであればまだよいですが、5個とか6個とか増えていくと実際熟練の開発者でも読みづらくなるコードになってしまうでしょう。
CASE文の方が処理速度も若干早くなるので、多分岐の場合にはできるだけCASE文を用いるようにするのが正解な印象です。
ABAPを1から勉強したい方は
ABAPを1から学習したい方のために、ABAPの基本知識・基礎概念を1つのページにまとめました。本サイトで人気No.1の記事です。
現在、完全無料で公開しておりますので、是非ご覧ください!