Dieses Kapitel behandelt die zur Berechnung von Daten verwendeten arithmetischen Statements:
Außerdem werden die folgenden Statements behandelt, 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:
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. |
COMPUTE LEAVE-DUE = LEAVE-DUE * 1.1
Der Wert des Feldes LEAVE-DUE wird mit 1,1 multipliziert und
das Ergebnis in das Feld LEAVE-DUE gestellt.
COMPUTE #A = SQRT (#B)
Die Quadratwurzel des Feldwertes von #B wird errechnet und dem Feld
#A zugewiesen. SQRT (Square Root) 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 mathematischen Funktionen finden Sie im Abschnitt Mathematische Funktionen.
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.
Mit den Statements MOVE und
COMPUTE stellen Sie den Wert
eines Operanden in ein oder mehrere Felder. Der Operand kann eine Konstante (z.B. Text oder eine Zahl), eine 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:
MOVE NAME TO #LAST-NAME COMPUTE #LAST-NAME = NAME
Mit den Statements ADD, SUBTRACT, MULTIPLY und DIVIDE können Sie Rechenoperationen
ausführen.
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.
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
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.
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.
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.
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
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
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.
Siehe folgende Beispielprogramme: