Dieser Abschnitt 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.
Werden Systemfunktionen für Benutzervariablen ausgewertet, hängt ihre Verarbeitung
davon ab, an welcher Stelle in der Verarbeitungsschleifen-Hierarchie die Variablen
ursprünglich im Reporting Mode definiert wurden. 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.
Beim 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.
Im Allgemeinen sind Format und Länge der Systemfunktionen AVER, NAVER, SUM
und TOTAL identisch mit dem Feld,
auf das sie angewendet werden. Die Ausgabelänge des Feldes muss groß genug sein
(entweder standardmäßig oder benutzerdefiniert), um etwaige Überlaufstellen
aufzunehmen. Wenn ein arithmetischer Überlauf auftritt, wird eine Fehlermeldung
ausgegeben.
Es gilt das Folgende
Wenn das Feld nicht lang genug ist, können Sie die Ausgabelänge mit der Option
NL des Statements
SORT GIVE wie
folgt erhöhen:
SUM(field)(NL=nn)
Dadurch wird nicht nur die Ausgabelänge erhöht, sondern das Feld wird auch intern verlängert.
Bei einem Feld des Formats N hat das Format der Systemfunktion das
Format P (mit der gleichen Länge wie das Feld).
Wenn die Systemfunktion mit dem Statement WRITE WORK FILE in
eine Arbeitsdatei geschrieben wird, wird die interne Länge des Feldes bei
numerischen Feldern (Format N oder P) um eine Stelle erhöht, z.B. wird
SUM eines Feldes des Formats P3 auf P4
erhöht. Dies muss beim Lesen der Arbeitsdatei berücksichtigt werden.
Eine Systemfunktion kann auch referenziert werden, nachdem sie in der GIVE-Klausel eines
SORT-Statements ausgewertet wurde.
Für eine Referenz auf eine Systemfunktion, die mit einem SORT
GIVE-Statement ausgewertet wird, muss dem Namen der Systemfunktion ein Stern
(*) vorangestellt werden.
Statement-Referenzierung kann auch für Systemfunktionen angewendet werden. Weitere Einzelheiten siehe 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 angegebene Feld ausgewertet werden soll.
| Format/Länge: | Wie Feld.
Ausnahme: Siehe Format- und Längenerfordernisse bei AVER, NAVER, SUM und TOTAL |
Diese Systemfunktion enthält den Durchschnittswert (Average) aller Werte des mit
AVER 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 MAX mit 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 mit MIN 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: Siehe Format- und Längenerfordernisse bei AVER, NAVER, SUM und TOTAL |
Diese Systemfunktion enthält den Durchschnittswert (Average) aller Werte des mit
NAVER 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 mit NMIN 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 Wert, den das mit OLD angegebene Feld vor
einem in einer AT BREAK-Bedingung angegebenen Gruppenwechsel (Wechsel des
Feldwertes) bzw. vor einer Seitenende- oder Datenende-Bedingung (END OF
PAGE, END OF DATA) hatte.
| Format/Länge: | Wie Feld.
Ausnahme: Siehe Format- und Längenerfordernisse bei AVER, NAVER, SUM und TOTAL |
Diese Systemfunktion enthält die Summe aller Werte des mit SUM 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: Siehe Format- und Längenerfordernisse bei AVER, NAVER, SUM und TOTAL |
Diese Systemfunktion enthält die Gesamtsumme aller Werte des mit TOTAL
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