Die EVALUATE-Anweisung

Bei dieser Anweisung handelt es sich um eine Art 'Super-IF'. Mit ihrer Hilfe ist es möglich, komplexe Bedingungsstrukturen auszuwerten. Im Gegensatz zu vielen anderen Programmiersprachen kann man unter Verwendung der EVALUATE-Anweisung sogar Entscheidungstabellen umsetzen (s.u.), ohne dabei wüste IF-Abfrageschachtelungen zu entwerfen.
Nehmen wir folgendes Beispiel zur Erklärung:

Die Situation:
Wir befinden uns wieder auf der Raumstation Deep Space Nine im vierundzwanzigsten Jahrhundert, Cobol wird immer noch verwandt und ist nicht tot zu kriegen(1970 hätte auch niemand gedacht, daß die Programme teilweise noch zur Jahrtausendwende laufen).
Die Quartiere auf der Raumstation müssen in der Lage sein, sich den Lebensumständen der, in ihnen untergebrachten Lebensformen, anzupassen. In der Steuerung für die Herrichtung der Quartiere gibt es daher Unterprogramme, die für entsprechende Lebensbedingungen und Einrichtung sorgen. Dabei gilt es den gesellschaftlichen Rang des jeweiligen Individuums zu berücksichtigen.
Die Angaben hierzu werden in einem zweistelligen Zifferncode festgehalten:
Die erste Ziffer stellt dabei den Code für die Spezies dar (1=Mensch, 2=Vulkanier, 3=Klingone etc. (es ist mir klar, daß es bestimmt mehr Spezies im Star-Treck-Universum gibt, als einstellig codiert werden können - aber ist ja nur ein Beispiel)).
In der zweiten Ziffer wird der gesellschaftliche Rang der Spezies codiert. Je höher die Ziffer, desto höher der gesellschaftliche Rang des Gastes.
Die Codierung wurde in einem anderen Programm bereits vorgenommen und liegt somit vor (Raumcode). Nun sollen zunächst die Lebensbedingungen gesteuert werden, wobei der gesellsch. Rang belanglos ist. Sind keine Werte vorhanden, oder sind sie außerhalb der zuordnenbaren Bereiche, so soll das Unterprogramm OPS-Anfrage aufgerufen werden.

Problemlösung:
Man könnte hier über viele IF-Abfragen die Zuordnung der Codierung zu den entsprechenden Unterprogrammen, die die Lebensbedingungen steuern, realisieren. Da aber Cobol in unserem Beispiel noch im 24ten Jahrhundert lebt, könnte das Programmcoding unter Zuhilfenahme der EVALUATE-Anweisung in etwa so aussehen:

01 Raumcode.
   05 Lebens-KZ PIC 9.
   05 Einricht-KZ PIC 9.
          :
          :

   EVALUATE Lebens-KZ
      WHEN 1     PERFORM Human1
      WHEN 2     PERFORM Vulkan1
      WHEN 3     PERFORM Klingon1
            :
            :
      WHEN 9     PERFORM Ferenghi1
      WHEN OTHER PERFORM OPS-Anfrage
   END-EVALUATE


Man könnte auch den gesamten Raumcode auswerten (10-19 Mensch, 20-29 Vulkanier etc;), dann sähe das so aus:

01 Raumcode PIC 99.

          :
          :

   EVALUATE Raumcode
      WHEN 10 THRU 19 PERFORM Human1
      WHEN 20 THRU 29 PERFORM Vulkan1
      WHEN 30 THRU 39 PERFORM Klingon1
          :
          :
      WHEN 90 THRU 99 PERFORM Ferenghi1
      WHEN OTHER      PERFORM OPS-Anfrage
   END-EVALUATE


Erklärung bis hier hin:
Bei diesem Beispiel wäre es noch relativ einfach, die Auswahl mit IF-Abfragen zu gestalten. Das sähe für die zweite Variante in etwa so aus:

01 Raumcode PIC 99.

          :
          :

