Funktionen
Eine Funktion enthält eine Reihe von EGL-Anweisungen. Funktionen enthalten entweder den primären ausführbaren Code in einem Programm oder sie werden von einem anderen Programm aufgerufen. Die Funktion selbst ist kein EGL-Abschnitt (eigenständige Funktionen sind ein Sonderfall; siehe Eigenständige Funktionsabschnitte). Eine Übersicht über die Funktionen finden Sie in Einführung in Funktionen.
Funktionen können die folgenden Komponenten umfassen:
- Eine Reihe von Parametern (in Klammern), von denen jeder einem Argument entspricht, das übergeben wird, wenn die Funktion von einer anderen Funktion aufgerufen wird. Auch wenn die Funktion keine Parameter hat, muss ein Klammerpaar auf den Funktionsnamen folgen.
- Ein Rückgabetyp, der den Typ der Daten beschreibt, den die Funktion an die aufrufende Funktion zurückgibt. Wenn eine Funktion keinen Rückgabetyp hat, kann sie keine Daten zurückgeben und Sie können sie nicht in einem Ausdruck verwenden, in dem die Funktion selbst einen Wert haben muss. In einem Service kann der Rückgabetyp nicht ANY, BLOB oder CLOB sein. Der Rückgabetyp muss mit dem Datentyp der empfangenden Variablen kompatibel sein. Weitere Informationen finden Sie in return.
- Eine Reihe von lokalen Variablen, die alle nur innerhalb der Funktion eine Bedeutung haben. Weitere Informationen zu lokalen Variablen finden Sie in Geltungsbereich.
- EGL-Anweisungen.
- Ein end-Begrenzer.
Der Name main() ist für die Ausgangsfunktion reserviert, die immer zuerst ausgeführt wird, wenn Sie ein Programm starten oder aufrufen. Jeder Programmabschnitt muss eine Funktion mit dem Namen main() enthalten, die keine Parameter bzw. keinen Rückgabetyp enthält.
Geben Sie beim Deklarieren von Parametern jeweils an, ob sie als Eingabe für die Funktion (in), als Ausgabe von der Funktion (out) oder beides (inOut) verwendet werden sollen. Der Änderungswert inOut wird standardmäßig verwendet, wenn Sie keine Angabe machen. Weitere Änderungswerte sind const, field und sqlNullable. Nähere Informationen finden Sie unter "Parameteränderungswerte" in diesem Abschnitt.
Bei EGL können zwei Funktionen nicht dieselbe Signatur (Kombination aus Funktionsname sowie Anzahl und Typ der Parameter) haben. Überladene Funktionen (mit dem selben Namen, aber unterschiedlichen Signaturen) sind zulässig. Weitere Information finden Sie in Überladene Funktionen.
Syntax

