Implementing Conditional Logic

Objective

After completing this lesson, you will be able to aBAP プログラムでの条件ロジックの実装

条件付き分岐の実装

条件分岐: 実装

キーワード IF、ELSEIF、ELSE、および ENDIF を使用して、ABAP コードに条件分岐を実装することができます。

条件分岐は、論理条件に依存するコード実行を可能にする制御構造です。

最も一般的な条件分岐は、キーワード IF と ENDIF のペアで構成されます。IF と ENDIF の間の ABAP コードブロックは、IF 後の条件が満たされた場合にのみ実行されます。

IF を拡張するコードブロックをさらに追加できます。ENDIF 構造を 1 つずつ登録するには、キーワード ELSE を使用し、任意数のブロックをキーワード ELSEIF を使用して実行します。キーワード ELSE を追加することで、ABAP コードブロックの 1 つだけが常に実行されるようにします。ELSE がない場合は、どの ABAP コードブロックも実行できません。

すべての IF .. ENDIF キーワードは必須であり、IF ごとに ENDIF が必要です。

実行される ABAP コードブロックは以下のとおりです。

  • 最初に、IF 条件が評価されます。満たされると、関連する ABAP コードブロックが実行され、ENDIF の後にプログラムが続行されます。
  • IF 条件が満たされていない場合にのみ、最初の ELSEIF が評価された後の条件になります。満たされると、関連するコードブロックが実行され、プログラムが ENDIF の後に続行されます。

  • これは、すべての ELSEIF 条件に対して連続して実行されます。どの条件も満たされず、構造に ELSE が含まれている場合、ELSE の後に ABAP コードブロックが実行されます。そうしないと、ABAP コードブロックが実行されません。

ヒント

他の多くのプログラミング言語とは異なり、ABAP では、各論理条件の後、およびキーワード ELSE の後にもデリミタ (.) が必要です。

論理条件

3 つの実装例を使用して論理条件を構築するためのキーワードの一覧

論理条件は、条件が真か偽かを決定するために実行システムによって評価される比較、論理演算、式、および関数の組合せです。

論理条件の最も一般的な使用ケースは、IF . . . のキーワード IF または ELSEIF の後です。ENDIF 構造。

最初の例 (上の図の) は、単純な比較です。2 つのデータオブジェクト x と y の値が同じである場合、条件は真です。

2 番目の例 (上の図の) は、x の値が y 以上 y の 2 倍より小さいか、y の値の 2 倍以下で、y の値の 2 倍より大きいかのどちらかです。

3 番目の例 (上の図の) では、算術関数 abs( ) と論理式 BETWEEN <expression 1> AND <expression 2>. を使用します。x の絶対値が y の絶対値と y の 2 倍の絶対値の間にある場合、条件は true です。

単純な値の比較には、演算子 =, <>, >, <, >=, and <= を使用できます。上記の例の算術式 2 * y のように、データオブジェクトだけでなく、他の多くの式の値を比較することができます。

注記

ABAP では、特性割当と値比較に同じシンボル (=) が使用されます。ポジションに基づいて区別されます。

演算子と意味

オペレータ意味
AND

複数の論理式を結合して、複数の論理式がすべて真である場合にのみ真となる新規論理式を登録するために使用されます。

OR

複数の論理式を結合して、少なくとも 1 つの論理式が true の場合に真となる新規論理式を登録するために使用されます。

NOT

NOT を使用した論理式の否定により、論理式が true の場合は新しい論理式が false になり、その逆も同様です。

演算子 AND および OR を使用して、論理式と演算子 NOT を組み合わせて、式を否定することができます。括弧がない場合、NOT は AND よりも強く、AND は OR より強力にバインドされます。

ABAP では、いくつかの特殊な論理式が認識されます。

  • <data object> IS INITIAL は、<data object>にタイプ固有の値が含まれている場合に真になります。
  • <data object> IS NOT INITIAL は、<data object> にタイプ固有の初期値とは異なる値が含まれている場合に真になります。
  • <data object> BETWEEN <expression 1> AND <expression 2>

一部の特殊な ABAP 関数は述部関数です。  つまり、それら自体は論理条件です。たとえば、Contains( ) は文字型の値を比較する関数です。

IF 命令の実装

ビジネスシナリオ

