代入、条件分岐、計算式

19.1 代入、条件分岐、計算式

1. 代入、条件分岐、計算式

代入、条件分岐、計算式について以下の流れで説明します。

  • 代入
  • 条件分岐
  • 計算式

代入

代入

変数や構造などのデータオブジェクトへのデータの代入や、
格納データの初期化について以下の流れで説明します。

  • 変数への代入
  • 構造間での代入
  • 内部テーブル間での代入
  • 初期化

変数への代入

変数aから変数bにデータを代入したい場合は、下記のように記述します。

※もちろん値を直接代入することも可能ですし、変数の代わりに構造の項目を使用することも可能です。

サンプルコード

代入(変数への代入)

*&---------------------------------------------------------------------*
*& Report  ZTEST_PROGRAM_SUBSTITUTION
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZTEST_PROGRAM_SUBSTITUTION.
  DATA:
        WK_TEXT(5) TYPE C,
        WK_PACK    TYPE P DECIMALS 2,
        WK_INT     TYPE I.

  WK_TEXT = 123.
  MOVE '3.59' TO WK_PACK.
  WK_INT = WK_PACK.
  WRITE: / WK_TEXT,
    WK_PACK,
    WK_INT.

結果

構造間での代入

構造間で複数項目のデータを一括代入したい場合は、MOVE-CORRESPONDING命令を使用できます。

■構造のイメージ

下の図のように、項目名が同じ箇所へデータを代入します。

ただし、このMOVEーCORRESPONDING命令は、あまり推奨されていません。
1行書けば自動的に該当項目を探し出して値を代入してくれるので、プログラマーとしては大変楽に感じる命令ですが、該当項目の検索がパフォーマンス低下に繋がるとされているため、利用には注意が必要です。
なお、上記の図の項目名が漢字の名称になっていますが、実際にはプログラム内の構造の項目IDで処理されます。

サンプルコード

代入(構造間での代入)

REPORT ZTEST_PROGRAM_SUBSTITUTION_2.
TYPES : BEGIN OF TYP_1,
  CUSTOMER(5) TYPE N,
  NAME(30)        TYPE C,
  PERSON(20)  TYPE C,
  END OF TYP_1.

TYPES:BEGIN OF TYP_2,
  CUSTOMER(5) TYPE N,
  NAME(30)        TYPE C,
  ADDRESS(60)   TYPE C,
  TEL(30)           TYPE C,
  PERSON(20)    TYPE C,
  DEPT(20)        TYPE C,
END OF TYP_2.

DATA:
      ST_CUST_1 TYPE TYP_1,
      ST_CUST_2 TYPE TYP_2.

ST_CUST_1-CUSTOMER = '0001'.
ST_CUST_1-NAME         = '株式会社222'.
ST_CUST_1-PERSON     = '田中'.

MOVE-CORRESPONDING ST_CUST_1 TO ST_CUST_2.

WRITE: ST_CUST_2-CUSTOMER,
  / ST_CUST_2-NAME,
  / ST_CUST_2-PERSON. 

結果

内部テーブルでの代入

内部テーブル間での代入も可能ですが、これには注意が必要です。

上記の場合、内部テーブルaと内部テーブルbは、まったく同じデータ型でなければなりません。

この上記の代入方法だと、内部テーブルの特定項目同士の代入は不可です。

特定項目同士のみへ代入したい場合は、内部テーブルを1行ずつ読み込んで構造に格納し、構造の項目同士で代入するといった方法にて可能です。

サンプルコード

代入(内部テーブルでの代入)

REPORT ZTEST_PROGRAM_SUBSTITUTION_3.
TYPES:BEGIN OF TYP_CUSTOMER,
  CUSTOMER(5) TYPE N,
  NAME(30)        TYPE C,
  PERSON(20)    TYPE C,
END OF TYP_CUSTOMER.

DATA:
      ST_CUST   TYPE TYP_CUSTOMER,
      IT_CUST_1 TYPE STANDARD TABLE OF TYP_CUSTOMER,
      IT_CUST_2 TYPE STANDARD TABLE OF TYP_CUSTOMER.

ST_CUST-CUSTOMER =‘0001’.
ST_CUST-NAME         =‘株式会社222’.
ST_CUST-PERSON    =‘田中’.

APPEND ST_CUST TO IT_CUST_1.

IT_CUST_2[] = IT_CUST_1[].

WRITE ‘処理完了’. 

結果

初期化

格納されたデータの初期化には、CLEAR命令を使用します。

サンプルコード

代入(初期化)

REPORT ZTEST_PROGRAM_SUBSTITUTION_4.
TYPES:BEGIN OF TYP_CUSTOMER,
  CUSTOMER(5) TYPE N,
  NAME(30)    TYPE C,
  PERSON(20)  TYPE C,
END OF TYP_CUSTOMER.

DATA:
      ST_CUST   TYPE TYP_CUSTOMER,
      IT_CUST   TYPE STANDARD TABLE OF TYP_CUSTOMER,
      WK_CUST   TYPE C.

ST_CUST-CUSTOMER   ='0001'.
ST_CUST-NAME       ='株式会社222'.
ST_CUST-PERSON     ='田中'.
WK_CUST            = ST_CUST-CUSTOMER.

APPEND ST_CUST TO IT_CUST.

CLEAR:ST_CUST,IT_CUST.
CLEAR:WK_CUST.

WRITE '処理完了'. 

結果

条件分岐

「もし○○が△△だった場合は、□□します」というように、条件に応じて処理を分けたい場合、 IF文とCASE文を使用して条件に応じた処理を記述します。
ここでは条件分岐の命令について以下の流れで説明します。

  • IF文
  • CASE文

条件分岐(IF文)

IF文の構文です。

論理式は、上から順にチェックされていき、どの論理式にも合致しない場合は、ELSE内の処理
(上記だと[処理4])が実行されます。
例えば、ある値が赤、青、黄、黒のいずれかをIF文を使って判断する例を次のページの参考コードで示します。
その例では、結果が「BLUE」として表示されます。

サンプルコード

条件分岐(IF文)

REPORT ZTEST_PROGRAM_CONDITION_1.
CONSTANTS:
  CN_RED(3)    TYPE  C VALUE 'RED',
  CN_BLUE(4)   TYPE  C VALUE 'BLUE',
  CN_YELLOW(6) TYPE  C VALUE 'YELLOW'.

DATA:
       WK_COLOR(10)  TYPE  C,
       WK_RESULT(10) TYPE  C.

WK_COLOR = 'BLUE'.

IF WK_COLOR = CN_RED.
  WK_RESULT = CN_RED.
ELSEIF WK_COLOR = CN_BLUE.
  WK_RESULT = CN_BLUE.
ELSEIF WK_COLOR = CN_YELLOW.
  WK_RESULT = CN_YELLOW.
ELSE.
  WK_RESULT = 'BLACK'.
ENDIF.

WRITE: 'WK_RESULT:' , WK_RESULT.

結果

条件分岐(CASE文)

CASE文の構文です。

変数の値と比較し、同一だった場合にWHEN以下の処理を行います。
変数の値と同一のものがない場合は、WHEN OTHERS 以下の処理を行います。

※IF文と同様に上から順にチェックされていくことに注意してください。
CASE文を使ったコーディング例を次のページで示します。
例では、CASE-1に「RED」と表示されます。

サンプルコード

条件分岐(CASE文)

REPORT ZTEST_PROGRAM_CONDITION_2.
CONSTANTS:
  CN_RED(3)     TYPE  C VALUE 'RED',
  CN_BLUE(4)    TYPE  C VALUE 'BLUE',
  CN_YELLOW(6)  TYPE  C VALUE 'YELLOW'.
DATA:
       WK_COLOR(10)  TYPE  C,
       WK_RESULT(10) TYPE  C.

WK_COLOR = 'RED'.

CASE WK_COLOR.
  WHEN CN_RED.
    WK_RESULT = CN_RED.
  WHEN  CN_BLUE.
    WK_RESULT = CN_BLUE.
  WHEN  CN_YELLOW.
    WK_RESULT = CN_YELLOW.
  WHEN OTHERS.
    WK_RESULT = 'BLACK'.
ENDCASE.

WRITE: 'CASE-1:' , WK_RESULT.

結果

計算式

ここでは、四則演算について説明します。

各種計算方法

算術計算をする場合、ABAPでは、以下のような複数の記述にて算術計算ができます。

四則演算は、次のページのように別の書き方も可能です。

サンプルコード

計算式(記述例1)

REPORT ZTEST_PROGRAM_CALCULATION_1.
DATA:
      WK_NUM10        TYPE I,
      WK_NUM05        TYPE I,
      WK_ADDITION     TYPE I,
      WK_SUBTRACT     TYPE I,
      WK_MULTIPLY     TYPE I,
      WK_DIVIVE       TYPE I.

WK_NUM10 = 10.
WK_NUM05 = 5.

*加算
WK_ADDITION = WK_NUM10 + WK_NUM05.
*減算
WK_SUBTRACT = WK_NUM10 - WK_NUM05.
*乗算
WK_MULTIPLY = WK_NUM10 * WK_NUM05.
*除算
WK_DIVIVE = WK_NUM10 / WK_NUM05.

WRITE: 'WK_ADDITION', WK_ADDITION.
WRITE: /'WK_SUBTRACT', WK_SUBTRACT.
WRITE: /'WK_MULTIPLY', WK_MULTIPLY.
WRITE: /'WK_DIVIVE', WK_DIVIVE. 

結果

計算式(記述例2)

REPORT ZTEST_PROGRAM_CALCULATION_3.
  DATA:
    WK_NUMBER   TYPE P DECIMALS 2 VALUE '1.23',
    WK_RESULT1  TYPE P DECIMALS 2,
    WK_RESULT2  TYPE P DECIMALS 2,
    WK_RESULT3  TYPE P DECIMALS 2.

*絶対値
WK_RESULT1 = ABS( WK_NUMBER ).
*整数部分
WK_RESULT2 = TRUNC( WK_NUMBER ).
*少数部分
WK_RESULT3 = FRAC( WK_NUMBER ).

WRITE:/ 'WK_RESULT_1 :' , WK_RESULT1.
WRITE:/ 'WK_RESULT_2 :' , WK_RESULT2.
WRITE:/ 'WK_RESULT_3 :' , WK_RESULT3. 

結果


NEXT>> 19.2 バイト列と文字列の処理(連結、分割、検索、置換、圧縮、変換、オフセット)