データ計算

このドキュメントでは、データ計算に使用する、以下の算術演算ステートメントについて説明します。

また、1 つのオペランドの値を 1 つ以上のフィールドに転送するために使用する、以下のステートメントについて説明します。

重要:
最適な処理を行うために、算術演算ステートメントに使用するユーザー定義変数は、フォーマット P(パック型数値)で定義してください。

以下のトピックについて説明します。


COMPUTE ステートメント

COMPUTE ステートメントは、算術演算を実行するために使用します。以下の結合演算子を使用できます。

** 累乗
* 乗算
/ 除算
+ Addition
- 減算
( ) カッコは、論理グループを示すために使用します。

例 1

COMPUTE LEAVE-DUE = LEAVE-DUE * 1.1

この例では、フィールド LEAVE-DUE の値を 1.1 で乗算して、その結果をフィールド LEAVE-DUE に設定しています。

例 2:

COMPUTE #A = SQRT (#B)

この例では、フィールド #B の値の平方根を算出して、その結果をフィールド #A に割り当てています。

SQRT は、以下の算術演算ステートメントでサポートされている算術関数です。

算術関数の概要については、後述の「算術関数」を参照してください。

例 3:

COMPUTE #INCOME = BONUS (1,1) + SALARY (1)

この例では、当年の最初のボーナスと現在の給与を加算して、その結果をフィールド #INCOME に割り当てています。

MOVE および COMPUTE ステートメント

ステートメント MOVE および COMPUTE は、オペランドの値を 1 つ以上のフィールドに転送するために使用できます。オペランドには、テキスト項目や数値などの定数、データベースフィールド、ユーザー定義変数、システム変数、または場合によってはシステム関数を使用できます。

これらの 2 つのステートメントの違いは、以下の例のように、MOVE ステートメントでは移動元の値を左側に指定しますが、COMPUTE ステートメントでは割り当て元の値を右側に指定します。

例:

MOVE NAME TO #LAST-NAME 
COMPUTE #LAST-NAME = NAME

ADD、SUBTRACT、MULTIPLY、および DIVIDE ステートメント

ADDSUBTRACTMULTIPLY、および DIVIDE ステートメントは、算術演算を実行するために使用します。

例:

ADD +5 -2 -1 GIVING #A 
SUBTRACT 6 FROM 11 GIVING #B 
MULTIPLY 3 BY 4 GIVING #C 
DIVIDE 3 INTO #D GIVING #E

これらの 4 つのステートメントはすべて ROUNDED オプションを持っています。このオプションは、演算の結果を四捨五入する場合に使用します。

四捨五入のルールについては、「演算割り当てのルール」を参照してください。

これらのステートメントの詳細については、『ステートメント』ドキュメントを参照してください。

MOVE、SUBTRACT、および COMPUTE ステートメントの例

以下のプログラムは、算術演算ステートメントでのユーザー定義変数の使用方法を示しています。3 人の従業員の年齢と給与を計算し、その結果を出力します。

** Example 'COMPUX01': COMPUTE
************************************************************************
DEFINE DATA LOCAL
1 MYVIEW VIEW OF EMPLOYEES
  2 NAME
  2 BIRTH
  2 JOB-TITLE
  2 SALARY         (1:1)
  2 BONUS          (1:1,1:1)
*
1 #DATE            (N8)
1 REDEFINE #DATE
  2 #YEAR          (N4)
  2 #MONTH         (N2)
  2 #DAY           (N2)
1 #BIRTH-YEAR      (A4)
1 REDEFINE #BIRTH-YEAR
  2 #BIRTH-YEAR-N  (N4)
