Systemfunktionen für Verarbeitungsschleifen

#### Search Results

Search

# Systemfunktionen für Verarbeitungsschleifen

Dieser Abschnitt erläutert die Natural-Systemfunktionen, die im Zusammenhang mit einer Programmschleife verwendet werden können.

Folgende Themen werden behandelt:

- Systemfunktionen für Verarbeitungsschleifen benutzen

- AVER(r)(field)

- COUNT(r)(field)

- MAX(r)(field)

- MIN(r)(field)

- NAVER(r)(field)

- NCOUNT(r)(field)

- NMIN(r)(field)

- OLD(r)(field)

- SUM(r)(field)

- TOTAL(r)(field)

- Beispiele

## Systemfunktionen für Verarbeitungsschleifen benutzen

Folgende Themen werden behandelt:

- Spezifikation/Auswertung

- Format- und Längenerfordernisse bei AVER, NAVER, SUM und TOTAL

- Systemfunktionen im SORT GIVE-Statement

- Statement-Referenzierung (r)

### Spezifikation/Auswertung

Natural-Systemfunktionen können angegeben werden in

- zuweisenden und arithmetischen Statements:

  - `MOVE`

  - `ASSIGN`

  - `COMPUTE`

  - `ADD`

  - `SUBTRACT`

  - `MULTIPLY`

  - `DIVIDE`

- in Eingabe-Ausgabe-Statements:

  - `DISPLAY`

  - `PRINT`

  - `WRITE`

  - `WRITE WORK FILE`

  - `DOWNLOAD PC FILE`

die in einem der folgenden Statement-Blöcke stehen:

- `AT BREAK`

- `AT END OF DATA`

- `AT END OF PAGE`

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.

### Format- und Längenerfordernisse bei AVER, NAVER, SUM und TOTAL

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.

### Systemfunktionen im SORT GIVE-Statement

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 (r)

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.

## AVER(r)(field)

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.

## COUNT(r)(field)

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.

## MAX(r)(field)

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.

## MIN(r)(field)

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.

## NAVER(r)(field)

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.

## NCOUNT(r)(field)

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.

## NMIN(r)(field)

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.

## OLD(r)(field)

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.

## SUM(r)(field)

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.

## TOTAL(r)(field)

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.

## Beispiele

- 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

### Beispiel 1 − AT BREAK-Statement mit Natural-Systemfunktionen OLD, MIN, AVER, MAX, SUM, COUNT

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

### Beispiel 2 − AT BREAK-Statement mit Natural-Systemfunktion AVER

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

### Beispiel 3 − AT END OF DATA-Statement mit Systemfunktionen MAX, MIN, AVER

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

### Beispiel 4 − AT END OF PAGE-Statement mit Systemfunktion AVER

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

### On this page

- Systemfunktionen für Verarbeitungsschleifen benutzen
- AVER(r)(field)
- COUNT(r)(field)
- MAX(r)(field)
- MIN(r)(field)
- NAVER(r)(field)
- NCOUNT(r)(field)
- NMIN(r)(field)
- OLD(r)(field)
- SUM(r)(field)
- TOTAL(r)(field)
- Beispiele