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:

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

Syntax für die Funktion
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:
  1. sqlNullable (kompatibel mit const und in oder alternativ inout oder - bei Fehlen von const - out).
  2. const (kompatibel mit sqlNullable und entweder mit in oder inout)
  3. field (kompatibel mit inout)
  4. 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'.

Feedback