Die PERFORM-Anweisung

Mit Hilfe dieser Anweisung wird der Aufruf von internen Unterprogrammen realisiert. Nach der Abarbeitung des Unterprogramms wird das Programm mit dem, auf die PERFORM-Anweisung folgenden Befehl fortgesetzt. Die einfachste Art des Syntax lautet daher:

    PERFORM Unterprogramm.
    Anweisung.
          :
          :
Unterprogramm.
    Anweisung.
    Anweisung.

Unterprogramm1.


'Unterprogramm' stellt hierbei eine Sprungmarke (im A-Bereich) dar. Sowohl die PERFORM-Anweisung selber als auch die von ihr aufgerufene Prozedur können überall in der PROCEDURE DIVISION stehen.

OUT-OF-LINE-PERFORM
Die bisher beschiebene Art, interne Unterprogramme ausführen zu lassen, wird auch als OUT-OF-LINE-PERFORM bezeichnet. Im Beispiel würde das Programm nach PERFORM Unterprogramm zur Sprungmarke Unterprogramm springen und alle Anweisungen dieser Prozedur ausführen, bis es auf einen neuen Prozedurnamen (hier: Unterprogramm1) stößt. Danach wird das Programm in der Zeile, die auf die PERFORM-Anweisung folgt weiter ausgeführt.

IN-LINE-PERFORM
Bei dem sog. IN-LINE-PERFORM werden die auszuführenden Anweisungen direkt nach PERFORM angegeben. Die Anweisungsfolge muß dann mit END PERFORM abgeschlossen werden.

Der THRU-Zusatz
Wenn wir um beim obrigen Beispiel wollen, daß mehrere Unterprogramme (Unterprogramm und Unterprogramm1) ausgeführt werden, so kann man den THRU-Zusatz verwenden. In unserem Beispiel sähe das dann folgendermaßen aus:

PERFORM Unterprogramm THRU Unterprogramm1.

Hier würden alle Anweisungen, die zwischen der Sprungmarke Unterprogramm und dem Ende der Prozedur Unterprogramm1 stehen, zur Ausführung gelangen. Das bedeutet, daß auch eventuell andere, in diesem Programmteil vorhandene Prozeduren ebenfalls ausgeführt werden. Nehmen wir beispielsweise an, zwischen der Prozedur Unterprogramm und der Prozedur Unterprogramm1 stünde noch die Prozedur Berechnung. In diesem Falle würde also zuerst Unterprogramm, dann Berechnung und schließlich Unterprogramm1 ausgeführt. Es ist also bei der Codierung auf die richtige Reihenfolge der Unterprogramme zu achten, will man den THRU-Zusatz verwenden.
Wenn man ein Unterprogramm als SECTION (durch anhängen des Wortes SECTION an den Namen) definiert, so werden alle in dieser SECTION vorhandenen Paragraphen ausgeführt. Erst wenn eine neue SECTION beginnt, wird nach der PERFORM-Anweisung weiter gemacht. Natürlich wird das Wort SECTION nicht zusammen mit der PERFORM-Anweisung angegeben, sondern lediglich nach dem Unterprogrammnamen:

    PERFORM Berechnungen.
          :
          :
Berechnungen SECTION.
Anzahl-ermitteln.
    ADD A TO B.
    DISPLAY B AT 0214.
Gewicht-ermitteln.
    MULTIPLY C BY D.
    DISPLAY D AT 0314.

Erfassungen SECTION.
Anzahl-erfassen.
    ACCEPT F AT 0125.
          :
          :

Hier würden also nach dem Aufruf PERFORM Berechnungen die Paragraphen Anzahl-ermitteln und Gewicht-ermitteln ausgeführt. Erst wenn das Programm auf eine neue SECTION trifft (hier: Erfassungen SECTION) wird in der Zeile die auf die PERFORM-Anweisung folgt, weiter gemacht.

Schleifen:
Wir könnten besagtes Programm auch mehrfach ausführen lassen, indem wir hinter dem Aufruf die Anzahl der Durchläufe angeben. Nehmen wir an, das Unterprogramm Berechnungen soll 10 mal ausgeführt werden so würden wir codieren:

PERFORM Berechnungen 10 TIMES.

Natürlich kann anstelle der Zahl auch eine Variable angegeben werden.

Bedingungen für die Ausführung von Unterprogrammen
Man kann Bedingungen für die Ausführung von Unterprogrammen festlegen. Dies macht vor allem Sinn, wenn das ganze Schleifencharakter hat.

UNTIL-Zusatz
Hinter diesem Zusatz, der nach dem Namen des Unterprogramms angegeben wird, kann eine Bedingung angegeben werden, die dafür sorgt, daß das Unterprogramm solange ausgeführt wird, bis die Bedingung erfüllt ist.

    PERFORM Berechnungen UNTIL B = 17.
          :
          :
