Funktion
Die EVALUATE-Anweisung beschreibt eine Struktur von Mehrfachverzweigungen und Mehrfachverbindungen. Sie kann die Auswertung mehrfacher Bedingungen bewirken. Die nachfolgenden Schritte des Programms hängen von den Ergebnissen dieser Auswertung ab.
Format
EVALUATE {bezeichner-1 | literal-1 | ausdruck-1 | TRUE | FALSE }
[ALSO {bezeichner-2 | literal-2 | ausdruck-2 | TRUE | FALSE} ]... | ||||||||
{ | { |
| { |
| ||||
| { |
| ||||||
|
| |||||||
] | ||||||||
} | ||||||||
} | ||||||||
[ | ALSO | { | ANY | bedingung-2 | teilbedingung-2 | TRUE | FALSE | |||||
| [NOT] | { | {bezeichner-5 | literal-5 | arithm-ausdruck-3} | ||||||
|
| |||||||
] | ||||||||
} | ||||||||
} | ||||||||
]... | ||||||||
}... | ||||||||
unbedingte-anweisung-1 | ||||||||
} ... |
[WHEN OTHER unbedingte-anweisung-2]
[END-EVALUATE]
Syntaxregeln
Die Operanden oder die Wörter TRUE und FALSE vor der ersten WHEN-Angabe der EVALUATE-Anweisung sind einzeln betrachtet Auswahlsubjekte (Subjekte) und insgesamt gesehen eine Folge von Auswahlsubjekten (Subjektfolge oder Subjektvektor).
Die Operanden oder die Wörter TRUE, FALSE und ANY in einer WHEN-Angabe sind einzeln betrachtet Auswahlobjekte (Objekte) und insgesamt gesehen eine Folge von Auswahlobjekten (Objektfolge oder Objektvektor).
Die Wörter THROUGH und THRU bedeuten das gleiche.
Zwei durch THROUGH verbundene Operanden müssen der gleichen Datenklasse angehören. Sie bilden ein einzelnes Objekt. Die verbundenen Operanden dürfen weder von der Klasse objekt noch von der Klasse zeiger sein.
Die Anzahl der Objekte innerhalb einer Objektfolge muss der Anzahl der Subjekte entsprechen.
Jedes Objekt einer Objektfolge muss mit demjenigen Subjekt einer Subjektfolge übereinstimmen, das die gleiche Position in der Reihenfolge besitzt, und zwar nach folgenden Regeln:
Bezeichner, Literale oder arithmetische Ausdrücke eines Objekts müssen für den Vergleich mit dem entsprechenden Subjekt gültige Operanden sein - gemäß den Regeln für Vergleichsbedingungen.
bedingung-1, bedingung-2, TRUE oder FALSE in einer Objektfolge müssen einem Bedingungsausdruck oder den Wörtern TRUE oder FALSE in der Subjektfolge entsprechen.
Das Wort ANY kann jeder Kategorie von Subjekten entsprechen.
teilbedingung-1 oder teilbedingung-2 darf nicht mit einem arithmetischen Operator beginnen.
teilbedingung-1 oder teilbedingung-2 in einer Objektfolge müssen einem Bezeichner, einem Literal oder einem arithmetischen Ausdruck in der Subjektfolge entsprechen. Sie müssen so angegeben werden, dass durch das Einfügen des entsprechenden Subjekts vor der Teilbedingung eine gültige einfache Bedingung entsteht.
Allgemeine Regeln
Die Ausführung der EVALUATE-Anweisung wirkt so, als ob jedes Subjekt und jedes Objekt ausgewertet und ihnen ein numerischer oder nichtnumerischer Wert, ein Bereich mit numerischen oder nichtnumerischen Werten oder ein Wahrheitswert zugewiesen würde. Diese Werte sind wie folgt festgelegt:
Jedes durch bezeichner-1, bezeichner-2 angegebene Subjekt und jedes durch bezeichner-3, bezeichner-5 ohne NOT oder THROUGH angegebene Objekt erhält Wert und Datenklasse des durch Bezeichner repräsentierten Datenfeldes.
Jedes durch literal-1, literal-2 angegebene Subjekt und jedes durch literal-3, literal-5 ohne NOT oder THROUGH angegebene Objekt erhält Wert und Datenklasse des durch Literal repräsentierten Datenfeldes. Ist literal-3, literal-5 die figurative Konstante ZERO, wird die Datenklasse des entsprechenden Subjektes zugewiesen.
Jedem Subjekt, in dem ausdruck-1, ausdruck-2 ein arithmetischer Ausdruck ist, und jedem Objekt ohne NOT oder THROUGH, in dem arithm-ausdruck-1, arithm-ausdruck-3 angegeben ist, wird ein numerischer Wert - gemäß den Regeln der Auswertung arithmetischer Ausdrücke - zugewiesen.
Jedem Subjekt, in dem ausdruck-1, ausdruck-2 ein Bedingungsausdruck ist, und jedem Objekt mit bedingung-1, bedingung-2 werden Wahrheitswerte - gemäß den Regeln der Auswertung von Bedingungsausdrücken - zugewiesen.
Jedem durch TRUE oder FALSE angegebenen Subjekt oder Objekt wird ein Wahrheitswert zugewiesen. Der Wahrheitswert „wahr“ bezieht sich auf die Datenfelder, die mit TRUE, der Wahrheitswert „falsch“ auf die Datenfelder, die mit FALSE angegeben sind.
Jedes Objekt, das durch das Wort ANY bezeichnet ist, wird nicht weiter ausgewertet.
Ist für ein Objekt THROUGH ohne NOT angegeben, umfasst der Wertebereich alle zulässigen Werte des Subjekts, die größer oder gleich dem ersten Operanden und kleiner oder gleich dem zweiten Operanden sind.
Ist für ein Objekt NOT angegeben, umfasst der Wertebereich alle zulässigen Werte des Subjekts, die nicht gleich dem Wert sind bzw. nicht in dem Wertebereich liegen, der ohne NOT-Angabe dem Datenfeld zugewiesen worden wäre.
Ist für ein Objekt eine Teilbedingung angegeben, so wird ihm der Wahrheitswert der Bedingung zugewiesen, die sich durch das Anfügen des Objekts an das Ergebnis der Auswertung des zugehörigen Subjekts ergibt.
Die EVALUATE-Anweisung wird so ausgeführt, als ob die den Subjekten und Objekten zugewiesenen Werte miteinander verglichen werden, um festzustellen, ob eine WHEN-Angabe die Bedingungen der Subjektfolge erfüllt. Dieser Vergleich läuft wie folgt ab:
Jedes einzelne Objekt innerhalb der Objektfolge der ersten WHEN-Angabe wird mit dem Subjekt verglichen, das innerhalb der Subjektfolge dieselbe Position in der Reihenfolge besitzt. Dabei muss eine der folgenden Bedingungen erfüllt sein:
Sind den zu vergleichenden Datenfeldern numerische oder nichtnumerische Werte oder ein Bereich von numerischen oder nichtnumerischen Werten zugewiesen, so ist der Vergleich dann erfüllt, wenn der dem Objekt zugewiesene Wert oder Wert des Bereichs gleich dem Wert ist, der dem Subjekt zugewiesen wurde (siehe „Vergleichsbedingung").
Ist das Objekt eine Teilbedingung, so ist der Vergleich dann erfüllt, wenn dem Objekt der Wahrheitswert „wahr“ zugewiesen wurde.
Wurden den zu vergleichenden Datenfeldern Wahrheitswerte zugewiesen, so ist der Vergleich dann erfüllt, wenn den Datenfeldern der gleiche Wahrheitswert zugewiesen wird.
Ist das zu vergleichende Objekt mit ANY angegeben, so ist der Vergleich immer erfüllt, egal, welchen Wert das Subjekt hat.
Ist der oben genannte Vergleich für jedes Objekt der zu vergleichenden Objektfolge erfüllt, so wird die WHEN-Angabe, die diese Objektfolge enthält, als diejenige ausgewählt, die die Bedingungen der Subjektfolge erfüllt.
Ist der oben genannte Vergleich für ein oder mehrere Objekte der Objektfolge nicht erfüllt, so erfüllt die Objektfolge nicht die Bedingungen der Subjektfolge.
Dieser Vorgang wiederholt sich für alle weiteren Objektfolgen in der Reihenfolge ihres Auftretens in der Übersetzungseinheit solange, bis entweder eine WHEN-Angabe ausgewählt ist, die die Bedingungen der Subjektfolge erfüllt, oder bis alle Objektfolgen verglichen sind.
Ist die Vergleichsoperation beendet, wird die Ausführung der EVALUATE-Anweisung folgendermaßen fortgesetzt:
Wurde eine WHEN-Angabe ausgewählt, wird die Ausführung mit der ersten unbedingten Anweisung, die dieser WHEN-Angabe folgt, fortgesetzt. Nach Ausführung der letzten unbedingten Anweisung wird zu END-EVALUATE verzweigt.
Wurde keine WHEN-Angabe ausgewählt und eine WHEN OTHER-Angabe gemacht, wird die Ausführung mit der unbedingten Anweisung der WHEN OTHER-Angabe fortgesetzt.
Eine EVALUATE-Anweisung ist beendet, wenn eine der folgenden Bedingungen erfüllt ist:
unbedingte-anweisung-1 der ausgewählten WHEN-Angabe ist ausgeführt,
unbedingte-anweisung-2 ist ausgeführt,
es wurde keine WHEN-Angabe ausgewählt und keine WHEN OTHER-Angabe gemacht.
Beispiel 8-36
IDENTIFICATION DIVISION. PROGRAM-ID. EVAL1. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. TERMINAL IS T. DATA DIVISION. WORKING-STORAGE SECTION. 77 A PIC 9. 77 B PIC 9. 77 C PIC 9. 77 D PIC 9. PROCEDURE DIVISION. PROC SECTION. DIALOG. DISPLAY "Wert fuer A eingeben" UPON T. ACCEPT A FROM T. DISPLAY "Wert fuer B eingeben" UPON T. ACCEPT B FROM T. DISPLAY "Wert fuer C eingeben" UPON T. ACCEPT C FROM T. DISPLAY "Wert fuer D eingeben" UPON T. ACCEPT D FROM T. TEST1. EVALUATE A + B ALSO C + D WHEN 5 ALSO 5 DISPLAY "Werte richtig" UPON T WHEN OTHER DISPLAY "Werte falsch" UPON T END-EVALUATE. ENDE. STOP RUN.
Beispiel 8-37
IDENTIFICATION DIVISION. PROGRAM-ID. BSP. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. TERMINAL IS T. DATA DIVISION. WORKING-STORAGE SECTION. 01 BESTELLART PIC 9. 88 VORORT VALUE 1. 88 SCHRIFTLICH VALUE 2 THRU 4. 01 KUNDENART PIC X. 88 PRIVAT VALUE "1". 88 GEWERBLICH VALUE "2". 01 GEWICHT PIC 9999. 01 VERSANDART PIC 9. 88 ABHOLUNG VALUE 1. 88 POST VALUE 2. 88 BAHN VALUE 3. 88 UPS VALUE 4. PROCEDURE DIVISION. PROC SECTION. DIALOG. DISPLAY "Bestellart eingeben" UPON T. DISPLAY " Vorort = 1, Schriftlich = 2-4 " UPON T. ACCEPT BESTELLART FROM T. DISPLAY "Kundenart eingeben" UPON T. DISPLAY "Gewerblich = 2 , Privat = 1 " UPON T. ACCEPT KUNDENART FROM T. DISPLAY "Gewicht eingeben" UPON T. ACCEPT GEWICHT FROM T. BESTIMMUNG-VERSANDART. EVALUATE TRUE ALSO TRUE ALSO TRUE WHEN PRIVAT ALSO VOR-ORT ALSO ANY WHEN GEWERBLICH ALSO VOR-ORT ALSO ANY SET ABHOLUNG TO TRUE WHEN PRIVAT ALSO SCHRIFTLICH ALSO GEWICHT < 5 SET POST TO TRUE WHEN GEWERBLICH ALSO SCHRIFTLICH ALSO GEWICHT < 10 SET UPS TO TRUE WHEN OTHER SET BAHN TO TRUE END-EVALUATE. AUSGABE. DISPLAY "Versandart = " VERSANDART UPON T. STOP RUN.
Erläuterungen
Die Objekte VORORT, SCHRIFTLICH, PRIVAT, GEWERBLICH (= Bedingungsnamen) werden auf ihre Wahrheitswerte hin abgeprüft. Die Subjekte werden durch die drei TRUE dargestellt; alle drei Subjekte (= Subjektfolge) besitzen den Wahrheitswert „Wahr“. Eine Objektfolge erfüllt dann die Bedingung der Subjektfolge, wenn alle Objekte innerhalb der Folge, außer die durch ANY bezeichneten, den Wahrheitswert „Wahr“ zugewiesen bekommen (eine WHEN-Angabe entspricht einer Objektfolge). Die dieser WHEN-Angabe folgende Anweisung wird dann ausgeführt. Erfüllt keine der angegebenen Objektfolgen den Vergleich, so wird die Anweisung der WHEN OTHER-Angabe ausgeführt. Die Angabe ANY muss in den ersten beiden WHEN-Angaben verwendet werden, da in ihnen nur zwei und in den anderen WHEN-Angaben drei Bedingungsnamen auf ihren Wahrheitswert hin abgeprüft werden und die Anzahl der Objekte innerhalb der Objektfolge der Anzahl der Subjekte entsprechen muss.