PR

【ABAP】COMPUTE命令/算術式の意味を3分でわかりやすく解説

ABAP

このページでは、ABAPにおける数値計算処理(COMPUTE命令/基本的な算術式の使い方)を初心者向けにわかりやすく解説します。

COMPUTE命令は数値計算を行うための命令。COMPUTE命令は実際のコードではあまり利用されませんが、ABAPにおける数値計算の基本を理解するうえでの重要な内容です。

このページでは、COMPUTE命令の基本的な使い方から、各種計算を行う際の算術式の利用方法をサンプルコード付きでご説明します。

このページで学べる内容
  • COMPUTE命令の使い方
  • 基本的な算術式
    • 加算 (+)
    • 減算 (-)
    • 乗算 (*)
    • 除算 (/)
  • 整数除算/剰余算(モジュロ演算)
    • DIV演算子
    • MOD演算子
  • 四則演算の応用

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

参考 DATA命令 / WRITE命令

このコードでは、lv_number1lv_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_number1lv_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_number1lv_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」のような複数の算術式が存在する場合の計算順序について補足します。

基本的には一般的な四則演算の法則にのっとり、以下の順番で実行されます。

  1. 括弧の中の計算
  2. 指数計算(**)
  3. 乗算/除算(* or / or MOD or DIV)
  4. 加減算(+ or -)

一般的な機能であれば、複数の算術式が複雑に絡みあうことはあまり無いように思います。したがって、基本的に上記の順番を暗記する必要性は低いと言えます。

ABAP:算術式(算術演算子)のまとめ

COMPUTE命令の使い方

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

各種演算子・キーワードの使い方

演算子・キーワード使い方例の説明
+ (加算)変数1 + 変数2lv_result = lv_number1 + lv_number2.lv_number1lv_number2の和をlv_resultに格納
- (減算)変数1 - 変数2lv_result = lv_number1 - lv_number2.lv_number1からlv_number2を引いた差をlv_resultに格納
* (乗算)変数1 * 変数2lv_result = lv_number1 * lv_number2.lv_number1lv_number2の積をlv_resultに格納
/ (除算)変数1 / 変数2lv_result = lv_number1 / lv_number2.lv_number1lv_number2で除算した商をlv_resultに格納
** (べき乗)変数1 ** 変数2lv_result = lv_number1 ** lv_number2.lv_number1lv_number2でべき乗して、その結果をlv_resultに格納
DIV (整数除算)変数1 DIV 変数2lv_result = lv_number1 DIV lv_number2.lv_number1lv_number2で除算した整数部分をlv_resultに格納
MOD (余り)変数1 MOD 変数2lv_result = lv_number1 MOD lv_number2.lv_number1lv_number2で除算した余りをlv_resultに格納
ROUND (四捨五入)ROUND( val = 変数 dec = 桁数 )lv_result = ROUND( val = lv_number dec = 2 ).lv_numberを小数点以下2桁で四捨五入して、その結果をlv_resultに格納
TRUNC (切り捨て)TRUNC( val = 変数 dec = 桁数 )lv_result = TRUNC( val = lv_number dec = 2 ).lv_numberを小数点以下2桁で切り捨てて、その結果をlv_resultに格納
CEIL (切り上げ)CEIL( val = 変数 dec = 桁数 )lv_result = CEIL( val = lv_number dec = 2 ).lv_numberを小数点以下2桁で切り上げて、その結果をlv_resultに格納

初めてABAPを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。

ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?

あなたの技術、もっと価値ある場所で活かしませんか?
SAPエンジニアのキャリア支援はこちらから↓

No.1 > 外資系・IT業界などハイクラスの転職なら【アクシスコンサルティング】blank
4人に1人のコンサルタントが選ぶパートナー!
ビッグ4やアクセンチュアへの転職を実現し年収1000万へ。

No.2 > IT・Web転職特化エージェント【レバテックキャリアblank
blank
サービス利用者数20万人突破。

平均年収アップ率77%であなたの転職成功を保証します。

No.3 > blankリクルートエージェント
blank
\転職支援実績NO.1/

応募が殺到しすぎるが故に・・・非公開にせざるを得ない魅力的な求人が多数!

読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
ABAPSAP
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました