Datenberechnungen

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

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

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

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:

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.

Beispiel für COMPRESS-Statement

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

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: