Neben den Taskvariablen gibt es „prozedurlokale“ Variablen mit den Geltungsbereichen PROCEDURE und CURRENT. Diese sind für eine Prozedur, die mit CALL-PROCEDURE aufgerufen wurde, identisch. Eine „Includeprozedur“ hingegen, die auf die Variablen der rufenden Prozedur zugreifen kann, ohne sie erneut zu deklarieren oder zu importieren, kann wählen, ob eine Deklaration im Geltungsbereich des Aufrufers (SCOPE = *PROCEDURE) wirksam werden soll oder nur „privat“, für die Includeprozedur selbst gelten soll (SCOPE= *CURRENT).
Wenn eine Variable implizit deklariert wird, erhält sie immer den Geltungsbereich *CURRENT.
Import einer prozedurlokalen Variablen
Eine prozedurlokale Variable kann von einer gerufenen Prozedur importiert werden, wenn sie in der rufenden Prozedur mit dem Kommando
DECLARE-VARIABLE VAR-NAME=...,SCOPE=*CURRENT/*PROCEDURE(IMPORT-ALLOWED=*YES)
deklariert wurde und von der gerufenen Prozedur mit dem Kommando
IMPORT-VARIABLE NAME= ..., FROM=*SCOPE(SCOPE=*CALLING-PROCEDURES)
importiert wird.
Beispiel
Includeprozeduren, die mit den Variablen des Aufrufers arbeiten, können sehr einfach geschrieben werden: Die Deklaration von Parametern und lokalen Variablen ist oft nicht erforderlich. Die nachfolgende Beispielprozedur ruft mehrmals eine Includeprozedur auf, um zu verschiedenen Geldbeträgen die Mehrwertsteuer zu berechnen und nach SYSOUT auszugeben.
Rufende Prozedur:
/"Berechnung der Mehrwertsteuer" / / "Vorbesetzungen" / DEZIMAL-ZEICHEN = ','; MWST = 16 "%" / / "1. Berechnung" / BETRAG = 5730 / INCLUDE-PROCEDURE I.MWST / / "2. Berechnung" / BETRAG = 9820 * 3 / INCLUDE-PROCEDURE I.MWST
Gerufene Prozedur I.MWST:
/ "Betrag ausrechnen" / STEUER = (BETRAG * MWST + 50) / 100 / / "Betrag ausgeben" / CT-AUSGABE = STRING(STEUER) / CT-LAENGE = LENGTH(CT-AUSGABE) / EUR-AUSGABE = SUBSTR(CT-AUSGABE,1,CT-LAENGE - 2) - / // DEZIMAL-ZEICHEN - / // SUBSTR(CT-AUSGABE,CT-LAENGE - 1) / WRITE-TEXT 'Die Steuer betraegt &EUR-AUSGABE EUR.'
Durch die Auslagerung der obigen Kommandos in eine Includeprozedur erspart man es sich hier, die Berechnung des Steuerbetrags an mehreren Stellen der ersten Prozedur vorzunehmen. Andererseits kann die Includeprozedur auf die Variablen DEZIMAL-ZEICHEN, BETRAG und MWST zugreifen, ohne dass diese jeweils als Parameter übergeben werden müssten.
Wenn eine Includeprozedur selbst Variablen deklariert, kann sie wählen, ob diese in der rufenden Prozedur sichtbar sein sollen. Die Sichtbarkeit ist insbesondere dann sinnvoll, wenn der Hauptzweck des Include-Aufrufs darin besteht, Deklarationen vorzunehmen.
Beispiel
Eine Prozedur
/DECLARE-VARIABLE NAME(TYPE=*STRING),SCOPE=*PROCEDURE /DECLARE-VARIABLE LAND(TYPE=*STRING,INIT='D'),SCOPE=*PROCEDURE /DECLARE-VARIABLE PLZ(TYPE=*INTEGER),SCOPE=*PROCEDURE /DECLARE-VARIABLE ORT(TYPE=*STRING),SCOPE=*PROCEDURE
kann von mehreren Prozeduren mit /INCLUDE-PROCEDURE aufgerufen werden und sorgt jeweils für übereinstimmende Deklarationen der Variablen NAME, LAND, PLZ und ORT. Sollen später Änderungen an den Deklarationen notwendig sein, so genügt es, diese zentral an der Includeprozedur vorzunehmen.
In diesem Fall wird SCOPE = *PROCEDURE spezifiziert, damit die Deklarationen im Pro-zedur-Scope des Aufrufers wirksam werden und nach Abarbeitung des Include-Aufrufs erhalten bleiben.
Deklarationen mit SCOPE = *CURRENT hingegen sind in einer Includeprozedur „aufruflokal“; damit können Konflikte mit Variablendefinitionen in der aufrufenden Prozedur vermieden werden.
Beispiel
Wird in die Beispielprozedur I.MWST auf "Geltungsbereiche PROCEDURE und CURRENT " zu Beginn die Deklaration
/DECLARE-VARIABLE (STEUER, CT-AUSGABE, CT-LAENGE, EUR-AUSGABE)
aufgenommen, so kann auch die rufende Prozedur eine Variable mit einem der angegebenen Namen verwenden, ohne dass diese durch den Include-Aufruf verändert würde (SCOPE = *CURRENT ist voreingestellt und braucht daher im DECLARE-VARIABLE-Kommando nicht angegeben zu werden).
Prozedur-Unterbrechung
Wird eine Prozedur mit dem Kommando HOLD-PROCEDURE oder mit der
-Taste unterbrochen, kann im Dialog auf alle prozedurlokalen Variablen der unterbrochenen Prozedur zugegriffen werden. Der Unterbrechungsdialog gehört also zum Sichtbarkeitsbereich der unterbrochenen Prozedur.Variablen, die während eines Unterbrechungsdialogs deklariert werden, gelten anschließend als prozedurlokale Variablen der unterbrochenen Prozedur, gleich ob CALL- oder INCLUDE-Prozedur.