このページでは、ABAPにおける数値計算処理(COMPUTE命令/基本的な算術式の使い方)を初心者向けにわかりやすく解説します。
COMPUTE
命令は数値計算を行うための命令。COMPUTE
命令は実際のコードではあまり利用されませんが、ABAPにおける数値計算の基本を理解するうえでの重要な内容です。
このページでは、COMPUTE命令の基本的な使い方から、各種計算を行う際の算術式の利用方法をサンプルコード付きでご説明します。
SAPエンジニアやABAPerを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
参考 ABAPの基本構文ルール
ABAP:COMPUTE命令
ABAPの COMPUTE
命令は数値計算を行うための命令です。
基本的な構文は以下のようになります。
COMPUTE result = expression. " result は計算結果を保持する変数 " expression は計算式
早速、2つの数値を加算する簡単な例を見てみましょう↓。
DATA: lv_number1 TYPE i VALUE 10, lv_number2 TYPE i VALUE 20, lv_result TYPE i. COMPUTE lv_result = lv_number1 + lv_number2. WRITE: / 'Result is ', lv_result. " 出力結果 " Result is 30
このコードでは、lv_number1
と lv_number2
の値を加算し、その結果を lv_result
に格納しています。最後の行で計算結果が出力されます。難しくはありません。
他の算術演算子 (-
, *
, /
) も同様に使用できます。より複雑な算術表現も可能です。
DATA: lv_number1 TYPE i VALUE 10, lv_number2 TYPE i VALUE 20, lv_number3 TYPE i VALUE 30, lv_result TYPE i. COMPUTE lv_result = (lv_number1 + lv_number2) * lv_number3. WRITE: / 'Result is ', lv_result.
↑のコードでは、lv_number1
と lv_number2
の加算結果に lv_number3
を乗じた値が lv_result
に格納されます。
以上がABAPの COMPUTE
命令の基本的な使い方です。簡単な数値計算を行う場合に非常に便利な命令です。
【実践編】COMPUTE命令を省略する
ABAPではCOMPUTE
命令を使用しなくても、直接算術演算を行うことが可能。
実際、現在のABAPのプログラミングでは、COMPUTE
命令よりも直接の算術演算が一般的です。
DATA: lv_number1 TYPE i VALUE 10, lv_number2 TYPE i VALUE 20, lv_result TYPE i. lv_result = lv_number1 + lv_number2. WRITE: / 'Result is ', lv_result. " 出力結果 " Result is 30
この例では、lv_number1
とlv_number2
の加算を直接行い、その結果をlv_result
に格納しています。結果は先ほどと全く同様です。COMPUTE命令を利用しなくても、コード自体が複雑ではなく、むしろより直感的に理解できるようになるため、通常はCOMPUTE命令を利用することはほぼありません。
もちろん加算だけではなく、減算、乗算、除算も以下のように行うことができます。
lv_result = lv_number1 - lv_number2. " 減算 lv_result = lv_number1 * lv_number2. " 乗算 lv_result = lv_number1 / lv_number2. " 除算
直接の算術演算はコードがシンプルになり、可読性も向上するため、現代のABAPプログラミングではよく使われています。
COMPUTE命令の基本的な使い方は以上です。ここからは、より実践的に算術式(算術演算子)の使い方を詳しく見ていきましょう。
ABAPの基本的な算術式
まずは、基本的な算術演算子(加算・減算・乗算・除算)の4つから解説します。
算術式(算術演算子)というと、小難しく感じるかもしれませんが、"+" "-" "×" などの符号のことです。ABAPでは、これらの符号を用いて計算式を実行していきます。
また、上記の符号を用いる形に加えて、ADD命令(掛け算を実行)などの計算命令も存在します。ここからは、ABAPにおける計算式の書き方を解説していきます。
加算(+演算子:ADD)
加算を行う際には、+
演算子、もしくはADD
キーワードを利用します。
+
演算子を用いると、変数間の加算を直感的に行うことができます。
DATA: lv_number1 TYPE i VALUE 10, " 数値1 lv_number2 TYPE i VALUE 20, " 数値2 lv_result TYPE i. " 計算結果を格納する変数 lv_result = lv_number1 + lv_number2. " lv_number1とlv_number2を加算して、その結果をlv_resultに格納 WRITE: / '加算の結果は ', lv_result, ' です。'. " このコードを実行すると、"加算の結果は 30 です。"と出力されます。
↑のサンプルコードでは、lv_number1とlv_number2の値を加算し、その結果を新しい変数lv_resultに格納しています。
ADD
キーワードを使用すると、指定した変数に他の変数の値を加算することができます。
DATA: lv_number1 TYPE i VALUE 10, " 数値1 lv_number2 TYPE i VALUE 20, " 数値2 lv_result TYPE i. " 計算結果を格納する変数 ADD lv_number1 TO lv_number2. " lv_number1の値をlv_number2に加える lv_result = lv_number2. " lv_number2の値をlv_resultにコピー WRITE: / '加算の結果は ', lv_result, ' です。'. " このコードを実行すると、"加算の結果は 30 です。"と出力されます。
↑のサンプルコードでは、ADD
キーワードを使ってlv_number1の値をlv_number2に加えています。
両者の主な違いは、+
演算子が新しい変数に結果を格納するのに対し、ADD
キーワードは既存の変数の値を直接変更する点です。
減算(-演算子:SUBTRACT)
減算も、-
演算子とSUBTRACT
キーワードの2つの方法があります。
-
演算子を用いると、変数間の減算を直感的に行うことができます。
DATA: lv_number1 TYPE i VALUE 10, " 数値1 lv_number2 TYPE i VALUE 20, " 数値2 lv_result TYPE i. " 計算結果を格納する変数 lv_result = lv_number2 - lv_number1. " lv_number2からlv_number1を減算して、その結果をlv_resultに格納 WRITE: / '減算の結果は ', lv_result, ' です。'. " このコードを実行すると、"減算の結果は 10 です。"と出力されます。
SUBTRACT
キーワードを使用すると、指定した変数から他の変数の値を減算することができます。
DATA: lv_number1 TYPE i VALUE 10, " 数値1 lv_number2 TYPE i VALUE 20, " 数値2 lv_result TYPE i. " 計算結果を格納する変数 SUBTRACT lv_number1 FROM lv_number2. " lv_number2からlv_number1を減算してlv_number2に格納 lv_result = lv_number2. " lv_number2の値をlv_resultにコピー WRITE: / '減算の結果は ', lv_result, ' です。'. " このコードを実行すると、"減算の結果は 10 です。"と出力されます。
-
演算子は新しい変数に結果を格納するのに対し、SUBTRACT
キーワードは既存の変数の値を直接変更します。
乗算(*演算子:MULTIPLY)
乗算も、*
演算子とMULTIPLY
キーワードの2つの方法があります。
*
演算子を用いる方法が↓。
DATA: lv_number1 TYPE i VALUE 10, " 数値1 lv_number2 TYPE i VALUE 20, " 数値2 lv_result TYPE i. " 計算結果を格納する変数 lv_result = lv_number1 * lv_number2. " lv_number1とlv_number2を乗算して、その結果をlv_resultに格納 WRITE: / '乗算の結果は ', lv_result, ' です。'. " このコードを実行すると、"乗算の結果は 200 です。"と出力されます。
MULTIPLY
キーワードを使用する方法が↓。
DATA: lv_number1 TYPE i VALUE 10, " 数値1 lv_number2 TYPE i VALUE 20, " 数値2 lv_result TYPE i. " 計算結果を格納する変数 MULTIPLY lv_number1 INTO lv_number2. " lv_number2にlv_number1を乗算してlv_number2に格納 lv_result = lv_number2. " lv_number2の値をlv_resultにコピー WRITE: / '乗算の結果は ', lv_result, ' です。'. " このコードを実行すると、"乗算の結果は 200 です。"と出力されます。
除算(/演算子:DIVIDE)
除算も、/
演算子とDIVIDE
キーワードの2つの方法があります。
ただし、注意点としてDIVIDE
は整数の除算であり、余りを無視します。一方で浮動小数点数に対する除算を行いたい場合は、DIVIDE
の代わりにDIVIDE
キーワードにBY
を追加したDIVIDE BY
を使用します。
/
演算子を用いる方法が↓。
DATA: lv_number1 TYPE f VALUE 10, " 数値1 lv_number2 TYPE f VALUE 20, " 数値2 lv_result TYPE f. " 計算結果を格納する変数 lv_result = lv_number1 / lv_number2. " lv_number1をlv_number2で除算して、その結果をlv_resultに格納 WRITE: / '除算の結果は ', lv_result, ' です。'. " このコードを実行すると、"除算の結果は 0.5 です。"と出力されます。
また、DIVIDE
キーワードを使用すると、指定した変数から他の変数の値を除算することができます。
ただし、こちらは整数除算であり余りを無視してしまいます。そのため、精確な結果を得るためにはDIVIDE BY
を利用します。
DATA: lv_number1 TYPE i VALUE 10, " 数値1 lv_number2 TYPE i VALUE 20, " 数値2 lv_result TYPE i, " 整数除算の結果を格納する変数 lv_result_float TYPE f. " 浮動小数点数除算の結果を格納する変数 DIVIDE lv_number1 INTO lv_number2. " lv_number2をlv_number1で除算してlv_number2に格納 lv_result = lv_number2. " lv_number2の値をlv_resultにコピー lv_number2 = 20. " lv_number2の値を再設定 DIVIDE lv_number1 BY lv_number2 INTO lv_result_float. " lv_number1をlv_number2で除算して、その結果をlv_result_floatに格納 WRITE: / '整数除算の結果は ', lv_result, ' です。'. " このコードを実行すると、"整数除算の結果は 0 です。"と出力されます。 WRITE: / '浮動小数点数除算の結果は ', lv_result_float, ' です。'. " このコードを実行すると、"浮動小数点数除算の結果は 0.5 です。"と出力されます。
DIVIDE
の結果は0。DIVIDE BY
の結果は0.5というように異なっている点に注意してください。
基本的な四則演算は、上記4つの符号 or キーワードで実行することが可能。符号でもキーワードでも、結果は同一なのでどちらを用いても問題はありませんが、1つのプログラム中ではどちらか一方に記載を統一するようするのが一般的です。
経験談で言えば、計算命令を用いる方法よりも符号を用いて変数と数字を結ぶ形のほうが使用頻度は多いような気がします。
特殊な算術式
これまでは基本的な四則演算について解説してきました。
ここからは、ABAP初心者にとっては少し理解しづらい特殊な3つの算術式について解説します。
- DIV・・・2つの整数の除算を行いその結果を整数として返す
- MOD・・・2つの整数の除算の余りを返す
- **演算子・・・べき乗の計算
DIVキーワード
DIV
キーワードを使用すると、2つの整数の除算を行い、その結果を整数として返します。つまり、除算の余りは無視されます。
以下にそのサンプルコードを示します。
DATA: lv_number1 TYPE i VALUE 10, " 数値1 lv_number2 TYPE i VALUE 20, " 数値2 lv_result TYPE i. " 計算結果を格納する変数 lv_result = lv_number1 DIV lv_number2. " lv_number1をlv_number2で除算して、その結果をlv_resultに格納 WRITE: / '整数除算の結果は ', lv_result, ' です。'. " このコードを実行すると、"整数除算の結果は 0 です。"と出力されます。
10÷20の結果は「0あまり10」となります。そのため、DIVキーワードを利用した結果は「0」となります。
MODキーワード
MOD
キーワードを使用すると、2つの整数の除算の余りを計算することができます。以下にそのサンプルコードを示します。
DATA: lv_number1 TYPE i VALUE 10, " 数値1 lv_number2 TYPE i VALUE 3, " 数値2 lv_result TYPE i. " 計算結果を格納する変数 lv_result = lv_number1 MOD lv_number2. " lv_number1をlv_number2で除算した余りをlv_resultに格納 WRITE: / '除算の余りは ', lv_result, ' です。'. " このコードを実行すると、"除算の余りは 1 です。"と出力されます。
10÷3の結果は「3あまり1」となります。そのため、結果は「1」が返されるという仕組みです。
**演算子
**
演算子を使用してべき乗の計算を行うことができます。**
演算子は、左側の数値を右側の数値でべき乗した結果を返します。
DATA: lv_number1 TYPE f VALUE 2, " 底 lv_number2 TYPE f VALUE 3, " 指数 lv_result TYPE f. " 計算結果を格納する変数 lv_result = lv_number1 ** lv_number2. " lv_number1をlv_number2でべき乗して、その結果をlv_resultに格納 WRITE: / 'べき乗の結果は ', lv_result, ' です。'. " このコードを実行すると、"べき乗の結果は 8 です。"と出力されます。
この例では、2の3乗(2×2×2)を計算しています。その結果、lv_result
の値は8になります。
ABAP:四則演算の応用
最後に、ABAPにおける算術演算を行う際に丸め(四捨五入)、切り捨て、切り上げなどの操作についてご紹介します。
より実践的な内容になります。
四捨五入(ROUND)
四捨五入は、ROUND
キーワードを使用して行います。
DATA: lv_number TYPE f VALUE 2.567, " 数値 lv_result TYPE f. " 計算結果を格納する変数 lv_result = ROUND( val = lv_number dec = 2 ). " lv_numberを小数点以下2桁で四捨五入して、その結果をlv_resultに格納 WRITE: / '四捨五入の結果は ', lv_result, ' です。'. " このコードを実行すると、"四捨五入の結果は 2.57 です。"と出力されます。
val =
に数値、dec =
に丸める桁数を指定します。
小数点切り捨て(TRUNC)
小数点以下を切り捨てるには、TRUNC
キーワードを使用します。
DATA: lv_number TYPE f VALUE 2.567, " 数値 lv_result TYPE f. " 計算結果を格納する変数 lv_result = TRUNC( val = lv_number dec = 2 ). " lv_numberを小数点以下2桁で切り捨てして、その結果をlv_resultに格納 WRITE: / '切り捨ての結果は ', lv_result, ' です。'. " このコードを実行すると、"切り捨ての結果は 2.56 です。"と出力されます。
val =
に数値、dec =
に切り捨てる桁数を指定します。
小数点切り上げ(CEIL)
小数点以下を切り上げるには、CEIL
キーワードを使用します。
DATA: lv_number TYPE f VALUE 2.567, " 数値 lv_result TYPE f. " 計算結果を格納する変数 lv_result = CEIL( val = lv_number dec = 2 ). " lv_numberを小数点以下2桁で切り上げて、その結果をlv_resultに格納 WRITE: / '切り上げの結果は ', lv_result, ' です。'. " このコードを実行すると、"切り上げの結果は 2.57 です。"と出力されます。
val =
に数値、dec =
に切り上げる桁数を指定します。
Tips:計算の順序について
「A = B+C*D/E+(F-G)MOD H」のような複数の算術式が存在する場合の計算順序について補足します。
基本的には一般的な四則演算の法則にのっとり、以下の順番で実行されます。
- 括弧の中の計算
- 指数計算(**)
- 乗算/除算(* or / or MOD or DIV)
- 加減算(+ or -)
一般的な機能であれば、複数の算術式が複雑に絡みあうことはあまり無いように思います。したがって、基本的に上記の順番を暗記する必要性は低いと言えます。
ABAP:算術式(算術演算子)のまとめ
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!