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 Gültigkeitsbereich.
- 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
Wenn Sie einen Parameter
deklarieren, können Sie einen oder mehrere der folgenden Parameteränderungswerte angeben:
- 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.
Wenn Sie mehrere Änderungswerte angeben, muss dies in folgender Reihenfolge geschehen:
- 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
Details zu den Änderungswerten:
- 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'.