処理ループで使用する Natural システム関数

このドキュメントでは、プログラムのループコンテキストで使用できる Natural システム関数について説明します。

次のトピックについて説明します。


処理ループでのシステム関数の使用

以下のトピックについて説明します。

指定/評価

Natural システム関数は次のステートメントに指定できます。

上記のステートメントを次のステートメントブロック内で使用する場合に、システム関数を指定できます。

つまり、FINDREADHISTOGRAMSORT、または READ WORK FILE のすべての処理ループに指定できます。

AT END OF PAGE ステートメントでシステム関数を使用する場合、対応する DISPLAY ステートメントに GIVE SYSTEM FUNCTIONS 節を指定する必要があります。

WHERE 節で排除されたレコードは、システム関数で評価されません。

FINDREADHISTOGRAM、またはSORT ステートメントで開始した、異なるレベルの処理ループのデータベースフィールドでシステム関数が評価される場合、その値は常にループ階層の位置に従って処理されます。例えば、新しいデータ値が外側のループに対して取得されていた場合、値はそのループに対してだけ処理されます。

ユーザー定義変数でシステム関数が評価される場合、レポーティングモードの処理は、ユーザー定義変数が定義されたループ階層の位置に依存します。処理ループの開始前に定義されているユーザー定義変数の場合、AT BREAKAT END OF DATA、または AT END OF PAGE ステートメントが定義されたループ内のシステム関数に対して評価されます。ユーザー定義変数が処理ループ内で定義されている場合、処理中のデータベースフィールドと同様に処理されます。

ユーザー定義変数に対するシステム関数評価の参照を選択する場合、値を処理するループを示すためにユーザー定義変数にループ参照を付けて指定することをお勧めします。ループ参照はステートメントラベルまたはソースコード行番号として指定できます。

SORT GIVE ステートメントでの使用

システム関数は、SORT ステートメントの GIVE 節で評価されたときにも参照できます。

SORT GIVE ステートメントで評価されたシステム関数を参照するには、システム関数の名前の先頭にアスタリスク(*)を付ける必要があります。

AVER、NAVER、SUM、TOTAL での桁あふれ

システム関数 AVERNAVERSUM、および TOTAL を適用するフィールドには、桁あふれを防止するために十分な長さ(デフォルトまたはユーザー指定)が必要です。桁あふれが起きると、エラーメッセージが発行されます。

通常、長さはシステム関数を適用するフィールドの長さと同じです。この長さでは不十分の場合、SORT GIVE ステートメントの[NL]オプションを使用して、次のように出力長を拡張する必要があります。

SUM(field)(NL=nn)

この場合、出力長が拡張されるだけでなく、フィールドの内部長も拡張されます。

