|
|
|
|
|||||||||||||||||||||
|
|||||||||||||||||||||||
|
|
|
|
[ROUNDED]
|
|
{operand1[:]= } |
|
arithmetic-expression |
|
このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連ステートメント:ADD | COMPRESS | DIVIDE | EXAMINE | MOVE | MOVE ALL | MULTIPLY | RESET | SEPARATE | SUBTRACT
関連機能グループ:算術演算とデータ移動操作
COMPUTE ステートメントは、算術演算や割り当て操作で使用します。
COMPUTE ステートメントで複数のターゲットオペランド(operand1)を指定しても、ソースオペランド(operand2)が算術演算式ではない場合は、個別の COMPUTE ステートメントと同じになります。
#TARGET1 := #TARGET2 := #SOURCE
これは、以下と同じです。
#TARGET1 := #SOURCE #TARGET2 := #SOURCE
例:
DEFINE DATA LOCAL 1 #ARRAY(I4/1:3) INIT <3,0,9> 1 #INDEX(I4) 1 #RESULT(I4) END-DEFINE * #INDEX := 1 * #INDEX := /* #INDEX is 3 #RESULT := /* #RESULT is 9 #ARRAY(#INDEX) * #INDEX := 2 * #INDEX := /* #INDEX is 0 #ARRAY(3) := /* returns runtime error NAT1316 #ARRAY(#INDEX) END
ソースオペランドが算術演算式の場合は、式が評価され、その結果は一時変数に格納されます。その後、一時変数はターゲットオペランドに割り当てられます。
#TARGET1 := #TARGET2 := #SOURCE1 + 1 is identical to #TEMP := #SOURCE1 + 1 #TARGET1 := #TEMP #TARGET2 := #TEMP
例:
DEFINE DATA LOCAL 1 #ARRAY(I4/1:3) INIT <2, 0, 9> 1 #INDEX(I4) 1 #RESULT(I4) END-DEFINE * #INDEX := 1 * #INDEX := /* #INDEX is 3 #RESULT := /* #RESULT is 3 #ARRAY(#INDEX) + 1 * #INDEX := 2 * #INDEX := /* #INDEX is 0 #ARRAY(3) := /* returns run time error NAT1316 #ARRAY(#INDEX) END
詳細については、『プログラミングガイド』の「演算割り当てのルール」、特に次のセクションを参照してください。
オペランド定義テーブル:
| オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 |
S | A | M | A | U | N | P | I | F | B | D | T | L | C | G | O | ○ | ○ | |||
operand2 |
C | S | A | N | E | A | U | N | P | I | F | B | D | T | L | C | G | O | ○ | × | |
operand3 |
C | S | N | P | I | B * | ○ | × | |||||||||||||
operand4 |
C | S | N | P | I | B * | ○ | × | |||||||||||||
* operand3 または operand4 がバイナリ変数の場合は、4 以下の長さでのみ使用できます。
構文要素の説明:
| 構文要素 | 説明 | |
|---|---|---|
COMPUTE |
ASSIGN [:]= |
キーワードの使用:
このステートメントは、ステートメントキーワード ストラクチャードモードでステートメントキーワード ただし、 |
|
ROUNDED |
ROUNDED オプション:
キーワード 四捨五入の詳細については、『プログラミングガイド』の「演算割り当てのルール」、および「フィールドの切り捨てと切り上げ」を参照してください。 |
|
operand1 |
結果フィールド:
結果の精度については、『プログラミングガイド』の「算術演算結果の精度」を参照してください。
ダイナミック変数に関する全般的な情報については、「ダイナミック変数およびラージ変数の使用」を参照してください。 |
|
arithmetic-expression |
算術演算式は、1 つ以上の定数、データベースフィールド、およびユーザー定義変数で構成されます。 Natural 算術関数(『システム関数』の算術関数を参照)は、算術オペランドとしても使用できます。 算術演算式のオペランドは、N、P、I、F、D、または T フォーマットで定義する必要があります。 オペランドのフォーマットについては、『プログラミングガイド』の「フォーマット混合式のパフォーマンスについて」を参照してください。 次の結合演算子が使用できます。 |
|
| 演算子: | 記号: | |
| カッコ | ( ) |
|
| 累乗 | ** |
|
| 乗算 | * |
|
| 除算 | / |
|
| Addition | + |
|
| 減算 | - |
|
|
各演算子の前後には少なくとも 1 つの空白を挿入して、上記の文字を持つ変数名と混同しないようにしてください。 算術演算の処理順序は次のとおりです。
|
||
operand2 |
ソースフィールド:
『プログラミングガイド』の「ユーザー定義定数」を参照してください。 |
|
SUBSTRING (operand2,operand3,operand4)
|
SUBSTRING オプション:
SUBSTRING オプションの指定がないと、
例えば、フィールド #A := SUBSTRING(#B,3,4)
注意:
|
|
COMPUTE ステートメントの除算結果の精度(桁数)は、1 番目のオペランド(被除数)または最初の結果フィールドのどちらか大きい方の精度により決まります。
ただし、整数オペランドの除算には、次のことが適用されます。2 つの整定数の除算について、その結果の精度は最初の結果フィールドの精度により決まりますが、2 つの整数オペランドの 1 つでも変数であれば、結果も整数フォーマットになります。つまり、結果フィールドの精度に関わらず小数桁なしになります。
** Example 'ASGEX1S': ASSIGN (structured mode) ************************************************************************ DEFINE DATA LOCAL 1 #A (N3) 1 #B (A6) 1 #C (N0.3) 1 #D (N0.5) 1 #E (N1.3) 1 #F (N5) 1 #G (A25) 1 #H (A3/1:3) END-DEFINE * ASSIGN #A = 5 WRITE NOTITLE '=' #A ASSIGN #B = 'ABC' WRITE '=' #B ASSIGN #C = .45 WRITE '=' #C ASSIGN #D = #E = -0.12345 WRITE '=' #D / '=' #E ASSIGN ROUNDED #F = 199.999 WRITE '=' #F #G := 'HELLO' WRITE '=' #G #H (1) := 'UVW' #H (3) := 'XYZ' WRITE '=' #H (1:3) * END
#A: 5 #B: ABC #C: .450 #D: -.12345 #E: -0.123 #F: 200 #G: HELLO #H: UVW XYZ
レポーティングモードの例については、次のプログラムを参照してください:ASGEX1R
** Example 'CPTEX1': COMPUTE
************************************************************************
DEFINE DATA LOCAL
1 EMPLOY-VIEW VIEW OF EMPLOYEES
2 PERSONNEL-ID
2 SALARY (1:2)
*
1 #A (P4)
1 #B (N3.4)
1 #C (N3.4)
1 #CUM-SALARY (P10)
1 #I (P2)
END-DEFINE
*
COMPUTE #A = 3 * 2 + 4 / 2 - 1
WRITE NOTITLE 'COMPUTE #A = 3 * 2 + 4 / 2 - 1' 10X '=' #A
*
COMPUTE ROUNDED #B = 3 -4 / 2 * .89
WRITE 'COMPUTE ROUNDED #B = 3 -4 / 2 * .89' 5X '=' #B
*
COMPUTE #C = SQRT (#B)
WRITE 'COMPUTE #C = SQRT (#B)' 18X '=' #C
*
LIMIT 1
READ EMPLOY-VIEW BY PERSONNEL-ID STARTING FROM '20017000'
WRITE / 'CURRENT SALARY: ' 4X SALARY (1)
/ 'PREVIOUS SALARY:' 4X SALARY (2)
FOR #I = 1 TO 2
COMPUTE #CUM-SALARY = #CUM-SALARY + SALARY (#I)
END-FOR
WRITE 'CUMULATIVE SALARY:' #CUM-SALARY
END-READ
*
END
COMPUTE #A = 3 * 2 + 4 / 2 - 1 #A: 7
COMPUTE ROUNDED #B = 3 -4 / 2 * .89 #B: 1.2200
COMPUTE #C = SQRT (#B) #C: 1.1045
CURRENT SALARY: 34000
PREVIOUS SALARY: 32300
CUMULATIVE SALARY: 66300