Die CALL-Anweisung

Um ein externes Unterprogramm nutzen zu können, muß es zunächst einmal vom 'rufenden' Programm aufgerufen werden. Die einfachste Möglichkeit dabei sieht dann so aus:
CALL "Programmname".

Der hinter CALL angegebene Programmname bezieht sich auf den Namen, der im Unterprogramm in der Programm-ID festgelegt wurde. Wie gesehen kann man hinter der CALL-Anweisung ein nicht-numerisches Literal angeben. Es ist jedoch auch möglich, den Namen des auszuführenden Programms erst zur Laufzeit bestimmen zu lassen. Dabei ist jedoch dafür Sorge zu tragen, daß in der entsprechenden Variable beim Aufruf der CALL-Anweisung auch ein Name vorhanden ist:

      :
01 UPro PIC X(15).
      :

   MOVE "Artbestimmung" TO UPro.
      :
   CALL UPro.
      :

Nachdem das externe Unterprogramm auf diese Weise aufgerufen wurde, wird es im Arbeitsspeicher hinter dem Hauptprogramm (rufendes Welches) geladen und gestartet. Es bleibt dort, bis entweder das Hauptprogramm beendet wird oder der entsprechende Speicherbereich mit Hilfe der CANCEL-Anweisung wieder freigegeben wird. Sollte das Unterprogramm 'nicht hinter sich saubermachen'; will sagen: wenn Variablen oder Strukturen des Unterprogramms nach dessen Ablauf anders aussehen als wenn dieses UPro zum ersten Mal gestartet wird, so bleiben diese Veränderungen erhalten. Die Ausgangslage beim erneuten Aufruf des UPro's ist also eine andere als wenn es zum ersten Mal gestartet wird Das gilt natürlich nicht, wenn man zwischendurch die CANCEL-Anweisung verwendet hat, da dann der Speicherbereich wieder komplett geräumt wurde.

USING-Zusatz
Meist besteht der Sinn und Zweck von Unterprogrammen ja darin, mit Werten, die sich aus dem 'rufenden' Programm ergeben haben, weiter zu rechnen. Damit eine solche Arbeitsteilung der Programme möglich ist, müssen die entsprechenden Werte vom Haut- an das Unterprogramm übergeben werden. Dies geschieht mit Hilfe des USING-Zusatzes:

CALL UPro USING Wert-1, Wert-2.

Die Datenfelder müssen im 'rufenden' Programm entweder in der FILE SECTION oder der WORKING-STORAGE SECTION auftauchen. Handelt es sich bei dem 'rufenden' Programm gleichzeitig um ein 'gerufenes', so können auch Felder der dann vorhandenen LINKAGE SECTION verwendet werden.
Natürlich ist klar, daß die so übergebenen Datenfelder im 'gerufenen' Programm wiederum empfangen werden müssen. Die Datenfelder müssen dort in der LINKAGE SECTION definiert sein und werden durch den USING-Zusatz in der PROCEDURE DIVISION 'empfangen'. Es wird dabei die Reihenfolge eingehalten, in der die Datenfelder übergeben werden.
Es werden also nach dem Aufruf des Unterprogramms durch die CALL-Anweisung die Anweisungsfolgen ausgeführt, die im Unterprogramm in der PROCEDURE DIVISION angegeben wurden.

BY CONTENT-Zusatz
Wird vor den Übergabefeldern dieser Zusatz verwendet, so werden die angesprochenen Datenfelder mit ihrem Inhalt übergeben. Es ist jedoch darauf zu achten, daß das Unterprogramm eigene Datenfelder verwendet, die dann entsprechend gefüllt werden. Wird dieser Inhalt dann im Unterprogramm verwendet und verändert, so hat das keinerlei Auswirkungen auf den Inhalt des gleichnamigen Datenfeldes im 'rufenden' Programm. Nach der Rückehr in das 'rufende' Programm liegen also wieder dieselben Werte vor, wie beim Verlassen dieses Programms.

CALL UPro USING BY CONTENT Wert-1, Wert-2.

Meist ist dieser Effekt jedoch nicht gewollt. Daher gibt es den

BY REFERENCE-Zusatz
Hierbei handelt es sich um die Standardeinstellung. Es werden die Inhalte der angesprochenen Felder übergeben, wie beim BY CONTENT-Zusatz. Im Unterprogramm werden jedoch keine eigenen Felder verwendet, sondern die Felder des Unterprogramms verweisen auf die entsprechenden Speicheradressen der Felder im Hauptprogramm. Da somit bei der Verarbeitung auf die entsprechenden Speicherinhalte des 'rufenden' Programms verwiesen wird, werden auch dessen Feldinhalte entsprechend verändert. Der veränderte Inhalt eines Feldes steht also anschließend dem 'rufenden' Programm zur Weiterverarbeitung zur Verfügung.

ON OVERFLOW-Zusatz
Für den Fall, daß der Speicher nicht langt, gibt es diesen Zusatz. Wie oben bereits beschrieben wird das aufgerufene Unterprogramm im Arbeisspeicher hinter dem Hauptprogramm abgelegt. Liegt jetzt eine Kette von 'rufenden' und 'gerufenen' Programmen hintereinander im Speicher, so kann es schonmal zu Gedränge kommen. Wurde der ON OVERFLOW-Zusatz verwendet, so werden in diesem Fall die Anweisungen ausgeführt, die auf den Zusatz folgen:

CALL UPro ON OVERFLOW PERFORM Speicher-Sauber.

Hier würde folglich das interne Unterprogramm 'Speicher-Sauber' ausgeführt, wenn es zu einem Arbeisspeicherüberlauf käme.

ON EXCEPTION-Zusatz
Neben mangelndem Speicherplatz können natürlich auch andere Fehler auftreten. So könnte beispielsweise das angegebene Unterprogramm nicht gefunden werden. In solchen Fällen kann hinter diesem Zusatz angegeben werden, was dann zu geschehen hat. ON EXCEPTION und ON OVERFLOW sind dabei gleichrangig.

...