1 #AGE             (N3)
1 #INCOME          (P9)
END-DEFINE
*
MOVE *DATN TO #DATE
*
READ (3) MYVIEW BY NAME STARTING FROM 'JONES'
  MOVE EDITED BIRTH (EM=YYYY) TO #BIRTH-YEAR
  SUBTRACT #BIRTH-YEAR-N FROM #YEAR GIVING #AGE
  /*
  COMPUTE #INCOME = BONUS (1:1,1:1) + SALARY (1:1)
  /*
  DISPLAY NAME 'POSITION' JOB-TITLE #AGE #INCOME
END-READ
END

プログラム COMPUX01 の出力:

Page      1                                                  14-01-14  14:15:54
 
        NAME                 POSITION          #AGE  #INCOME
-------------------- ------------------------- ---- ----------

JONES                MANAGER                     63      55000
JONES                DIRECTOR                    58      50000
JONES                PROGRAMMER                  48      31000

COMPRESS ステートメント

COMPRESS ステートメントは、複数のオペランドの内容を単一の英数字フィールドに転送(結合)するために使用します。

数値フィールドの先行ゼロおよび英数字フィールドの末尾の空白は、フィールド値を受け取りフィールドに転送する前に削除されます。

デフォルトでは、転送される値はそれぞれ 1 つの空白で区切られ、受け取りフィールドに格納されます。その他に可能な分割方法については、『ステートメント』ドキュメントに記載されている、COMPRESS ステートメントオプション LEAVING NO SPACE の説明を参照してください。

例:

COMPRESS 'NAME:' FIRST-NAME #LAST-NAME INTO #FULLNAME

この例では、COMPRESS ステートメントを使用して、テキスト定数('NAME:')、データベースフィールド(FIRST-NAME)、およびユーザー定義変数(#LAST-NAME)を、1 つのユーザー定義変数(#FULLNAME)に結合しています。

COMPRESS ステートメントの詳細については、『ステートメント』ドキュメントに記載されている、COMPRESS ステートメントの説明を参照してください。

COMPRESS および MOVE ステートメントの例

以下のプログラムは、ステートメント MOVE および COMPRESS の使用方法を示しています。

** Example 'COMPRX01': COMPRESS
************************************************************************
DEFINE DATA LOCAL
1 MYVIEW VIEW OF EMPLOYEES
  2 NAME
  2 FIRST-NAME
  2 MIDDLE-I
*
1 #LAST-NAME (A15)
1 #FULL-NAME (A30)
END-DEFINE
*
READ (3) MYVIEW BY NAME STARTING FROM 'JONES'
  MOVE NAME TO #LAST-NAME
  /*  
  COMPRESS 'NAME:' FIRST-NAME MIDDLE-I #LAST-NAME INTO #FULL-NAME
  /*
  DISPLAY #FULL-NAME (UC==) FIRST-NAME 'I' MIDDLE-I (AL=1) NAME 
END-READ 
END

プログラム COMPRX01 の出力:

結合されたフィールドの出力形式に注意してください。

Page      1                                                  14-01-14  14:15:54
 
          #FULL-NAME                FIRST-NAME      I         NAME
============================== -------------------- - --------------------

NAME: VIRGINIA J JONES         VIRGINIA             J JONES
NAME: MARSHA JONES             MARSHA                 JONES
NAME: ROBERT B JONES           ROBERT               B JONES

複数行表示では、COMPRESS ステートメントを使用して、ユーザー定義変数にフィールド/テキストを結合すると便利です。

COMPRESS ステートメントの例

次のプログラムでは、3 つのユーザ定義変数が使用されます:#FULL-SALARY#FULL-NAME、および#FULL-CITY です。例えば、#FULL-SALARY には、テキスト 'SALARY:' とデータベースフィールド SALARY および CURR-CODE が含まれています。そして、WRITE ステートメントでは、結合した変数のみを参照しています。

** Example 'COMPRX02': COMPRESS
************************************************************************
DEFINE DATA LOCAL
1 VIEWEMP VIEW OF EMPLOYEES
  2 NAME
  2 FIRST-NAME
  2 SALARY       (1:1)
  2 CURR-CODE    (1:1)
  2 CITY
  2 ADDRESS-LINE (1:1)
  2 ZIP
*
1 #FULL-SALARY   (A25)
1 #FULL-NAME     (A25)
1 #FULL-CITY     (A25)
END-DEFINE
*
READ (3) VIEWEMP BY CITY STARTING FROM 'NEW YORK'
  COMPRESS 'SALARY:' CURR-CODE(1) SALARY(1) INTO #FULL-SALARY
  COMPRESS FIRST-NAME NAME                  INTO #FULL-NAME
  COMPRESS ZIP CITY                         INTO #FULL-CITY
  /*
  DISPLAY 'NAME AND ADDRESS' NAME (EM=X^X^X^X^X^X^X^X^X^X^X^X)
  WRITE 1/5  #FULL-NAME
        1/37 #FULL-SALARY
        2/5  ADDRESS-LINE (1)
        3/5  #FULL-CITY
  SKIP 1
END-READ
END

プログラム COMPRX02 の出力:

Page      1                                                  14-01-14  14:15:54
 
   NAME AND ADDRESS
-----------------------
 
R U B I N
    SYLVIA RUBIN                    SALARY: USD 17000
    2003 SARAZEN PLACE
    10036 NEW YORK
 
W A L L A C E
    MARY WALLACE                    SALARY: USD 38000
    12248 LAUREL GLADE C
    10036 NEW YORK
 
K E L L O G G
    HENRIETTA KELLOGG               SALARY: USD 52000
    1001 JEFF RYAN DR.
    19711 NEWARK

算術関数

以下の Natural 算術関数は、算術演算ステートメント(ADDCOMPUTEDIVIDESUBTRACTMULTIPLY)でサポートされています。

算術の内容 Natural システム関数
field の絶対値。 ABS(field)
field アークタンジェント。 ATN(field)
field のコサイン。 COS(field)
field の指数。 EXP(field)
field の小数部分。 FRAC(field)
field の整数部分。 INT(field)
field の自然対数。 LOG(field)
field.の符号。 SGN(field)
field のサイン(正弦)。 SIN(field)
field の平方根。 SQRT(field)
field のタンジェント。 TAN(field)
英数字 field から抽出された数値。 VAL(field)

各算術関数の詳細については、『システム関数』ドキュメントも参照してください。

COMPUTE、MOVE、および COMPRESS ステートメントの他の例

次の例のプログラムを参照してください。