このドキュメントでは、データ計算に使用する、以下の算術演算ステートメントについて説明します。
また、1 つのオペランドの値を 1 つ以上のフィールドに転送するために使用する、以下のステートメントについて説明します。
重要:
最適な処理を行うために、算術演算ステートメントに使用するユーザー定義変数は、フォーマット P(パック型数値)で定義してください。
次のトピックについて説明します。
COMPUTE
ステートメントは、算術演算を実行するために使用します。 以下の結合演算子を使用できます。
** | 累乗 |
---|---|
* | 乗算 |
/ | 除算 |
+ | 加算 |
- | 減算 |
( ) | カッコは、論理グループを示すために使用します。 |
COMPUTE LEAVE-DUE = LEAVE-DUE * 1.1
この例では、フィールド LEAVE-DUE
の値を 1.1 で乗算して、その結果をフィールド LEAVE-DUE
に設定しています。
COMPUTE #A = SQRT (#B)
この例では、フィールド #B
の値の平方根を算出して、その結果をフィールド #A
に割り当てています。
SQRT
は、以下の算術演算ステートメントでサポートされている算術関数です。
算術関数の概要については、後述の「算術関数」を参照してください。
COMPUTE #INCOME = BONUS (1,1) + SALARY (1)
この例では、当年の最初のボーナスと現在の給与を加算して、その結果をフィールド #INCOME
に割り当てています。
ステートメント MOVE
および COMPUTE
は、オペランドの値を 1 つ以上のフィールドに転送するために使用できます。 オペランドには、テキスト項目や数値などの定数、データベースフィールド、ユーザー定義変数、システム変数、または場合によってはシステム関数を使用できます。
これらの 2 つのステートメントの違いは、以下の例のように、MOVE
ステートメントでは移動元の値を左側に指定しますが、COMPUTE
ステートメントでは割り当て元の値を右側に指定します。
MOVE NAME TO #LAST-NAME COMPUTE #LAST-NAME = NAME
ADD
、SUBTRACT
、MULTIPLY
、および 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
オプションを持っています。このオプションは、演算の結果を四捨五入する場合に使用します。
四捨五入のルールについては、「演算割り当てのルール」を参照してください。
これらのステートメントの詳細については、『ステートメント』ドキュメントを参照してください。
以下のプログラムは、算術演算ステートメントでのユーザー定義変数の使用方法を示しています。 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 04-11-11 14:15:54 NAME POSITION #AGE #INCOME -------------------- ------------------------- ---- ---------- JONES MANAGER 63 55000 JONES DIRECTOR 58 50000 JONES PROGRAMMER 48 31000
COMPRESS
ステートメントは、複数のオペランドの内容を単一の英数字フィールドに転送(結合)するために使用します。
数値フィールドの先行ゼロおよび英数字フィールドの末尾の空白は、フィールド値を受け取りフィールドに転送する前に削除されます。
デフォルトでは、転送される値はそれぞれ 1 つの空白で区切られ、受け取りフィールドに格納されます。 その他に可能な分割方法については、『ステートメント』ドキュメントに記載されている、COMPRESS
ステートメントオプション LEAVING NO SPACE
の説明を参照してください。
COMPRESS 'NAME:' FIRST-NAME #LAST-NAME INTO #FULLNAME
この例では、COMPRESS
ステートメントを使用して、テキスト定数('NAME:'
)、データベースフィールド(FIRST-NAME
)、およびユーザー定義変数(#LAST-NAME
)を、1 つのユーザー定義変数(#FULLNAME
)に結合しています。
COMPRESS
ステートメントの詳細については、『ステートメント』ドキュメントに記載されている、COMPRESS
ステートメントの説明を参照してください。
以下のプログラムは、ステートメント 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 04-11-11 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
ステートメントを使用して、ユーザー定義変数にフィールド/テキストを結合すると便利です。
以下のプログラムでは、#FULL-SALARY
、#FULL-NAME
、および #FULL-CITY
の 3 つのユーザー定義変数を使用しています。 例えば、#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 04-11-11 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 算術関数は、算術演算ステートメント(ADD
、COMPUTE
、DIVIDE
、SUBTRACT
、MULTIPLY
)でサポートされています。
算術の内容 | 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) |
各算術関数の詳細については、『システム関数』ドキュメントも参照してください。
次の例のプログラムを参照してください。