IF Raumcode >= 10 AND Raumcode <= 99 THEN 
   IF Raumcode >= 10 AND Raumcode <= 19 THEN PERFORM Human1
   IF Raumcode >= 20 AND Raumcode <= 29 THEN PERFORM Vulkan1
   IF Raumcode >= 30 AND Raumcode <= 39 THEN PERFORM Klingon1
          :
          :
   IF Raumcode >= 90 AND Raumcode <= 99 THEN PERFORM Ferenghi1
ELSE PERFORM OPS-Anfrage
END-IF


Man sieht, daß hier zunächst hinter EVALUATE Raumcode steht. Hierbei handelt es sich um das sog. Auswahlsubjekt. Die Angabe die hinter WHEN steht, nennt man Auswahlobjekt, auf das die Aktion folgt.

Auswahlsubjekt:
Hierbei handelt es sich, wie der Name schon sagt, um das Subjekt der Auswertung
- Was soll ausgewertet werden

Auswahlobjekt:
Dieses bezieht sich auf das Auswahlsubjekt. Diese Bezugnahme muß zutreffen um die darauffolgende Aktion auszulösen.
- Wie soll das Auswahlsubjekt ausgewertet werden

Die Aktion:
Ist das, was geschehen soll, wenn die Bezugnahme des Auswahlsubjektes auf das konkrete Auswahlobjekt zutrifft. Ergeben sich mehrere Treffer, so wird in der Reihenfolge der WHEN-Zusätze die erste Aktion ausgeführt. Die nachfolgenden Treffer werden nichtmehr berücksichtigt.
- Was soll geschehen?

THRU / THROUGH
Mit Hilfe dieser Angabe ist es möglich, innerhalb der EVALUATE-Anweisung Wertebereiche zu überprüfen. Im zweiten EVALUATE-Beispiel wird vom Auswahlsubjekt 'Raumcode' jeweils ein Bereich (10-19, 20-29 etc.) geprüft. Jetzt ist es egal, ob das Auswahlobjekt in diesem Fall 11 oder 17 beinhaltet denn stets wird dieselbe Aktion ausgeführt, da sich sowohl 11 als auch 17 im Intervall von 10 bis 19 befinden.

ALSO
Sollen mehrere Auswahlsubjekte untersucht werden, so kann man die ALSO-Angabe nutzen.
Nehmen wir für das erste Beispiel an, daß unser kleines Coding nichtnur die Lebensbedingungen spezifizieren soll, sondern je nach dem, ob der gesellschaftliche Status <= 5 oder > 5 ist, verschiedene Einrichtungsprogramme aufrufen. Unter Verwendung der ALSO-Angabe würde die EVALUATE-Anweisung im Coding dann so aussehen:

01 Raumcode.
   05 Lebens-KZ PIC 9.
   05 Einricht-KZ PIC 9.
          :
          :

   EVALUATE Lebens-KZ ALSO Einricht-KZ
      WHEN 1 ALSO 1 THRU 5 PERFORM Human1b
      WHEN 1 ALSO 6 THRU 9 PERFORM Human1a
      WHEN 2 ALSO 1 THRU 5 PERFORM Vulkan1b
      WHEN 2 ALSO 6 THRU 9 PERFORM Vulkan1a
      WHEN 3 ALSO 1 THRU 5 PERFORM Klingon1b
      WHEN 3 ALSO 6 THRU 9 PERFORM Klingon1a
          :
          :
      WHEN 9 ALSO 1 THRU 5 PERFORM Ferenghi1b
      WHEN 9 ALSO 6 THRU 9 PERFORM Ferenghi1a
      WHEN OTHER PERFORM OPS-Anfrage
   END-EVALUATE


Hier möge sich jeder selber ausdenken, welch eines Aufstandes es bedürfte um das obrige Coding mit der IF-Anweisung umzusetzen.