Berechnungen SECTION.
Anzahl-ermitteln.
    ADD A TO B.
    DISPLAY B AT 0214.
Gewicht-ermitteln.
    MULTIPLY C BY D.
    DISPLAY D AT 0314.

Erfassungen SECTION.
Anzahl-erfassen.
    ACCEPT F AT 0125.
          :
          :

Hier hat die entstandene Schleife einen 'DO WHILE-Charakter'. Das Unterprogramm wird solange aufgerufen, bis B gleich 17 ist.

WITH TEST BEFORE/AFTER
Nutzt man den UNTIL-Zusatz, so kann man bestimmen lassen, ob die Bedingung vor oder nach dem Durchlauf des Unterprogrammes geprüft wird. Soll das Unterprogramm in keinem Fall ausgeführt werden, wenn B gleich 17 ist, so wird man vor der Ausführung des Unterprogramms prüfen lassen, ob die angegebene Bedingung bereits erfüllt ist, und erst danach die Ausführung des Unterprogramms starten. Hierzu bedient man sich des WITH TEST BEFORE-Zusatzes. Für unser Beispiel sähe das folgendermaßen aus:

    PERFORM Berechnungen WITH TEST BEFORE UNTIL B = 17.
          :
          :
Berechnungen SECTION.
Anzahl-ermitteln.
    ADD A TO B.
    DISPLAY B AT 0214.
Gewicht-ermitteln.
    MULTIPLY C BY D.
    DISPLAY D AT 0314.

Erfassungen SECTION.
Anzahl-erfassen.
    ACCEPT F AT 0125.
          :
          :

Soll das Unterprogramm jedoch in jedem Fall erstmal durchlaufen werden, bevor die Bedingung überprüft wird, so wird dem entsprechend WITH TEST AFTER verwendet.
Fehlt der WITH TEST BEFORE/AFTER-Zusatz, so wird WITH TEST BEFORE angenommen.

PERFORM VARYING
Man kann über den Unterprogrammaufruf auch Inizes - oder einfach Variablen - variieren lassen. Hierzu wird PERFORM VARYING verwendet. Anzugeben sind dabei das entsprechende Laufvariablenfeld, der Anfangswert, die Schrittweite sowie der Endwert.
Nehmen wir an, in unserem Unterprogramm Berechnungen wird ein Wert benötigt, der von 13 in der Schrittweite 7 variiert. Der letzte Wert in dieser 'Variationskette' soll 83 sein (also 10 Schritte). Die Codierung hierfür sähe dann so aus:

    PERFORM Berechnungen VARYING Wert FROM 13 BY 7 UNTIL Wert > 83.
          :
          :
Berechnungen SECTION.
Zahl-ermitteln.
    COMPUTE Anzeige = Wert * A.
    DISPLAY Anzeige AT 0214.
Gewicht-ermitteln.
    MULTIPLY C BY D.
    DISPLAY D AT 0314.

Erfassungen SECTION.
Anzahl-erfassen.
    ACCEPT F AT 0125.
          :
          :

Hier wurde ein OUT-OF-LINE-PERFORM angewendet. Natürlich ist selbiges auch mittels IN-LINE-PERFORM codierbar:

PERFORM VARYING Wert FROM 13 BY 7 UNTIL Wert > 83
    COMPUTE Anzeige = Wert * A
    DISPLAY Anzeige AT 0214
    ACCEPT C AT 0114
    MULTIPLY C BY D
    DISPLAY D AT 0314
END PERFORM.

Man kann auch mehre Werte variieren lassen. Hierfür benötigt man den

AFTER-Zusatz
Mit diesem Zusatz können mehrere Werte variiert werden. Dies wäre zum Beispiel sinnvoll, wenn man Werte in Form einer Tabelle am Bildschirm anzeigen lassen will. Nehmen wir an, es sind 12 Werte in 3 Zeilen und 4 Spalten anzuzeigen. Der Wert besteht dabei aus fünf Ziffern. Der erste Wert (oben links) soll an der Position 0310 angezeigt werden. Als Spaltentrennung ist ein Leerzeichen vorhanden. Die Codierung hierfür könnte so aussehen:

WORKING-STORAGE SECTION.
01 Ausgabeposition.
   05 Zeile PIC 99.
   05 Spalte PIC 99.
01 Ausgabe PIC 9(5).

          :

PROCEDURE DIVISION.
          :

    PERFORM Tablelle-anzeigen VARYING
            Zeile FROM 3 BY 1 UNTIL Zeile > 5
      AFTER Spalte FROM 10 BY 6 UNTIL Spalte > 28.

          :

Tabelle-anzeigen.
    Display Ausgabe AT Ausgabeposition.
          :
          :


...