このドキュメントでは、プログラムのループコンテキストで使用できる 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