COMPUTE

ストラクチャードモード構文

COMPUTE
ASSIGN

[ROUNDED] {operand1 [:]= } ...

arithmetic-expression
operand2
SUBSTRING (operand2,operand3,operand4)

 

{operand1:= } ...

arithmetic-expression
operand2
SUBSTRING (operand2,operand3,operand4)

                 

レポーティングモード構文

COMPUTE
ASSIGN

[ROUNDED]

{operand1[:]= }

arithmetic-expression
operand2
SUBSTRING (operand2,operand3,operand4)

このドキュメントでは、次のトピックについて説明します。

構文図で使用されている記号については、「構文記号」を参照してください。

関連ステートメント: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 [:]=
キーワードの使用:

このステートメントは、ステートメントキーワード COMPUTE(または ASSIGN)を省略して短縮形で発行することができます。

ストラクチャードモードでステートメントキーワード COMPUTE(または ASSIGN)を省略する場合には、割り当て文字(=)の前にコロン(:)を指定します。

ただし、ROUNDED オプションを使用する場合は、ステートメント名である COMPUTE または ASSIGN を指定する必要があります。

ROUNDED
ROUNDED オプション:

キーワード ROUNDED を指定すると、値は operand1 に割り当てられる前に四捨五入されます。

四捨五入の詳細については、『プログラミングガイド』の「演算割り当てのルール」、および「フィールドの切り捨てと切り上げ」を参照してください。

operand1
結果フィールド:

operand1 には、算術/割り当て演算の結果が格納されます。

結果の精度については、『プログラミングガイド』の「算術演算結果の精度」を参照してください。

operand1 がデータベースフィールドでも、データベースのそのフィールドは更新されません。

operand1 がダイナミック変数の場合は、operand2 の長さまたは算術演算の結果の長さまで値が入り、末尾には空白が充填されます。ダイナミック変数の現在の長さは、システム変数 *LENGTH を使用して取得できます。

ダイナミック変数に関する全般的な情報については、「ダイナミック変数およびラージ変数の使用」を参照してください。

arithmetic-expression
算術演算式:

算術演算式は、1 つ以上の定数、データベースフィールド、およびユーザー定義変数で構成されます。

Natural 算術関数(『システム関数』の算術関数を参照)は、算術オペランドとしても使用できます。

算術演算式のオペランドは、N、P、I、F、D、または T フォーマットで定義する必要があります。

オペランドのフォーマットについては、『プログラミングガイド』の「フォーマット混合式のパフォーマンスについて」を参照してください。

次の結合演算子が使用できます。

演算子: 記号:
カッコ ( )
累乗 **
乗算 *
除算 /
Addition +
減算 -

各演算子の前後には少なくとも 1 つの空白を挿入して、上記の文字を持つ変数名と混同しないようにしてください。

算術演算の処理順序は次のとおりです。

  1. カッコ

  2. 累乗

  3. 乗算/除算(現れた順に左から右へ)

  4. 加算/減算(現れた順に左から右へ)

operand2
ソースフィールド:

operand2 はソースフィールドです。operand1 のフォーマットが C の場合、operand2属性定数として指定することもできます。

プログラミングガイド』の「ユーザー定義定数」を参照してください。

SUBSTRING (operand2,operand3,operand4)
SUBSTRING オプション:

SUBSTRING オプションの指定がないと、operand2 の内容全体が転送されます。

operand1 および operand2 が英数字、Unicode、またはバイナリフォーマットの場合は、SUBSTRING オプションを使用して operand2 の一部分を operand1 に割り当てることができます。

SUBSTRING 節のフィールド名(operand2)の後に、まず開始位置(operand3)、次に移動するフィールド部分の長さ(operand4)を指定します。

例えば、フィールド #B の 3 番目から 6 番目をフィールド #A に割り当てる場合は、次のように指定します。

#A := SUBSTRING(#B,3,4)

operand3 を省略すると、開始位置は 1 とみなされます。operand4 を省略すると、長さはフィールドの開始位置から終わりまでの範囲とみなされます。

注意:
ASSIGNSUBSTRING オプション指定は、バイトごとの割り当てです(『プログラミングガイド』の「算術演算の規則」に記述されている規則は適用されません)。

MOVE SUBSTRING も参照してください。

除算結果の精度

COMPUTE ステートメントの除算結果の精度(桁数)は、1 番目のオペランド(被除数)または最初の結果フィールドのどちらか大きい方の精度により決まります。

ただし、整数オペランドの除算には、次のことが適用されます。2 つの整定数の除算について、その結果の精度は最初の結果フィールドの精度により決まりますが、2 つの整数オペランドの 1 つでも変数であれば、結果も整数フォーマットになります。つまり、結果フィールドの精度に関わらず小数桁なしになります。

例1 - ASSIGN ステートメント

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

プログラム ASGEX1S の出力:

#A:    5       
#B: ABC        
#C:  .450      
#D: -.12345    
#E: -0.123     
#F:    200     
#G: HELLO      
#H: UVW     XYZ

レポーティングモードの例については、次のプログラムを参照してください:ASGEX1R

例2 - COMPUTE ステートメント

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

プログラム CPTEX1 の出力:

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