ABAP

【ABAP】IF/CASE―条件分岐の使い分け

「IF文」「CASE文」と呼ばれる条件分岐命令について解説します。

決して難しい概念ではないので、初心者でもパッと使えてしまうかもしれませんが、両者の使い分けや構文ルールをしっかり押さえておくことは重要です。

IF文を使うべきところにCASE文を使ってしまったり、逆にCASE文を使うべきところにIF文を使ってしまったりしているコードもよく見かけます。

間違った使い方をすると、コードがかなりごちゃごちゃしていくので、IF文とCASE文の使い分けについては特に注意して、以下を読んでみてください。

それでは早速解説を始めます。

構文ルール:IF~ENDIF

IF(条件式1).
・・・・
 ELSEIF(条件式2).
  ・・・・
 ELSE.
  ・・・・
ENDIF.

それぞれ「・・・・・」の箇所に処理の内容を記載します。

条件式に合致する場合に「・・・・・」の箇所に記載した処理内容が実行されます。

ポイントは ”IF” ”ELSEIF” ”ENDIF” それぞれにピリオドが必要であることです。ピリオドつけ忘れで構文エラーとなりますので注意しましょう。

尚、IF命令の後に記載した条件式は上から下へと順次チェックされていきます。

どの条件式にも合致しない場合は、ELSEの後に記載した処理内容が実行されます。

サンプルコード:IF文

具体的なイメージを持つために、以下にサンプルコードを載せておきます。

IF sy-subrc = 0
  MESSAGE E001(ZAMCM01).
 ELSE IF sy-subrc = 4.
  MESSAGE E001(ZAMCM02).
 ELSE.
  MESSAGE E001(ZAMCM03).
ENDIF.

構文ルール:CASE~ENDCASE

CASE(データオブジェクト).
 WHEN(データオブジェクトの値).
 ・・・・

 WHEN OTHERS .
 ・・・・
ENDCASE.

IF文とはことなり、CASEのオペランド部には式ではなくデータオブジェクトを設定します。また、CASEと最初のWHENの間に処理ロジックを記載することはできません。

WHENのオペランド部にはデータオブジェクトがとりうる値を指定し、データオブジェクトがそこで指定した値に合致する場合に、「・・・・」で記載した処理が実行されます。

IF文と同様に、上から順に条件に当てはまるかをチェックしていきます。

サンプルコード:CASE文

CASE sy-subrc.
 WHEN 0.
  MESSAGE E001(ZAMCM01).
 WHEN 1.
  MESSAGE E001(ZAMCM02).
 WHEN OTHERS.
  MESSAGE E001(ZAMCM03).
ENDCASE.

IF文とCASE文の使い分け

ここまでの解説でお気づきかと思いますが、IF文とCASE文は手段こそ異なりますが、目的は「条件分岐」で一致しています。

IF文かCASE文のどちらかを覚えておけば、ABAPにおける条件分岐の実装は可能です。

実際、大体のABAPerはCASE文よりもIF文を使って書いている人が多いので、IF文と比較してCASE文を見る頻度は少ないような気がします。

ただし、CASE文を使ったほうが良い場面でIF文を使われると、コードの可読性が下がり改修やバグの調査がしづらくなります。

この章では、IF文とCASE文の使い分けについて解説をしておきます。

処理速度の違い

まず、IF文とCASE文には処理速度の観点で違いがあります。

IF文よりもCASE文の方が若干早く(SAP公式見解)なります。

処理速度の改善を行いたい場合には、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文を用いるようにするのが正解です。