バージョン 4.2.5
 —  ステートメント  —

COMPUTE

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

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

詳細については、『プログラミングガイド』の「演算割り当てのルール」、および特に次のセクションを参照して下さい。

Top of page

構文説明

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
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 [:]=

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

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

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

ROUNDED

キーワード ROUNDED を指定すると、値は operand1 に割り当てられる前に切り上げられます。 切り上げの詳細については、『プログラミングガイド』の「演算割り当てのルール」、および「フィールドの切り捨てと切り上げ」を参照してください。

operand1
結果フィールド:

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

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

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

operand1 がダイナミック変数の場合は、operand2 の長さまたは算術演算の結果の長さまで値が入り、それに応じて operand1 の長さは調整されます。 ダイナミック変数の現在の長さは、システム変数 *LENGTH を使用して確認できます。

ダイナミック変数の全般的な情報については、「ラージ変数/フィールドとダイナミック変数/フィールド」を参照してください。

arithmetic-expression

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

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

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

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

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

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

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

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

  1. カッコ

  2. 累乗

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

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

operand2
ソースフィールド:

operand2 はソースフィールドです。 operand1 がフォーマット C の場合は、operand2属性定数として指定することもできます(『プログラミングガイド』の「ユーザー定義定数」を参照)。

Top of page

除算結果の精度

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

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

Top of page

SUBSTRING オプション

オペランドが英数字、Unicode、またはバイナリフォーマットの場合は、SUBSTRING オプションを使用して operand2 の一部分を operand1 に割り当てることができます。記述方法は MOVE ステートメントと同じです。

Top of page

例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

レポーティングモードの例については、ライブラリ SYSEXRM のプログラム 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                      

Top of page