Datenberechnungen

#### Search Results

Search

# Datenberechnungen

Dieses Dokument behandelt die zur Berechnung von Daten verwendeten arithmetischen Statements:

- `COMPUTE`

- `ADD`

- `SUBTRACT`

- `MULTIPLY`

- `DIVIDE`

Außerdem werden die folgenden Statements behandelt, die die zur Übertragung des Wertes eines Operanden in eines oder mehrere Felder benutzt werden:

- `MOVE`

- `COMPRESS`

Wichtig:
Um die Verarbeitung zu optimieren, sollten Benutzervariablen, die in arithmetischen Statements verwendet werden, mit Format P (gepackt numerisch) definiert werden.

Folgende Themen werden behandelt:

- COMPUTE-Statement

- Statements MOVE und COMPUTE

- Statements ADD, SUBTRACT, MULTIPLY und DIVIDE

- Beispiel für MOVE-, SUBTRACT- und COMPUTE-Statements

- COMPRESS-Statement

- Beispiel für die Statements COMPRESS und MOVE

- Beispiele für COMPRESS-Statement

- Mathematische Funktionen

- Weitere Beispiele für COMPUTE-, MOVE- und COMPRESS-Statements

## COMPUTE-Statement

Mit dem `COMPUTE`-Statement können Sie Rechenoperationen ausführen. Die folgenden Operatoren stehen Ihnen hierbei zur Verfügung:

`**` | Potenzierung
`` * | Multiplikation
`/` | Division
`+` | Addition
`-` | Subtraktion
`( )` | Logische Gruppen können mittels Klammerung gebildet werden.

#### Beispiel 1:

    COMPUTE LEAVE-DUE = LEAVE-DUE * 1.1

Der Wert des Feldes `LEAVE-DUE` wird mit `1,1` multipliziert und das Ergebnis in `LEAVE-DUE` gestellt.

#### Beispiel 2:

    COMPUTE #A = SQRT (#B)

Die Quadratwurzel des Feldwertes von `#B` wird errechnet und dem Feld `#A` zugewiesen. `SQRT` (für Square Root = Quadratwurzel) ist eine von mehreren in Natural eingebauten mathematischen Funktionen, die mit den folgenden Statements verwendet werden können:

- `COMPUTE`

- `ADD`

- `SUBTRACT`

- `MULTIPLY`

- `DIVIDE`

Einen Überblick über die in Natural eingebauten mathematische Funktionen finden Sie im Abschnitt Mathematische Funktionen.

#### Beispiel 3:

    COMPUTE #INCOME = BONUS (1,1) + SALARY (1)

Der erste Bonus des laufenden Jahres und das derzeitige Gehalt werden addiert, und das Ergebnis wird in das Feld `#INCOME` gestellt.

## Statements MOVE und COMPUTE

Mit den Statements `MOVE` und `COMPUTE` stellen Sie den Wert eines Operanden in ein oder mehrere Felder. Der Operand kann eine Text/Zahlenkonstante, Benutzervariable, ein Datenbankfeld, eine Systemvariable und in bestimmten Fällen auch eine Systemfunktion sein.

Die Statements `MOVE` und `COMPUTE` unterscheiden sich in ihrer Syntax dahingehend voneinander, dass beim `MOVE`-Statement der zu verschiebende Wert links angegeben wird, und beim COMPUTE-Statement der zuzuweisende Wert rechts angegeben wird, wie folgende Beispiele zeigen:

#### Beispiele:

    MOVE NAME TO #LAST-NAME
    COMPUTE #LAST-NAME = NAME

## Statements ADD, SUBTRACT, MULTIPLY und DIVIDE

Mit den Statements `ADD`, `SUBTRACT`, `MULTIPLY` und `DIVIDE` können Sie Rechenoperationen ausführen.

#### Beispiele:

    ADD +5 -2 -1 GIVING #A
    SUBTRACT 6 FROM 11 GIVING #B
    MULTIPLY 3 BY 4 GIVING #C
    DIVIDE 3 INTO #D GIVING #E

