|
|||||||||||||||||||||||
|
[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