Dieses Dokument erläutert die Natural-Systemfunktionen, die im Zusammenhang mit einer Programmschleife verwendet werden können.
Folgende Themen werden behandelt:
Folgende Themen werden behandelt:
Natural-Systemfunktionen können angegeben werden in
zuweisenden und arithmetischen Statements:
in Eingabe-Ausgabe-Statements:
die in einem der folgenden Statement-Blöcke stehen:
d.h. für alle Verarbeitungsschleifen in den Statements
FIND
,
READ
,
HISTOGRAM
,
SORT
oder
READ WORK FILE
.
Wenn eine Systemfunktion in einem
AT END OF
PAGE
-Statement verwendet wird, muss das betreffende
DISPLAY
-Statement eine GIVE SYSTEM
FUNCTIONS
-Klausel enthalten.
Datensätze, die aufgrund einer WHERE
-Klausel
zurückgewiesen werden, werden von einer Systemfunktion nicht ausgewertet.
Wenn mittels Systemfunktionen Datenbankfelder ausgewertet
werden, die aus FIND
-, READ
-, HISTOGRAM
-
oder SORT
-Schleifen stammen, die auf verschiedenen Ebenen liegen,
werden die Feldwerte jeweils entsprechend ihrer Position in der
Verarbeitungsschleifen-Hierarchie verarbeitet. Werte einer äußeren Schleife
werden zum Beispiel nur dann verarbeitet, wenn für diese Schleife neue
Datenwerte erhalten werden.
Wird eine Benutzervariable vor der ersten Verarbeitungsschleife
definiert, wird sie für Systemfunktionen in der Schleife ausgewertet, in der
das AT BREAK
-, AT END OF DATA
- oder AT END OF
PAGE
-Statement steht; wird eine Benutzervariable innerhalb einer
Schleife definiert, wird sie in der gleichen Weise wie ein Datenbankfeld in der
derselben Schleife behandelt.
Bei dem selektiven Einsatz von Systemfunktionen zur Auswertung von Benutzervariablen empfiehlt es sich, eine bestimmte Verarbeitungsschleife zu referenzieren (mittels Statement-Label oder Quellcode-Zeilennummer), um genau festzulegen, in welcher Schleife der Wert der Benutzervariablen ausgewertet werden soll.
Eine Systemfunktion kann auch referenziert werden, nachdem sie
in der GIVE
-Klausel eines
SORT
-Statements ausgewertet wurde.
In diesem Fall muss dem Namen der Systemfunktion bei der Referenzierung ein Stern (*) vorangestellt werden.
Ein Feld, das Sie mit den Systemfunktionen
AVER
,
NAVER
,
SUM
oder
TOTAL
verwenden, muss lang
genug sein (standardmäßig oder vom Benutzer definiert), um die Summe der
Feldwerte aufzunehmen. Falls der addierte Wert die Länge des Feldes
überschreitet, erhalten Sie eine Fehlermeldung.
Normalerweise hat die Systemfunktion dieselbe Länge wie das
angegebene Feld; ist diese Länge nicht ausreichend, dann verwenden Sie den
Parameter NL
des
SORT GIVE
-Statements, um die Ausgabelänge zu vergrößern:
SUM(field)(NL=nn)
Dadurch vergrößert sich nicht nur die Ausgabelänge, sondern auch die interne Länge des Feldes.
Statement-Referenzierung kann auch auf bei Systemfunktionen angewendet werden. Weitere Einzelheiten entnehmen Sie dem Unterabschnitt Datenbankfelder mit der (r)-Notation referenzieren - Notation (r) im Abschnitt Benutzervariablen im Natural Leitfaden zur Programmierung.
Durch Verwendung eines Statement-Labels oder Angabe der Quellcode-Zeilennummer (r) können Sie bestimmen, in welcher Verarbeitungsschleife die jeweilige Systemfunktion für das betreffende Feld ausgewertet werden soll.
Format/Länge: | Wie Feld.
Ausnahme: bei einem Feld mit Format N hat
|
Diese Systemfunktion enthält den Durchschnittswert (Average) aller
Werte des angegebenen Feldes. AVER
wird aktualisiert, wenn die
Bedingung, unter der AVER
angefordert wurde, erfüllt ist.
Format/Länge: | P7 |
Diese Systemfunktion zählt die Durchläufe einer
Verarbeitungsschleife. Der Wert von COUNT
erhöht sich jedesmal um
1, wenn die Verarbeitungsschleife, in der sich COUNT
befindet,
durchlaufen wird, und zwar unabhängig vom Wert des mit COUNT
angegebenen Feldes.
Format/Länge: | Wie Feld. |
Diese Systemfunktion enthält den größten Wert des angegebenen
Feldes. MAX
wird (falls erforderlich) jedesmal aktualisiert, wenn
die Verarbeitungsschleife, in der sich MAX
befindet, ausgeführt
wird.
Format/Länge: | Wie Feld. |
Diese Systemfunktion enthält den kleinsten Wert des angegebenen
Feldes. MIN
wird (falls erforderlich) jedesmal aktualisiert, wenn
die Verarbeitungsschleife, in der sich MIN
befindet, ausgeführt
wird.
Format/Länge: | Wie Feld.
Ausnahme: bei einem Feld mit Format N hat
|
Diese Systemfunktion enthält den Durchschnittswert (Average) aller
Werte des angegebenen Feldes, wobei Nullwerte nicht berücksichtigt werden.
NAVER
wird aktualisiert, wenn die Bedingung, unter der
NAVER
angefordert wurde, erfüllt ist.
Format/Länge: | P7 |
Diese Systemfunktion zählt die Durchläufe einer
Verarbeitungsschleife. Der Wert von NCOUNT
erhöht sich jedesmal um
1, wenn die Verarbeitungsschleife, in der sich NCOUNT
befindet,
durchlaufen wird, wobei Durchläufe, bei denen der Wert des angegebenen Feldes
Null ist, nicht mitgezählt werden.
Ob das Ergebnis von NCOUNT
ein Array oder ein
Skalarwert ist, hängt vom Argument (field) ab. Die
Anzahl der resultierenden Ausprägungen ist dieselbe wie bei Feld.
Format/Länge: | Wie Feld. |
Diese Systemfunktion enthält den kleinsten Wert des angegebenen
Feldes, wobei Nullwerte nicht berücksichtigt werden. NMIN
wird
(falls erforderlich) jedesmal aktualisiert, wenn die Verarbeitungsschleife, in
der sich NMIN
befindet, ausgeführt wird.
Format/Länge: | Wie Feld. |
Diese Systemfunktion enthält den "alten" Wert des
angegebenen Feldes, d.h. den Wert, den das Feld vor einem in einer AT
BREAK
-Bedingung spezifizierten Gruppenwechsel (Wechsel des Feldwertes)
bzw. vor einer Seitenende- oder Datenende-Bedingung (END OF PAGE
,
END OF DATA
) hatte.
Format/Länge: | Wie Feld.
Ausnahme: bei einem Feld mit Format N hat
|
Diese Systemfunktion enthält die Summe aller Werte des angegebenen
Feldes. SUM
wird jedesmal aktualisiert, wenn die
Verarbeitungsschleife, in der sich SUM
befindet, ausgeführt wird.
SUM
wird nach jedem AT BREAK
-Gruppenwechsel wieder
auf Null gesetzt, addiert also nur Werte zwischen zwei Gruppenwechseln.
Format/Länge: | Wie Feld.
Ausnahme: bei einem Feld mit Format N hat
|
Diese Systemfunktion enthält die Gesamtsumme aller Werte des
angegebenen Feldes in allen offenen Verarbeitungsschleifen, in denen
TOTAL
vorkommt.
Beispiel 1 − AT BREAK-Statement mit Natural-Systemfunktionen OLD, MIN, AVER, MAX, SUM, COUNT
Beispiel 2 − AT BREAK-Statement mit Natural-Systemfunktion AVER
Beispiel 3 − AT END OF DATA-Statement mit Systemfunktionen MAX, MIN, AVER
Beispiel 4 − AT END OF PAGE-Statement mit Systemfunktion AVER
** 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
Ausgabe des Programms 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
Ausgabe des Programms 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
Ausgabe des Programms 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
Ausgabe des Programms 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