ステートメント参照(r

ステートメント参照はシステム関数に対しても使用できます。『プログラミングガイド』の「ユーザー定義変数」セクションの「表記(r)を使用したデータベースフィールドの参照」も参照してください。

ステートメントラベルまたはソースコード行番号 (r) を使用して、指定したフィールドに対してシステム関数を評価する処理ループを指定できます。

AVER(r)(field)

フォーマット/長さ: フィールドと同じ。

例外:フィールドフォーマットが N の場合、AVER(field) のフォーマットは P(桁数はフィールドと同じ)。

AVER に指定されたフィールドのすべての値の平均値を持ちます。AVER は、AVER 要求時の条件が真になるたびに更新されます。

COUNT(r)(field)

フォーマット/長さ: P7

COUNT は置かれた処理ループを通過するたびに 1 ずつ増加します。COUNT の増加には、COUNT に指定されたフィールドの値は関係しません。

MAX(r)(field)

フォーマット/長さ: フィールドと同じ。

MAX に指定されたフィールドの最大値を持ちます。MAX を含む処理ループが実行されるたびに(必要に応じて)更新されます。

MIN(r)(field)

フォーマット/長さ: フィールドと同じ。

MIN に指定されたフィールドの最小値を持ちます。MIN の置かれた処理ループが実行されるたびに(必要に応じて)更新されます。

NAVER(r)(field)

フォーマット/長さ: フィールドと同じ。

例外:フィールドフォーマットが N の場合、NAVER(field) のフォーマットは P(桁数はフィールドと同じ)。

NAVER に指定されたフィールドのすべての値(空値を除く)の平均値を持ちます。NAVER は、NAVER 要求時の条件が真になるたびに更新されます。

NCOUNT(r)(field)

フォーマット/長さ: P7

NCOUNT は置かれた処理ループを通過するたびに、NCOUNT に指定されたフィールドが空値でないときに 1 ずつ増加します。

NCOUNT の結果が配列になるかスカラ値になるかは、その引数(フィールド)によって決まります。結果のオカレンスの数はフィールドと同じです。

NMIN(r)(field)

フォーマット/長さ: フィールドと同じ。

NMIN に指定されたフィールドの最小値(空値を除く)を持ちます。NMIN の置かれた処理ループが実行されるたびに(必要に応じて)更新されます。

OLD(r)(field)

フォーマット/長さ: フィールドと同じ。

AT BREAK 条件で指定されたコントロールブレイクの前、またはエンドオブページ条件やエンドオブデータ条件の前に、OLD で指定されたフィールドの値を持ちます。

SUM(r)(field)

フォーマット/長さ: フィールドと同じ。

例外:フィールドフォーマットが N の場合、SUM(field) のフォーマットは P(桁数はフィールドと同じ)。

SUM に指定されたフィールドのすべての値の合計を持ちます。SUM の置かれた処理ループが実行されるたびに更新されます。SUMAT BREAK 条件に続けて指定すると、値のブレイクごとにリセットされます。ブレイク間の値だけが加算されます。

TOTAL(r)(field)

フォーマット/長さ: フィールドと同じ。

例外:フィールドフォーマットが N の場合、TOTAL(field) のフォーマットは P(桁数はフィールドと同じ)。

TOTAL の置かれているすべてのオープン処理ループで、TOTAL に指定されたフィールドのすべての値の合計を持ちます。

以降で、例を示します。

例 1 - Natural システム関数 OLD、MIN、AVER、MAX、SUM、COUNT を使用した AT BREAK ステートメント

** Example 'ATBEX3': AT BREAK  (with Natural system functions)          
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 NAME                                                                
  2 CITY                                                                
  2 SALARY    (1)                                                       
  2 CURR-CODE (1)                                                       
END-DEFINE                                                              
*                                                                       
LIMIT 3                                                                 
READ EMPLOY-VIEW LOGICAL BY CITY = 'SALT LAKE CITY'                     
  DISPLAY NOTITLE CITY NAME 'SALARY' SALARY(1) 'CURRENCY' CURR-CODE(1)  
  /*                                                                    
  AT BREAK OF CITY                                                      
    WRITE /  OLD(CITY) (EM=X^X^X^X^X^X^X^X^X^X^X^X^X^X^X)               
      31T '   MINIMUM:' MIN(SALARY(1))  CURR-CODE(1) /                  
      31T '   AVERAGE:' AVER(SALARY(1)) CURR-CODE(1) /                  
      31T '   MAXIMUM:' MAX(SALARY(1))  CURR-CODE(1) /                  
      31T '       SUM:' SUM(SALARY(1))  CURR-CODE(1) /
      35T COUNT(SALARY(1)) 'RECORDS FOUND' /          
  END-BREAK                                           
  /*                                                  
  AT END OF DATA                                      
    WRITE 22T 'TOTAL (ALL RECORDS):'                  
              T*SALARY TOTAL(SALARY(1))  CURR-CODE(1) 
  END-ENDDATA                                         
END-READ                                              
*                                                     
END      

プログラム ATBEX3 の出力:

        CITY                 NAME           SALARY   CURRENCY
-------------------- -------------------- ---------- --------
                                                             
SALT LAKE CITY       ANDERSON                  50000 USD     
SALT LAKE CITY       SAMUELSON                 24000 USD     
                                                             
S A L T   L A K E   C I T Y      MINIMUM:      24000 USD     
                                 AVERAGE:      37000 USD     
                                 MAXIMUM:      50000 USD     
                                     SUM:      74000 USD     
                                         2 RECORDS FOUND     
                                                             
SAN DIEGO            GEE                       60000 USD     
                                                             
S A N   D I E G O                MINIMUM:      60000 USD     
                                 AVERAGE:      60000 USD     
                                 MAXIMUM:      60000 USD     
                                     SUM:      60000 USD     
                                         1 RECORDS FOUND     
                                                             
                     TOTAL (ALL RECORDS):     134000 USD 

例 2 - Natural システム関数 AVER を使用した AT BREAK ステートメント

** Example 'ATBEX4': AT BREAK  (with Natural system functions)          
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 NAME                                                                
  2 CITY                                                                
  2 SALARY    (2)                                                       
*                                                                       
1 #INC-SALARY (P11)                                                     
END-DEFINE                                                              
*                                                                       
LIMIT 4                                                                 
EMPL. READ EMPLOY-VIEW BY CITY STARTING FROM 'ALBU'                     
  COMPUTE #INC-SALARY = SALARY (1) + SALARY (2)                         
  DISPLAY NAME CITY SALARY (1:2) 'CUMULATIVE' #INC-SALARY               
  SKIP 1                                                                
  /*                                                                    
  AT BREAK CITY                                                         
    WRITE NOTITLE                                                       
      'AVERAGE:'            T*SALARY (1)  AVER(SALARY(1)) /       
      'AVERAGE CUMULATIVE:' T*#INC-SALARY AVER(EMPL.) (#INC-SALARY)
  END-BREAK                                                        
END-READ                                                           
*                                                                  
END                                                       

プログラム ATBEX4 の出力:

NAME                 CITY           ANNUAL    CUMULATIVE 
                                            SALARY               
-------------------- -------------------- ---------- ------------
                                                                 
HAMMOND              ALBUQUERQUE               22000        42200
                                               20200             
                                                                 
ROLLING              ALBUQUERQUE               34000        65200
                                               31200             
                                                                 
FREEMAN              ALBUQUERQUE               34000        65200
                                               31200             
                                                                 
LINCOLN              ALBUQUERQUE               41000        78700
                                               37700             
                                                                 
AVERAGE:                                       32750             
AVERAGE CUMULATIVE:                                         62825

例 3 - システム関数 MAX、MIN、AVER を使用した AT END OF DATA ステートメント

** Example 'AEDEX1S': AT END OF DATA                                    
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 PERSONNEL-ID                                                        
  2 NAME                                                                
  2 FIRST-NAME                                                          
  2 SALARY    (1)                                                       
  2 CURR-CODE (1)                                                       
END-DEFINE                                                              
*                                                                       
LIMIT 5                                                                 
EMP. FIND EMPLOY-VIEW WITH CITY = 'STUTTGART'                           
  IF NO RECORDS FOUND                                                   
    ENTER                                                               
  END-NOREC                                                             
  DISPLAY PERSONNEL-ID NAME FIRST-NAME                                  
          SALARY (1) CURR-CODE (1)                                      
  /*                                                                    
  AT END OF DATA                                               
    IF *COUNTER (EMP.) = 0                                     
      WRITE 'NO RECORDS FOUND'                                 
      ESCAPE BOTTOM                                            
    END-IF                                                     
    WRITE NOTITLE / 'SALARY STATISTICS:'                       
                  / 7X 'MAXIMUM:' MAX(SALARY(1))  CURR-CODE (1)
                  / 7X 'MINIMUM:' MIN(SALARY(1))  CURR-CODE (1)
                  / 7X 'AVERAGE:' AVER(SALARY(1)) CURR-CODE (1)
  END-ENDDATA                                                  
  /*                                                           
END-FIND                                                       
*                                                              
END                                                         

プログラム AEDEX1S の出力:

PERSONNEL         NAME              FIRST-NAME        ANNUAL   CURRENCY
   ID                                                 SALARY     CODE  
--------- -------------------- -------------------- ---------- --------
                                                                       
11100328  BERGHAUS             ROSE                      70800 DM      
11100329  BARTHEL              PETER                     42000 DM      
11300313  AECKERLE             SUSANNE                   55200 DM      
11300316  KANTE                GABRIELE                  61200 DM      
11500304  KLUGE                ELKE                      49200 DM      
                                                                       
SALARY STATISTICS:                                                     
       MAXIMUM:      70800 DM                                          
       MINIMUM:      42000 DM                                          
       AVERAGE:      55680 DM                                         

例 4 - システム関数 AVER を使用した AT END OF PAGE ステートメント

** Example 'AEPEX1S': AT END OF PAGE (structured mode)                  
************************************************************************
DEFINE DATA LOCAL                                                       
1 EMPLOY-VIEW VIEW OF EMPLOYEES                                         
  2 PERSONNEL-ID                                                        
  2 NAME                                                                
  2 JOB-TITLE                                                           
  2 SALARY    (1)                                                       
  2 CURR-CODE (1)                                                       
END-DEFINE                                                              
*                                                                       
FORMAT PS=10                                                            
LIMIT 10                                                                
READ EMPLOY-VIEW BY PERSONNEL-ID FROM '20017000'                        
  DISPLAY NOTITLE GIVE SYSTEM FUNCTIONS                                 
          NAME JOB-TITLE 'SALARY' SALARY(1) CURR-CODE (1)               
  /*                                                                    
  AT END OF PAGE                                                        
    WRITE / 28T 'AVERAGE SALARY: ...' AVER(SALARY(1)) CURR-CODE (1) 
  END-ENDPAGE
END-READ     
*            
END      

プログラム AEPEX1S の出力:

        NAME                  CURRENT            SALARY   CURRENCY
                             POSITION                       CODE  
-------------------- ------------------------- ---------- --------
                                                                  
CREMER               ANALYST                        34000 USD     
MARKUSH              TRAINEE                        22000 USD     
GEE                  MANAGER                        39500 USD     
KUNEY                DBA                            40200 USD     
NEEDHAM              PROGRAMMER                     32500 USD     
JACKSON              PROGRAMMER                     33000 USD     
                                                                  
                           AVERAGE SALARY: ...      33533 USD