このドキュメントでは、プログラムのループコンテキストで使用できる Natural システム関数について説明します。
次のトピックが含まれています。
次のトピックについて説明します。
Natural システム関数は次のステートメントに指定できます。
上記のステートメントを次のステートメントブロック内で使用する場合に、システム関数を指定できます。
つまり、FIND
、READ
、HISTOGRAM
、SORT
、または READ WORK FILE
のすべての処理ループに指定できます。
AT END OF PAGE
ステートメントでシステム関数を使用する場合、対応する DISPLAY
ステートメントに GIVE SYSTEM FUNCTIONS
節を指定する必要があります。
WHERE
節で排除されたレコードは、システム関数で評価されません。
FIND
、READ
、HISTOGRAM
、SORT
ステートメントで開始した、異なるレベルの処理ループのデータベースフィールドでシステム関数が評価される場合、その値は常にループ階層の位置に従って処理されます。 例えば、新しいデータ値が外側のループに対して取得されていた場合、値はそのループに対してだけ処理されます。
ユーザー定義変数でシステム関数が評価される場合、レポーティングモードの処理は、ユーザー定義変数が定義されたループ階層の位置に依存します。 処理ループの開始前に定義されているユーザー定義変数の場合、AT BREAK
、AT END OF DATA
、AT END OF PAGE
ステートメントが定義されたループ内のシステム関数に対して評価されます。 ユーザー定義変数が処理ループ内で定義されている場合、処理中のデータベースフィールドと同様に処理されます。
ユーザー定義変数に対するシステム関数評価の参照を選択する場合、値を処理するループを示すためにユーザー定義変数にループ参照を付けて指定することをお勧めします。 ループ参照はステートメントラベルまたはソースコード行番号として指定できます。
システム関数は、SORT
ステートメントの GIVE
節で評価されたときにも参照できます。
SORT GIVE
ステートメントで評価されたシステム関数を参照するには、システム関数の名前の先頭にアスタリスク(*)を付ける必要があります。
システム関数 AVER
、NAVER
、SUM
、TOTAL
を適用するフィールドには、桁あふれを防止するために十分な長さ(デフォルトまたはユーザー指定)が必要です。 桁あふれが起きると、エラーメッセージが発行されます。
通常、長さはシステム関数を適用するフィールドの長さと同じです。この長さでは不十分の場合、SORT GIVE
ステートメントの NL
オプションを使用して、次のように出力長を拡張する必要があります。
SUM(field)(NL=nn)
この場合、出力長が拡張されるだけでなく、フィールドの内部長も拡張されます。
ステートメント参照はシステム関数に対しても使用できます。『プログラミングガイド』の「ユーザー定義変数」セクションの「表記 (r) を使用したデータベースフィールドの参照」も参照してください。
ステートメントラベルまたはソースコード行番号 (r) を使用して、指定したフィールドに対してシステム関数を評価する処理ループを指定できます。
フォーマット/長さ: | フィールドと同じ。
例外:フィールドフォーマットが N の場合、 |
AVER
に指定されたフィールドのすべての値の平均値を持ちます。 AVER
は、AVER
要求時の条件が真になるたびに更新されます。
フォーマット/長さ: | P7 |
COUNT
の置かれた処理ループを通過するたびに 1 ずつ増加します。 COUNT
の増加には、COUNT
に指定されたフィールドの値は関係しません。
フォーマット/長さ: | フィールドと同じ。 |
MAX
に指定されたフィールドの最大値を持ちます。 MAX
の置かれた処理ループが実行されるたびに(必要に応じて)更新されます。
フォーマット/長さ: | フィールドと同じ。 |
MIN
に指定されたフィールドの最小値を持ちます。 MIN
の置かれた処理ループが実行されるたびに(必要に応じて)更新されます。
フォーマット/長さ: | フィールドと同じ。
例外:フィールドフォーマットが N の場合、 |
NAVER
に指定されたフィールドのすべての値(空値を除く)の平均値を持ちます。 NAVER
は、NAVER
要求時の条件が真になるたびに更新されます。
フォーマット/長さ: | P7 |
NCOUNT
の置かれた処理ループを通過するたびに、NCOUNT
に指定されたフィールドが空値でないときに 1 ずつ増加します。
NCOUNT
の結果が配列になるかスカラー値になるかは、その引数(フィールド)によって決まります。 結果のオカレンスの数はフィールドと同じです。
フォーマット/長さ: | フィールドと同じ。 |
NMIN
に指定されたフィールドの最小値(空値を除く)を持ちます。 NMIN
の置かれた処理ループが実行されるたびに(必要に応じて)更新されます。
フォーマット/長さ: | フィールドと同じ。 |
AT BREAK
条件で指定されたコントロールブレイクの前、またはエンドオブページ条件やエンドオブデータ条件の前に、OLD
で指定されたフィールドの値を持ちます。
フォーマット/長さ: | フィールドと同じ。
例外:フィールドフォーマットが N の場合、 |
SUM
に指定されたフィールドのすべての値の合計を持ちます。 SUM
の置かれた処理ループが実行されるたびに更新されます。 SUM
を AT BREAK
条件に続けて指定すると、値のブレイクごとにリセットされます。 ブレイク間の値だけが加算されます。
フォーマット/長さ: | フィールドと同じ。
例外:フィールドフォーマットが N の場合、 |
TOTAL
の置かれているすべてのオープン処理ループで、TOTAL
に指定されたフィールドのすべての値の合計を持ちます。
以降で、例を示します。
** 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
** 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
** 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
** 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