ANY
Die ANY-Angabe kann Anstelle eines Auswahlobjektes angegeben werden.
Im Beispiel könnte man sagen, daß allen Spezies, wenn sie im Rang über 5 liegen, eine Erfrischung zur Begrüßung kredenzt werden soll. Um diesen Mechanismus in Gang zu setzen, wird ein "D" in der Variable Drink untergebracht.Diese Variable soll dann später abgefragt werden. Man müßte die EVALUATE-Anweisung in diesem Falle um eine Zeile erweitern:

01 Drink PIC X.
01 Raumcode.
   05 Lebens-KZ PIC 9.
   05 Einricht-KZ PIC 9.
          :
          :

   EVALUATE Lebens-KZ ALSO Einricht-KZ
      WHEN ANY ALSO 6 THRU 9 MOVE "D" TO Drink
      WHEN 1   ALSO 1 THRU 5 PERFORM Human1b
      WHEN 1   ALSO 6 THRU 9 PERFORM Human1a
      WHEN 2   ALSO 1 THRU 5 PERFORM Vulkan1b
      WHEN 2   ALSO 6 THRU 9 PERFORM Vulkan1a
      WHEN 3   ALSO 1 THRU 5 PERFORM Klingon1b
      WHEN 3   ALSO 6 THRU 9 PERFORM Klingon1a
          :
          :
      WHEN 9   ALSO 1 THRU 5 PERFORM Ferenghi1b
      WHEN 9   ALSO 6 THRU 9 PERFORM Ferenghi1a
      WHEN OTHER PERFORM OPS-Anfrage
   END-EVALUATE


Wird ANY als Auswahlobjekt verwandt, so ist das korrespondierende Auswahlsubjekt für jeden Ausgang zutreffend. Alle Spezies ab einem gewissen gesellschaftlichen Rang erhalten einen Begrüßungsdrink (Variable "Drink" wird auf 'D' gesetzt).

TRUE und FALSE
Mit Hilfe dieser Angabe kann der Wahrheitsgehalt einer Bedingung abgefragt werden. Hierbei ist es egal, ob TRUE als Auswahlsubjekt oder -objekt angegeben wird. Wird es als Subjekt angegeben, muß das korrespondierende Objekt eine Bedingung sein oder umgekehrt.

01 Wert1 PIC 9(3).
01 Wert2 PIC 9(3).
01 AWert PIC X.
01 Dummy PIC X.
          :
          :

EVALUATE TRUE ALSO Wert1 > Wert2
   WHEN AWert = "D" ALSO FALSE MOVE "X" TO Dummy
END-EVALUATE


Hier wird also das Zeichen 'X' in die Variable "Dummy" übertragen, wenn in "AWert" ein 'D' steht und Wert1 kleiner/gleich Wert2 ist.

Entscheidungstabellen codieren
Wie bereits oben erwähnt, ist es mittels EVALUATE-Anweisung möglich, Entscheidungstabellen zu codieren. Dabei stellen die Bedingungen der Entscheidungstabelle die Auswahlsubjekte, die Regeln die Auswahlobjekte und die Aktionen eben dieselben dar.
Zur Verdeutlichung soll uns das erste Beispiel aus dem Kapittel Entscheidungstabelle dienen. Die Tabelle sah nach ihrer Konsolidierung und der Anwendung der Else-Regel wie folgt aus:

Personal.tab - 1 -  - 2 -  - Else - 
praktische Erfahrung -  N   
Hochschulstudium N  J    
akadem. Laufbahn N  N   
 
Gesprächseinladung drucken   X  X 
Absage drucken X     
In Kandidatenliste aufnehmen     X 

Die Codierung dieser Tabelle mittels EVALUATE-Anweisung würde folgendermaßen aussehen:

88 Erfahrung VALUE 1.
88 Studium VALUE 1.
88 Laufbahn VALUE 1.
          :
          :

EVALUATE Erfahrung ALSO Studium ALSO Laufbahn
   WHEN ANY ALSO FALSE ALSO FALSE 
      PERFORM Absage-drucken
   WHEN FALSE ALSO TRUE ALSO FALSE
      PERFORM Einladung-drucken
   WHEN OTHER
      PERFORM Einladung-drucken
      PERFORM Listeneintrag
END-EVALUATE


...