IF ...ENDIF キーワードを使用して、ABAP プログラムで論理条件を登録および評価し、結果を出力することができます。新しいアプリケーションプログラムを登録し、キーワード IF、ELSE、および ENDIF を使用して結果を出力します。

注記

この演習問題では、XX は各自の番号を示します。

ステップ

  1. インタフェース IF_OO_ADT_CLASSRUN を使用して、新規 ABAP クラス ZCL_S4D100_XX_COND を登録します。

    1. ZCL_S4D100_XX_COND という名称の新規 ABAP クラスを登録し、インタフェース IF_OO_ADT_CLASSRUN を追加します。

    2. これをパッケージに割り当て、移送依頼に関連付けます。

  2. アプリケーションを有効化します。

    1. Activate (Ctrl+F3) を押します。

  3. METHOD IF_OO_ADT_CLASSRUN~MAIN で、定数 C_NUMBER0 を初期値 0 で定義します。IF 文を使用して、定数の値がゼロでない場合にメッセージを出力します。

    1. METHOD IF_OO_ADT_CLASSRUN~MAIN で、以下のコードを実装します。

      Code Snippet
      1234567891011
      CONSTANTS: c_number0 TYPE i VALUE 0. out->write( '-----------------------------' ). out->write( 'Example 1: IF...ELSE...ENDIF' ). out->write( '-----------------------------' ). IF c_number0 = 0. out->write( 'The value of c_number0 equels zero' ). ELSE. out->write( 'The value of c_number0 equels some numer other than zero' ). ENDIF.
  4. クラスを有効化してテストします。

    1. Activate (Ctrl+F3) を押します。

    2. F9 を押して、クラスを実行します。

    実践する

ケースステートメント

キーワード CASE、WHEN、WHEN OTHERS、および ENDCASE は、条件分岐の実装にも使用できます。

条件分岐の 2 番目の手法は、CASE . . です。WHEN . . . ENDCASE 制御構造。

CASE . . . による条件分岐ENDCASE は、IF . . . によるより一般的な分岐の特殊なケースです。ENDIF. CASE は、分岐が単一のデータオブジェクトの値に依存し、そのたびに等しい比較を使用して、指定可能な値のセットと連続して比較する場合に使用することができます。

上記の例では、データオブジェクト 'number' の値が値 1 および 2 と比較されます。値が 1 の場合、<code_block_1> が実行され、値が 2 である場合は、代わりに <code_block_2> が実行されます。その他の値については、WHEN OTHERS の後にコードブロックが実行されます。

CASE による任意の条件分岐 ...ENDCASE は IF ...ENDIF 構造も同様です。これは、右側の上記の例に示されています。

文字列の処理

ビジネスシナリオ

顧客の氏名はありますが、名を表示する必要があります。ABAP コードを登録してフルネームを名と姓に分割し、名をコンソールに出力します。

注記

この演習問題では、XX は各自の番号を示します。

ステップ

  1. クラス ZCL_S4D100_XX_COND から ZCL_S4D100_XX_CASE を登録します。

    1. Project ExplorerCLASS ZLCOAL を展開します。

    2. パッケージ ZS4D100_XX を右クリックし、NewABAP Class を選択します。

    3. 名称ZCL_S4D100_XX_CHAR と入力します。

    4. Description:、String と入力します。

    5. 追加を選択して、インタフェース IF_OO_ADT_CLASSRUN を追加します。

    6. OK を選択します。

    7. Next を選択します。

    8. 移送依頼を選択し、Finish を押します。

    9. Activate (Ctrl+F3) を押します。

  2. if_oo_adt_classrun~main のコードを CASE 命令ではなく IF 命令を使用して変更し、c_number0 が初期値であるかどうかをチェックします。

    1. 以下のコードを使用して、METHOD IF_OO_ADT_CLASSRUN~MAIN. を実装します。

      Code Snippet
      1234567
      DATA: lv_full_name TYPE string VALUE 'Stan Wilson', lv_first_name TYPE string, lv_last_name TYPE string. SPLIT lv_full_name AT '' INTO lv_first_name lv_last_name. out->write( |user { lv_first_name }| ).
  3. プログラムを有効化して、テストします。

    1. Activate (Ctrl+F3) を押します。

    2. F9 を押して、クラスを実行します。

    実践する