Alle 4 Statements haben eine `ROUNDED`-Option, mit der Sie gerundete Werte erhalten können.

Informationen zu Rundungsregeln entnehmen Sie dem Abschnitt Regeln für arithmetische Operationen. Weitere Informationen zu diesen Statements finden Sie in der Statements-Dokumentation.

## Beispiel für MOVE-, SUBTRACT- und COMPUTE-Statements

Das folgende Programm veranschaulicht die Verwendung von Benutzervariablen in arithmetischen Statements. Es berechnet Alter und Einkommen von drei Mitarbeitern und gibt die Ergebnisse aus.

    ** Example 'COMPUX01': COMPUTE
    ************************************************************************
    DEFINE DATA LOCAL
    1 MYVIEW VIEW OF EMPLOYEES
      2 NAME
      2 BIRTH
      2 JOB-TITLE
      2 SALARY         (1:1)
      2 BONUS          (1:1,1:1)
    *
    1 #DATE            (N8)
    1 REDEFINE #DATE
      2 #YEAR          (N4)
      2 #MONTH         (N2)
      2 #DAY           (N2)
    1 #BIRTH-YEAR      (A4)
    1 REDEFINE #BIRTH-YEAR
      2 #BIRTH-YEAR-N  (N4)
    1 #AGE             (N3)
    1 #INCOME          (P9)
    END-DEFINE
    *
    MOVE *DATN TO #DATE
    *
    READ (3) MYVIEW BY NAME STARTING FROM 'JONES'
      MOVE EDITED BIRTH (EM=YYYY) TO #BIRTH-YEAR
      SUBTRACT #BIRTH-YEAR-N FROM #YEAR GIVING #AGE
      /*
      COMPUTE #INCOME = BONUS (1:1,1:1) + SALARY (1:1)
      /*
      DISPLAY NAME 'POSITION' JOB-TITLE #AGE #INCOME
    END-READ
    END

Ausgabe des Programms `COMPUX01`:

    Page      1                                                  04-11-11  14:15:54

            NAME                 POSITION          #AGE  #INCOME
    -------------------- ------------------------- ---- ----------

    JONES                MANAGER                     63      55000
    JONES                DIRECTOR                    58      50000
    JONES                PROGRAMMER                  48      31000

## COMPRESS-Statement

Mit dem `COMPRESS`-Statement fassen Sie den Inhalt zweier oder mehrerer Operanden in einem einzigen alphanumerischen Feld zusammen.

Führende Nullen in einem numerischen Feld bzw. nachfolgende Leerstellen in einem alphanumerischen Feld werden unterdrückt, bevor der Feldwert in das Zielfeld übertragen wird.

Standardmäßig werden die übertragenen Werte im Zielfeld jeweils durch ein Leerzeichen voneinander getrennt. Andere Trennmöglichkeiten sind in der Statements-Dokumentation unter der `COMPRESS`-Statement-Option `LEAVING NO SPACE` beschrieben.

#### Beispiel:

    COMPRESS 'NAME:' FIRST-NAME #LAST-NAME INTO #FULLNAME

In diesem Beispiel werden eine Textkonstante (`’NAME:’`), ein Datenbankfeld (`FIRST−NAME`) und eine Benutzervariable (`#LAST−NAME`) mittels eines `COMPRESS`-Statements in einer Benutzervariablen (`#FULLNAME`) zusammengefasst.

Weitere Informationen zum `COMPRESS`-Statement finden Sie in der Statements-Dokumentation.

## Beispiel für die Statements COMPRESS und MOVE

Das folgende Beispiel veranschaulicht die Benutzung der Statements `MOVE` und `COMPRESS`.

    ** Example 'COMPRX01': COMPRESS
    ************************************************************************
    DEFINE DATA LOCAL
    1 MYVIEW VIEW OF EMPLOYEES
      2 NAME
      2 FIRST-NAME
      2 MIDDLE-I
    *
    1 #LAST-NAME (A15)
    1 #FULL-NAME (A30)
    END-DEFINE
    *
    READ (3) MYVIEW BY NAME STARTING FROM 'JONES'
      MOVE NAME TO #LAST-NAME
      /*
      COMPRESS 'NAME:' FIRST-NAME MIDDLE-I #LAST-NAME INTO #FULL-NAME
      /*
      DISPLAY #FULL-NAME (UC==) FIRST-NAME 'I' MIDDLE-I (AL=1) NAME
    END-READ
    END

Ausgabe des Programms `COMPRX01`:

Beachten Sie vor allem die Ausgabe der mittels `COMPRESS`-Statement zusammengefassten Felder.

    Page      1                                                  04-11-11  14:15:54

              #FULL-NAME                FIRST-NAME      I         NAME
    ============================== -------------------- - --------------------

    NAME: VIRGINIA J JONES         VIRGINIA             J JONES
    NAME: MARSHA JONES             MARSHA                 JONES
    NAME: ROBERT B JONES           ROBERT               B JONES

Bei mehrzeiligen Ausgaben kann es sinnvoll sein, mit einem `COMPRESS`-Statement mehrere Felder/Text in einer Benutzervariablen zusammenzufassen.

## Beispiele für COMPRESS-Statement

#### Beispiel 1:

Im folgenden Programm werden drei Benutzervariablen benutzt: `#FULL-SALARY`, `#FULL-NAME` und `#FULL-CITY`. In `#FULL-SALARY` beispielsweise sind der Text `'SALARY:'` sowie die Datenbankfelder `SALARY` und `CURR-CODE` zusammengefasst. Das `WRITE`-Statement referenziert lediglich die komprimierten Variablen.

    ** Example 'COMPRX02': COMPRESS
    ************************************************************************
    DEFINE DATA LOCAL
    1 VIEWEMP VIEW OF EMPLOYEES
      2 NAME
      2 FIRST-NAME
      2 SALARY       (1:1)
      2 CURR-CODE    (1:1)
      2 CITY
      2 ADDRESS-LINE (1:1)
      2 ZIP
    *
    1 #FULL-SALARY   (A25)
    1 #FULL-NAME     (A25)
    1 #FULL-CITY     (A25)
    END-DEFINE
    *
    READ (3) VIEWEMP BY CITY STARTING FROM 'NEW YORK'
      COMPRESS 'SALARY:' CURR-CODE(1) SALARY(1) INTO #FULL-SALARY
      COMPRESS FIRST-NAME NAME                  INTO #FULL-NAME
      COMPRESS ZIP CITY                         INTO #FULL-CITY
      /*
      DISPLAY 'NAME AND ADDRESS' NAME (EM=X^X^X^X^X^X^X^X^X^X^X^X)
      WRITE 1/5  #FULL-NAME
            1/37 #FULL-SALARY
            2/5  ADDRESS-LINE (1)
            3/5  #FULL-CITY
      SKIP 1
    END-READ
    END

Ausgabe des Programms `COMPRX02`:

    Page      1                                                  04-11-11  14:15:54

       NAME AND ADDRESS
    -----------------------

    R U B I N
        SYLVIA RUBIN                    SALARY: USD 17000
        2003 SARAZEN PLACE
        10036 NEW YORK

    W A L L A C E
        MARY WALLACE                    SALARY: USD 38000
        12248 LAUREL GLADE C
        10036 NEW YORK

    K E L L O G G
        HENRIETTA KELLOGG               SALARY: USD 52000
        1001 JEFF RYAN DR.
        19711 NEWARK

#### Beispiel 2:

Das folgende Programm ist wie das Programm `COMPRX02`, jedoch werden drei Felder, `NAME`, `SALARY` und `COUNTRY` im `COMPRESS`-Statement mit Editiermasken behandelt.

    ** Example 'COMPRX04': COMPRESS with Edit Mask (EM)
    ** see similar example COMPRX02 with DISPLAY statement etc.
    ************************************************************************
    DEFINE DATA LOCAL
    1 VIEWEMP VIEW OF EMPLOYEES
      2 NAME
      2 FIRST-NAME
      2 SALARY       (1:1)
      2 CURR-CODE    (1:1)
      2 CITY
      2 ADDRESS-LINE (1:1)
      2 ZIP
      2 COUNTRY
    *
    1 #FULL-SALARY   (A25)
    1 #FULL-NAME     (A25)
    1 #FULL-CITY     (A25)
    1 #COUNTRY       (A10)
    1 #NAME          (A25)
    END-DEFINE
    *
    READ (3) VIEWEMP BY CITY STARTING FROM 'NEW YORK'
      COMPRESS NAME (EM=X^X^X^X^X^X^X^X^X^X^X^X) INTO #NAME
      COMPRESS FIRST-NAME NAME                   INTO #FULL-NAME
      COMPRESS 'SALARY:' CURR-CODE(1)
               SALARY(1) (EM=ZZZ,ZZ9)            INTO #FULL-SALARY
      COMPRESS ZIP CITY                          INTO #FULL-CITY
      COMPRESS COUNTRY (EM=X'-'X'-'X)            INTO #COUNTRY
      /*
      DISPLAY 'NAME AND ADDRESS' #NAME
      WRITE 1/5  #FULL-NAME
            1/37 #FULL-SALARY
            2/5  ADDRESS-LINE (1)
            3/5  #FULL-CITY
            4/5  #COUNTRY
      SKIP 1
    END-READ
    END

Ausgabe des Programms `COMPRX04`:

    Page      1                                                  21-12-20  17:25:24

        NAME AND ADDRESS
    -------------------------

    R U B I N
        SYLVIA RUBIN                    SALARY: USD  17,000
        2003 SARAZEN PLACE
        10036 NEW YORK
        U-S-A

    W A L L A C E
        MARY WALLACE                    SALARY: USD  38,000
        12248 LAUREL GLADE C
        10036 NEW YORK
        U-S-A

    K E L L O G G
        HENRIETTA KELLOGG               SALARY: USD  52,000
        1001 JEFF RYAN DR.
        19711 NEWARK
        U-S-A

## Mathematische Funktionen

Bei der Verarbeitung arithmetischer Statements (`ADD`, `COMPUTE`, `DIVIDE`, `SUBTRACT`, `MULTIPLY`) unterstützt Natural die folgenden mathematischen Funktionen:

Mathematische Funktion | Natural-Systemfunktion
--- | ---
Absoluter Wert eines Feldes. | ABS(field)
Arcustangens eines Feldes. | ATN(field)
Kosinus eines Feldes. | COS(field)
Potenz eines Feldes (Exponential). | EXP(field)
Bruchteil (hinter dem Komma) eines Feldes. | FRAC(field)
Ganzzahliger Teil eines Feldes. | INT(field)
Natürlicher Logarithmus eines Feldes. | LOG(field)
Vorzeichen eines Feldes. | SGN(field)
Sinus eines Feldes. | SIN(field)
Quadratwurzel eines Feldes (Square Root). | SQRT(field)
Tangens eines Feldes. | TAN(field)
Numerischer Wert eines alphanumerischen Feldes. | VAL(field)

Weitere Einzelheiten zu mathematischen Funktionen finden Sie in der Systemfunktionen-Dokumentation.

## Weitere Beispiele für COMPUTE-, MOVE- und COMPRESS-Statements

Siehe folgende Beispielprogramme:

- WRITEX11 − WRITE-Statement (mit nX, n/n und COMPRESS)

- IFX03 - IF-Statement

- COMPRX03 - COMPRESS-Statement (mit Parametern LC and TC)

### On this page

- COMPUTE-Statement
- Statements MOVE und COMPUTE
- Statements ADD, SUBTRACT, MULTIPLY und DIVIDE
- Beispiel für MOVE-, SUBTRACT- und COMPUTE-Statements
- COMPRESS-Statement
- Beispiel für die Statements COMPRESS und MOVE
- Beispiele für COMPRESS-Statement
- Mathematische Funktionen
- Weitere Beispiele für COMPUTE-, MOVE- und COMPRESS-Statements