ABAPにおける「IF文」「CASE文」を利用した条件分岐について解説します。
IF文:構文ルール
IF 条件式1 処理の内容1. ELSEIF 条件式2. 処理の内容2. ELSE. 処理の内容3. ENDIF.
CASE文:構文ルール
CASE 変数. WHEN 値1. 処理の内容1. WHEN 値2. 処理の内容2. WHEN OTHERS. 処理の内容3. ENDCASE.
条件分岐はプログラミング言語すべてに共通する基本知識です。このページでIF文/CASE文の使い分けや構文ルールをしっかり押さえ、適切に条件分岐をコーディングできるようにしておきましょう。
ABAPエンジニアを目指す方であれば、知らないと恥ずかしい超・基本知識ですので、是非最後までご覧ください。
条件分岐とは?
条件分岐とは、プログラム中である条件を満たしているかどうかを判定し、満たしている場合/満たしていない場合に応じて処理を変化させることです。
基本的には、「もし○○ならば××せよ」というような書き方で処理の内容を分岐させていきます。
ABAPでは、この条件分岐を「IF~ENDIF」「CASE~ENDCASE」を用いて記述していきます。
IF文(IF~ENDIF):構文ルール
IF 条件式1 処理の内容1. ELSEIF 条件式2. 処理の内容2. ELSE. 処理の内容3. ENDIF.
条件式の結果がTRUEの場合にそれぞれに該当する処理が1つだけ実行されます。
IF命令の後に記載した条件式は上から下へと順次チェックされていきます。
つまり、条件式が真(true)になった時点で処理が実行され、その後の条件式は比較・評価が行われないという点に注意しましょう。
どの条件にも合致しない場合は、ELSEの後に記述した処理が実行されます。
注意点としては ”IF” ”ELSEIF” ”ENDIF” の後にそれぞれピリオドが必要であるという点です。初心者の方ほど見落としがちな点ですが、ピリオドのつけ忘れは構文エラーとなりますので注意しましょう。
「IF 〇〇 = ■■」などのように、条件式を定義する際に必要となるのが、比較演算子の使い方。=や<>など、特定の条件を表す演算子の使い方は下記の記事をご覧ください。
サンプルコード:IF文
具体的なイメージを持つために、以下にサンプルコードを載せておきます。
REPORT ZDEMO_IF. DATA: SCORE TYPE I VALUE 75, GRADE TYPE C LENGTH 1. IF SCORE >= 90. GRADE = 'A'. ELSEIF SCORE >= 80. GRADE = 'B'. ELSEIF SCORE >= 70. GRADE = 'C'. ELSEIF SCORE >= 60. GRADE = 'D'. ELSE. GRADE = 'F'. ENDIF. WRITE: / 'Grade for a score of', SCORE, 'is', GRADE.
このサンプルコードでは、点数に基づいて評価を計算しています。点数が90以上の場合、評価は 'A' になります。80以上の場合は 'B'、70以上の場合は 'C'、60以上の場合は 'D'、それ以外の場合は 'F' になります。
IF命令の条件が真 (TRUE) である場合、その条件に対応する処理が実行され、次のENDIFまでジャンプします。ELSEIFを使用して、複数の条件をチェックし、それぞれに対応するステートメントを実行、条件がすべて偽 (FALSE) の場合、ELSE節のステートメントが実行するというのがポイントです。
CASE文(CASE~ENDCASE):構文ルール
続いてCASE文の使い方です。
CASE文は複数の条件に基づいてプログラムの実行フローを制御するための構文です。条件分岐が多数ある場合、CASE文を使用することでコードがより読みやすくなります。
CASE 変数. WHEN 値1. 処理の内容1. WHEN 値2. 処理の内容2. WHEN OTHERS. 処理の内容3. ENDCASE.
IF文とはことなり、CASEのオペランド部には式ではなく変数などのデータオブジェクトを指定します。また、CASEと最初のWHENの間に処理ロジックを記載することはできません。
WHENのオペランド部にはデータオブジェクトがとりうる値を指定し、データオブジェクトがそこで指定した値に合致する場合に、記載した処理が1つだけ実行されます。
IF文と同様に、上から順に条件に当てはまるかをチェックしていき、条件が合致した場合に当該処理を実行します。その後、再度条件式の評価が行われることはありません。
サンプルコード:CASE文
REPORT ZDEMO_CASE. DATA: DAY_NUMBER TYPE i VALUE 3, DAY_NAME TYPE string. CASE DAY_NUMBER. WHEN 1. DAY_NAME = 'Monday'. WHEN 2. DAY_NAME = 'Tuesday'. WHEN 3. DAY_NAME = 'Wednesday'. WHEN 4. DAY_NAME = 'Thursday'. WHEN 5. DAY_NAME = 'Friday'. WHEN 6. DAY_NAME = 'Saturday'. WHEN 7. DAY_NAME = 'Sunday'. WHEN OTHERS. DAY_NAME = 'Invalid day number'. ENDCASE. WRITE: / 'Day number', DAY_NUMBER, 'corresponds to', DAY_NAME.
このサンプルコードでは "day_number" の値に基づいて対応する曜日名を "day_name" に割り当てています。CASE文は "day_number" の値と一致するWHEN節を見つけ、対応する処理を実行します。
もし一致する値がない場合は "WHEN OTHERS節" のステートメントが実行されます。
IF文とCASE文の使い分
ここまでの解説でお気づきかと思いますが、IF文とCASE文は手段こそ異なりますが、目的は「条件分岐」で一致しています。
IF文かCASE文のどちらかを覚えておけば、ABAPにおける条件分岐の実装は可能です。
ただし、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つ以上あるものをいいます。先ほどのサンプルコードでは、数字の値(1~7)に応じて曜日名を返すプログラムでしたが、まさにこれが多分岐の例です。
REPORT ZDEMO_CASE. DATA: DAY_NUMBER TYPE i VALUE 3, DAY_NAME TYPE string. CASE DAY_NUMBER. WHEN 1. DAY_NAME = 'Monday'. WHEN 2. DAY_NAME = 'Tuesday'. WHEN 3. DAY_NAME = 'Wednesday'. WHEN 4. DAY_NAME = 'Thursday'. WHEN 5. DAY_NAME = 'Friday'. WHEN 6. DAY_NAME = 'Saturday'. WHEN 7. DAY_NAME = 'Sunday'. WHEN OTHERS. DAY_NAME = 'Invalid day number'. ENDCASE. WRITE: / 'Day number', DAY_NUMBER, 'corresponds to', DAY_NAME.
もちろん、IF文でも同様の処理を記述することはできます。
REPORT ZDEMO_IF. DATA: DAY_NUMBER TYPE i VALUE 3, DAY_NAME TYPE string. IF DAY_NUMBER = 1. DAY_NAME = 'Monday'. ELSEIF DAY_NUMBER = 2. DAY_NAME = 'Tuesday'. ELSEIF DAY_NUMBER = 3. DAY_NAME = 'Wednesday'. ELSEIF DAY_NUMBER = 4. DAY_NAME = 'Thursday'. ELSEIF DAY_NUMBER = 5. DAY_NAME = 'Friday'. ELSEIF DAY_NUMBER = 6. DAY_NAME = 'Saturday'. ELSEIF DAY_NUMBER = 7. DAY_NAME = 'Sunday'. ELSE. DAY_NAME = 'Invalid day number'. ENDIF. WRITE: / 'Day number', DAY_NUMBER, 'corresponds to', DAY_NAME.
ただし、CASE文の方が処理速度も若干早くなるので、多分岐の場合にはできるだけCASE文を用いるようにするのが正解な印象です。
ABAPを1から勉強したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!