*MINVAL
|
([ (IR =result-format/length)] operand,...)
|
||
*MAXVAL
|
format/length
: Format und Länge
können entweder explizit mit der IR
-Klausel angegeben oder
automatisch mit Hilfe den unten aufgeführten Tabellen errechnet werden, siehe
Tabelle für die
Konvertierung der
resulting-format/length
-Werte.
Die folgenden Themen werden behandelt:
Die Natural-Systemfunktion *MINVAL
bzw.
*MAXVAL
wertet die Minimal-/Maximalwerte aller gegebenen Operanden
aus. Das Ergebnis ist immer ein Skalarwert. Wird ein Array als Operand
angegeben, dann wird der Minimal- bzw. Maximalwert aller Array-Felder
ausgewertet.
Wenn bei Verwendung von alphanumerischen oder binären Daten dieselben
Daten als Argument angegeben sind, (z.B. *MINVAL('AB','AB')
), dann
ist das Ergebnis das Argument mit dem kleinsten/größten Längenwert.
Für die Verwendung der Systemfunktion
*MINVAL
/*MAXVAL
gelten folgende Einschränkungen:
*MINVAL
/*MAXVAL
darf nicht an Stellen
verwendet werden, an denen eine Zielvariable erwartet wird.
*MINVAL
/*MAXVAL
darf nicht in einer anderen
Systemfunktion verschachtelt werden
Operand | Possible Structure | Possible Formats | Referencing Permitted | Dynamic Definition | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand | C | S | A | G | A | U | N | P | I | F | B | D | T | yes | no |
Syntax-Elementbeschreibung:
Schlüsselwort | Beschreibung |
---|---|
*MINVAL
|
Berechnet den Mininalwert aller gegebenen Operandenwerte. |
*MAXVAL
|
Berechnet den Mininalwert aller gegebenen Operandenwerte. |
operand
|
Der Operand bzw. die Operanden, deren Minimal-/Maximalwert(e)
von der Systemfunktion *MINVAL bzw. *MAXVAL errechnet
werden soll.
|
result-format-length
|
IR -Klausel zur expliziten Angabeder resultierenden
Format/Länge-Werte. Siehe unten.
|
Diese Klausel kann zur expliziten Angabe der
result-format/length
-Werte für die
gesamte Systemfunktion *MINVAL
bzw. *MAXVAL
verwendet
werden.
IR=result-format/length
IR=
|
format-length | ||||||
(
|
|
)
DYNAMIC
|
Eine Aufstellung der gültigen result-format/length-Werte ist im Abschnitt Tabelle für die Konvertierung der resulting-format/length-Werte enthalten.
Syntax-Elementbeschreibung:
Beispiel:
DEFINE DATA LOCAL 1 #RESULTI (I4) 1 #RESULTA (A20) 1 #RESULTADYN (A) DYNAMIC 1 #A(I4) CONST <1234> 1 #B(A20) CONST <H'30313233'> /* '0123' stored 1 #C(I2/1:3) CONST <2000, 2100, 2200> END-DEFINE * #RESULTA := *MAXVAL((IR=A20) #A, #B) /*no error, I4->A20 is allowed! #RESULTADYN := *MAXVAL((IR=(A)DYNAMIC) #A, #B) /*result is (A) dynamic /* #RESULTI := *MAXVAL((IR=I4) #A, #B) /*compiler error, because conv. A20->I4 is not allowed! #RESULTI := *MAXVAL((IR=I4) #A, #C(*)) /*maximum of the array is evaluated DISPLAY #RESULTA #RESULTADYN (AL=10) #RESULTI END
Es gibt zwei Arten, die resultierenden Format-/Längenwerte für die
gesamte Systemfunktion *MINVAL
/*MAXVAL
anzugeben.
Die resultierenden Format-/Längenwerte für die gesamte Systemfunktion
*MINVAL
bzw. *MAXVAL
können mit der
IR
-Klausel angegeben werden. Alle angegebenen Operanden werden in
die mit dieser Klausel festgelegten resultierenden Format-/Längenwerte
umgewandelt, wenn dies ohne Einbußen bezüglich der Genauigkeit möglich ist.
Anschließend erfolgt die Berechnung der Minimal- bzw. Maximalwerte aller
umgewandelten Operanden, und es wird ein einziger Skalarwert mit dem
errechneten Format-/Längenwert als Ergebnis für die gesamte Systemfunktion
festgelegt.
Wenn keine IR
-Klausel in der Systemfunktion
*MINVAL
bzw. *MAXVAL
verwendet wird, erfolgt die
Berechnung der resultierenden Format-/Längenwerte anhand der Formate/Längen
aller in der Systemfunktion als Argument angegebenen Operanden. Dabei wird der
format/length
-Wert jedes einzelnen
Operanden genommen und mit dem
format/length
-Wert des darauf folgenden
Operanden in der Argument-Liste zusammengefasst. Der resultierenden
Format-/Längenwert von zwei einzelnen Operanden wird dann gemäß der unten
aufgeführten Tabellen errechnet.
Die Tabelle für die Konvertierung der
resulting-format/length
-Werte ist in
zwei Untertabellen aufgeteilt. Kombinationen, die nicht in diesen beiden
Tabellen aufgeführt sind, sind ungültig und dürfen in der Argument-Liste der
Systemfunktion *MINVAL
bzw. *MAXVAL
nicht verwendet
werden. Das Schlüsselwort FLF
gibt an, wann zur Vermeidung von
Ungenauigkeiten die IR
-Klausel zur Festlegung des resultierenden
Format-/Längenwertes benutzt werden muss.
Enthält alle nummerischen Kombinationsmöglichkeiten für zwei verschiedene Operanden.
Zweiter Operand | ||||||
---|---|---|---|---|---|---|
Format/Länge | I1 | I2 | I4 | Pa.b, Na.b | F4, F8 | |
Erster Operand | I1 | I1 | I2 | I4 | Pmax(3,a).b | F8 |
I2 | I2 | I2 | I4 | Pmax(5,a).b | F8 | |
I4 | I4 | I4 | I4 | Pmax(10,a).b | F8 | |
Px.y, Nx.y | Pmax(3,x).y | Pmax(5,x).y | Pmax(10,x).y |
wenn max(x,a) +
max(y,b) <= 29 |
wenn y=0 und
x <=15; |
|
F4, F8 | F8 | F8 | F8 |
wenn b=0 und
a <=15 |
F8 |
Legende:
FLF | Format-/Längenangabe mittels IR -Klausel zwingend
erforderlich.
|
---|---|
Ix | Format/Länge ist Integer (Ganzzahl). x gibt die Anzahl der Bytes an, die zum Speichern des Integer-Wertes benutzt werden. |
Fx | Format/Länge ist Float (Gleitkomma). x gibt die Anzahl der Bytes an, die zum Speichern des Float-Wertes benutzt werden. |
Px.y |
Format ist Packed (gepackt) mit entsprechender Anzahl an Stellen vor dem Dezimalpunkt (x,a) und der Genauigkeit (y,b). |
Nx.y |
Format ist Numeric (nummerisch) mit entsprechender Anzahl an Stellen vor dem Dezimalpunkt (x,a) und der Genauigkeit (y,b). |
Pmax(c,d).e | Das resultierende Format ist Packed (gepackt). Die Berechnung der Länge erfolgt anhand der nachfolgenden Informationen. Die Anzahl an Stellen vor dem Dezimalpunkt ist der Maximalwert von c und d. Der Genauigkeitswert ist e. |
Pmax(c,d).max(e,f) | Das resultierende Format ist Packed (gepackt). Die Berechnung der Länge erfolgt anhand der nachfolgenden Informationen. Die Anzahl an Stellen vor dem Dezimalpunkt ist der Maximalwert von c und d. Der Genauigkeitswert ist der Maximalwert von e und f. |
Enthält alle Formate und Längen, die für Operanden in den
Systemfunktionen *MINVAL
/*MAXVAL
verwendet werden
können.
Zweiter Operand | ||||||
---|---|---|---|---|---|---|
Format-length | D | T | Aa, A dynamic | Ba, B dynamic | Ua, U dynamic | |
Erster Operand | D | D | T | NA | NA | NA |
T | T | T | NA | NA | NA | |
Ax, A dynamic | NA | NA | A dynamic | A dynamic | U dynamic | |
Bx, B dynamic | NA | NA | A dynamic | B dynamic | U dynamic | |
Ux, U dynamic | NA | NA | U dynamic | U dynamic | U dynamic |
Legende:
NA | Unzulässige Kombination. |
---|---|
D | Datenformat. |
T | Zeitformat. |
Bx, Ba | Binärformat mit Länge x, a. |
Ax, Aa | Alphanumerisches Format mit Länge x, a. |
Ux, Ua | Unicode-Format mit Länge x, a. |
B dynamic | Binärformat mit dynamischer Länge. |
A dynamic | Alphanumerisches Format mit dynamischer Länge. |
U dynamic | Unicode-Format mit dynamischer Länge. |
Anhand der oben aufgeführten Regeln ist der Compiler in der Lage, die Source-Operanden unter Berücksichtigung von Operandenpaaren zu verarbeiten und die Zwischenergebnisse für jedes Paar zu berechnen. Das erste Paar besteht aus dem ersten und dem zweiten Operand, das zweite Paar aus dem Zwischenergebnis und dem dritten Operand usw. Nach Verarbeitung aller Operanden stellt das letzte Ergebnis den Vergleich zwischen Format und Länge dar, die zum Vergleich mit allen Operanden zwecks Berechnung des Minimal- bzw. Maximalwertes verwendet werden. Bei Verwendung dieser Format-/Längenberechnungsmethode können die Operanden in beliebiger Reihenfolge auftreten.
Beispiel:
DEFINE DATA LOCAL 1 A (I2) INIT <34> 1 B (P4.2) INIT <1234.56> 1 C (N4.4) INIT <12.6789> 1 D (I1) INIT <100> 1 E (I4/1:3) INIT <32, 6745, 456> 1 #RES-MIN (P10.7) 1 #RES-MAX (P10.7) END-DEFINE * MOVE *MINVAL(A, B, C, D, E(*)) TO #RES-MIN MOVE *MAXVAL(A, B, C, D, E(*)) TO #RES-MAX DISPLAY #RES-MIN #RES-MAX END
Ausgabe:
#RES-MIN #RES-MAX --------------------------- --------------------------- 12.6789000 6745.0000000
Die folgende Tabelle zeigt die einzelnen Schritte zur automatischen Format-/Längenberechnung im obigen Beispiel. Sie enthält die Zwischenergebnisse (ir) aller Schritte und den Format-/Längenwert des Vergleichs (cf), der als result-format/length-Wert verwendet wird.
Berechnungs- |
Name des ersten Operanden | Format/Länge des ersten Operanden bzw. Zwischenergebnis (ir) | Name des zweiten Operanden | Format/Länge des zweiten Operanden bzw. Zwischenergebnis (ir) | Format/Länge des Zwischenergebnisses(ir) |
---|---|---|---|---|---|
1. | A | I2 | B | P4.2 | ir1 = P5.2 |
2. | ir1 | P5.2 | C | N4.4 | ir2 = P5.4 |
3. | ir2 | P5.4 | D | I1 | ir3 = P5.4 |
4. | ir3 | P5.4 | E | I4 | cf = P10.4 |
Zur Laufzeit werden alle Operanden in die cf-Format/Länge umgewandelt. Danach werden alle umgewandelten Werte miteinander verglichen und der entsprechende Minimal- bzw. Maximalwert wird errechnet.
Wenn nur ein einzelner Operand angegeben wird, hat result-format-length der Format-/Längenwert dieses Operanden.
Wenn ein binärer Operand mit einer Länge im Bereich von 1 - 4 als
Argument innerhalb der Systemfunktion *MINVAL
/*MAXVAL
zusammen mit einem alphanumerischen oder einem Unicode-Operanden angegeben
wird, dann wird das Zwischenergebnis
(result-format-length) als alphanumerisches bzw. als
Unicode-Format mit dynamischer Länge bewertet.
In diesem Fall wird der Wert des binären Operanden als numerischer Wert betrachtet, der gemäß den Datenübertragungsregeln in das result-format-length umgewandelt wird (der binäre numerische Wert wird in das Format Upacked gewandelt), bevor der Minimal-/Maximalwert berechnet wird.
Beispiel:
DEFINE DATA LOCAL 1 #B4 (B4) INIT <1> 1 #A10(A10) INIT <"2"> END-DEFINE WRITE "=" *MAXVAL(#A10, #B4) (AL=60) /* RESULT FORMAT-LENGTH IS (A)DYNAMIC: "2" WRITE "=" *MINVAL(#A10, #B4) (AL=60) /* RESULT FORMAT-LENGTH IS (A)DYNAMIC: "1" END
Der Zwischenwert result-format-length
(#A10
, #B4
) ist A dynamisch.
Daher wird zunächst #A10
nach A dynamisch gewandelt,
ebensowie #B4
nach A dynamisch gewandelt wird (unter
Berücksichtigung der Datenübertragungsregeln), bevor das Zwischenergebnis der
beiden Operanden berechnet wird.
Die folgende Grafik zeigt die Reihenfolge, in der die Berechnung von Format und Länge erfolgt:
Legende:
ir1, ir2, ir3 | Zwischenergebnis (intermediate result) 1, 2, 3. |
---|---|
cf | Resultierende Vergleich-Format- und Längewerte (comparison). |