- Funktionsname
- Der Name, den Sie der Funktion zugeordnet haben.
- Parameter
- Eine Liste von Variablennamen, Typen und optionalen Änderungswerten (siehe "Parameteränderungswerte" in diesem Abschnitt), die der Liste von Argumenten entspricht, mit denen die Funktion aufgerufen wird. Die Parameter müssen durch Kommas getrennt sein. Die Parameter sind optional, die Angabe der Klammern ist aber erforderlich.
- Typ
- Ein Typ, der den Wert beschreibt, der von der Funktion zurückgegeben wird. Dieser Typ muss dem Typ der Variablen entsprechen, die den Rückgabewert in der aufrufenden Funktion empfängt. Dies kann ein Primitive-Typ, ein Datenelement, ein Wörterverzeichnis oder ein Datensatz sein. Die aufrufende Funktion kann dann auf den geänderten Datensatz zugreifen.
- Anweisung
- Eine beliebige EGL-Anweisung
Parameteränderungswerte
- const gibt an, dass ein Eingabeargument als Konstante behandelt wird.
- field gibt an, dass ein Text- oder Druckformularfeld an den Parameter übergeben wird.
- in, out und inout schließen sich gegenseitig aus; sie geben an, ob der Parameter als Eingabe, Ausgabe oder beides verwendet werden soll.
- sqlNullable bezieht sich nur auf Code, der von VisualAge Generator migriert wurde, und gibt an, dass ein Argument (das für den Datenbankzugriff verwendet wird) den Wert null annehmen kann.
- sqlNullable (kompatibel mit const und in oder alternativ inout oder - bei Fehlen von const - out).
- const (kompatibel mit sqlNullable und entweder mit in oder inout)
- field (kompatibel mit inout)
- in, out oder inout
- const
- Verwenden Sie diesen Änderungswert, wenn die Funktion den Wert des Parameters nicht ändert. Wenn Sie const verwenden, verhindert der EGL-Editor, dass Sie den Wert
ändern können, und in einigen Fällen ist der generierte Code effizienter.
Sie können den Änderungswert const für einen Parameter verwenden, der ein Primitive-Element oder eine dynamische Feldgruppe ist. Verwenden Sie const immer, wenn Sie eine Konstante an einen durch inout geänderten Parameter übergeben wollen.
Einschränkung:- Mit dem Änderungswert const können nicht gleichzeitig die Änderungswerte out oder field verwendet werden. Eine kombinierte Verwendung mit dem Änderungswert sqlNullable ist aber möglich.
- Der Änderungswert const kann nicht für einen Parameter in den folgenden
Funktionen verwendet werden:
- Konstruktor oder andere Funktion in einem externen Typ
- Funktion in einem Service oder einer nativen Bibliothek
- Innerhalb einer Funktion sollte eine global definierte Variable nicht aktualisiert werden,
wenn sie an einen Funktionsparameter übergeben wurde, der durch den Änderungswert const modifiziert wird.
Im folgenden Beispiel besteht die Möglichkeit, dass der Wert von myParameter
durch die Aktualisierung einer global definierten Variable geändert wird:
program example myGlobal int = 4; function main() myFunction (myGlobal); end function myFunction(myParameter INT const in) // Ausgabe von 4, zweimal sysLib.writeStdOut(myGlobal); sysLib.writeStdOut(myParameter); // Aktualisierung der globalen Variablen und Ausgabe von 17 myGlobal = 17; sysLib.writeStdOut(myGlobal); // Ausgabe des Parameterwerts, der 4 oder 17 sein kann sysLib.writeStdOut(myParameter); end end - Eine Funktion ist nicht mit einem Stellvertreter kompatibel, wenn ein Parameter
in der einen Funktion durch const modifiziert wird, der entsprechende Parameter
in der anderen Funktion aber nicht.
Einige Beispiele:
Delegate MyDelegatePart( za int in, zb int const in ) end Function F1( xa int in, xb int const in ) end Function F2( xa int const in, xb int const in ) end Function F3( xa int in, xb int in ) end Function example() myDelegateVariable MyDelegatePart; myDelegateVariable = F1; // OK myDelegateVariable = F2; // Ungültig: xa hat const, za aber nicht myDelegateVariable = F3; // Ungültig: zb hat const, xb aber nicht end
- field
- Verwenden Sie diesen Änderungswert, wenn Sie ein Text- oder Druckformularfeld an die Funktion übergeben. Wenn Sie den Änderungswert field angeben, können Sie den Parameter auf Formularfeldmerkmale testen,
wie z. B. blanks, cursor oder numeric. Sie können den Parameter in einer Anweisung set verwenden, wie aus folgendem Beispiel hervorgeht:
set myField red, bold;Der Änderungswert field muss mit dem Parameter inout verwendet werden, unabhängig davon, ob er explizit angegeben oder standardmäßig verwendet wird. Der Änderungswert field kann nicht zusammen mit dem Änderungswert const verwendet werden.
- in
- Verwenden Sie diesen Änderungswert, wenn der Parameter als Eingabe für die Funktion verwendet wird. Wenn Sie in angeben, erhält die Funktion den Argumentwert als Eingabe, aber die aufrufende Funktion empfängt nicht die am Parameter vorgenommenen Änderungen. Sie können in für einen Datensatz angeben, der in der aktuellen Funktion (oder in einer Funktion, die von der aktuellen Funktion aufgerufen wurde) auf eine Datei oder eine Datenbank zugreift.
- Wenn Sie eine Zeichenfolge mit begrenzter Länge als Funktionsparameter mit dem
Änderungswert in angeben, ist jede Texteingabe zulässig:
- Wenn das Argument mehr Zeichen enthält, als im Parameter zulässig sind, schneidet EGL den kopierten Inhalt ab, sodass die vorgegebene Länge eingehalten wird.
- Wenn das Argument weniger Zeichen enthält, als im Parameter zulässig sind, füllt EGL den kopierten Inhalt mit Leerzeichen auf, sodass die vorgegebene Länge eingehalten wird.
- Wenn das Argument ein Verweistyp ist, wird eine Kopie an den entsprechenden Funktionsparameter übergeben. Keiner der Werte, die Sie dem Parameter zuweisen, wirkt sich auf den Wert aus, auf den sich der Verweis bezieht. Wenn Sie aber ein Element einer Feldgruppe ändern, ohne den ursprünglichen Wert des Parameters zu ändern, erkennt das aufrufende Programm die Änderung. Das Programm erkennt die Änderung, weil der Parameter noch auf denselben Speicherbereich verweist, auf den das ursprüngliche Argument verweist.
- out
- Verwenden Sie diesen Änderungswert, wenn der Parameter als Ausgabe von der Funktion verwendet wird. Die Funktion empfängt den Argumentwert nicht als Eingabe. Der Parameter wird entsprechend den Regeln initialisiert, die unter "Dateninitialisierung" beschrieben sind. Wenn die Funktion zurückkehrt, wird dem Argument des aufrufenden Programms ein Wert zugeordnet.
- Wenn das Argument ein Literal oder eine Konstante ist, wird der Parameter so behandelt, als wäre in der Änderungswert. Sie können out für einen Datensatz angeben, der in der aktuellen Funktion (oder in einer Funktion, die von der aktuellen Funktion aufgerufen wurde) auf eine Datei oder eine Datenbank zugreift.
- Wenn Sie eine Zeichenfolge mit begrenzter Länge als Funktionsparameter mit dem Änderungswert out angeben, muss für den Parameter und das Argument dieselbe Längenbegrenzung bestehen:
- Wenn das Argument ein Verweistyp ist, wird ein Nullverweis an den entsprechenden Funktionsparameter übergeben. Jeder Wert, den Sie dem Parameter zuordnen, aktualisiert die entsprechende Variable in der aufrufenden Funktion.
- inOut
- Verwenden Sie diesen Änderungswert, wenn der Parameter sowohl als Eingabe für die Funktion als auch als Ausgabe von der Funktion verwendet wird. Die Funktion erhält den Argumentwert als Eingabe und die aufrufende Funktion erhält alle Änderungen an dem Parameter, wenn die Funktion beendet wird. Wenn das Argument ein Literal oder eine Konstante ist, wird es so behandelt, als wäre in der Änderungswert.
- Wenn das Argument ein Datensatz ist, gelten die folgenden Regeln:
- Wenn Sie den Datensatz verwenden, um in der aktuellen Funktion (oder in einer Funktion, die die von der aktuellen Funktion aufgerufen wurde) auf eine Datei oder eine Datenbank zuzugreifen, müssen Sie den Änderungswert inOut angeben oder diesen Änderungswert als Standardwert übernehmen.
- Wenn der Datensatztyp für den Parameter und das Argument gleich ist (z. B. wenn beide den Typ EmpRecord haben) und wenn inOut wirksam ist, stehen die datensatzspezifischen Statusinformationen (wie z. B. der Status endOfFile) in der Funktion zur Verfügung und werden an das aufrufende Programm zurückgegeben.
- Wenn das Argument ein Verweistyp ist, wird es als Verweis an den entsprechenden Funktionsparameter übergeben. Jeder Wert, den Sie dem Parameter zuordnen, aktualisiert die entsprechende Variable in dem aufrufenden Programm.
- sqlNullable
- Details hierzu finden Sie unter 'sqlNullable'.
- Die COBOL-Umgebung muss eine System Z-Umgebung und keine VSE- oder System I-Umgebung sein.
- Die SQL-Anweisung open muss eine Ergebnismengen-ID verwenden.
- Für jede SQL-Anweisung get next, replace oder delete müssen Sie auf den Namen der Ergebnismenge verweisen, der in der SQL-Anweisung open verwendet wird.
- Die SQL-Anweisung open funktioniert zusammen mit der Anweisung get next, replace oder delete. Beide Anweisungen müssen auf die Funktionsparameter in der aktuellen Funktion verweisen. Die Anweisung open kann sich nicht in einer anderen Funktion als die anderen SQL-Anweisungen befinden.