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 Sourcecode-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 Sourcecode-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