COMPUTE
|
[ROUNDED ] {operand1 [:]= }
|
arithmetic-expression | |||||||||
ASSIGN
|
operand2 | ||||||||||
{operand1 := }
|
arithmetic-expression | ||||||||||
operand2 |
COMPUTE
|
[ROUNDED ]
|
{operand1 [:]= } | arithmetic-expression | ||||||
ASSIGN
|
operand2 |
このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連ステートメント: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 run time 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 | 可 | 不可 |
構文要素の説明:
COMPUTE ASSIGN [:]= |
このステートメントは、ステートメントキーワード ストラクチャードモードでステートメントキーワード ただし、 |
||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ROUNDED |
キーワード |
||||||||||||||||||
operand1 |
結果フィールド:
operand1 には、算術/割り当て演算の結果が格納されます。 結果の精度については、『プログラミングガイド』の「算術演算結果の精度」を参照してください。 operand1 がデータベースフィールドでも、データベースのそのフィールドは更新されません。 operand1 がダイナミック変数の場合は、operand2 の長さまたは算術演算の結果の長さまで値が入り、それに応じて operand1 の長さは調整されます。 ダイナミック変数の現在の長さは、システム変数 ダイナミック変数の全般的な情報については、「ラージ変数/フィールドとダイナミック変数/フィールド」を参照してください。 |
||||||||||||||||||
arithmetic-expression |
|
||||||||||||||||||
operand2 |
ソースフィールド:
operand2 はソースフィールドです。 operand1 がフォーマット C の場合は、operand2 を属性定数として指定することもできます(『プログラミングガイド』の「ユーザー定義定数」を参照)。 |
COMPUTE
ステートメントの除算結果の精度(桁数)は、1 番目のオペランド(被除数)または最初の結果フィールドのどちらか大きい方の精度により決まります。
ただし、整数オペランドの除算には、次のことが適用されます。2 つの整定数の除算について、その結果の精度は最初の結果フィールドの精度により決まりますが、2 つの整数オペランドの 1 つでも変数であれば、結果も整数フォーマットになります。つまり、結果フィールドの精度に関わらず小数桁なしになります。
オペランドが英数字、Unicode、またはバイナリフォーマットの場合は、SUBSTRING
オプションを使用して operand2 の一部分を operand1 に割り当てることができます。記述方法は MOVE
ステートメントと同じです。
** 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
レポーティングモードの例については、ライブラリ SYSEXRM のプログラム 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