call

Mithilfe der EGL-Anweisung call wird die Steuerung von einem Hauptprogramm an ein aufgerufenes Programm übertragen. Das aufgerufene Programm gibt die Steuerung an das Hauptprogramm zurück, sobald es beendet ist.

Vom Hauptprogramm können gegebenenfalls Parameter an das aufgerufene Programm übergeben werden. Werden übergebene Daten vom aufgerufenen Programm geändert, wird der Speicherbereich, der für das aufrufende Programm verfügbar ist, ebenfalls geändert. Weitere Informationen zum Unterschied zwischen Hauptprogramm und aufgerufenen Programmen finden Sie im Abschnitt 'Programmabschnitt'.

Programmaufrufe können lokal oder fern sein. Die Definition eines lokalen Aufrufs richtet sich nach der Plattform:

Das aufgerufene Programm wird entweder von EGL generiert oder es wird als extern definiert betrachtet. In der Beschreibung zur Eigenschaft isExternal unter der Überschrift 'Syntax' im vorliegenden Abschnitt wird erläutert, wie Sie angeben können, dass es sich bei einem Programm um ein extern definiertes Programm handelt.

Anzahl, Typ und Reihenfolge der Argumente, die Sie in einer Anweisung call übergeben, müssen mit Anzahl, Typ und Reihenfolge der Parameter übereinstimmen, die vom aufgerufenen Programm erwartet werden. Es gibt keine Begrenzung für die Anzahl der Parameter, die Sie in einem lokalen Aufruf übergeben können. Bei fernen Aufrufen sind Anzahl und Gesamtlänge der Parameter, die übergeben werden können, begrenzt. Alle Implementierungen für Fernaufrufe unterstützen die Übergabe von zumindest 30 Parametern mit einer Gesamtlänge unter 32 000 Byte. Erfordert Ihr Entwurf eine Übergabe von mehr als 30 Parameter oder mehr als 32 000 Byte pro Aufruf, müssen Sie einen Test mit allen erforderlichen Implementierungen durchführen, um sicherzustellen, dass alle Implementierungen den Umfang der zu übergebenden Daten unterstützen.

Für Literale und Konstanten gelten die folgenden Regeln:

Weitere Angaben zur Verwendung der Anweisung call für den Serviceaufruf finden Sie im Abschnitt 'Anweisung 'call' und Rückruffunktionen für Servicezugriff codieren'.

Wenn Sie ein Programm aufrufen, das von VisualAge Generator migriert wurde, ist zu beachten, dass VisualAge Generator-Entwickler im Allgemeinen Variablentypen mit festgelegtem Text verwenden. Sie können den Typ der Zeichenliterale über die Eigenschaft textLiteralDefaultIsString steuern oder indem Sie einen Typ mit dem Literal angeben. Weitere Informationen zur Eigenschaft textLiteralDefaultIsString finden Sie in textLiteralDefaultIsString, weitere Informationen zu Literalen in Literale.

Syntax

Syntaxdiagramm für die Anweisung 'call'
Programmname
Der Name des aufgerufenen Programms. Das Programm wird entweder von EGL generiert oder es wird als extern definiert betrachtet. Bei vielen Programmnamen, z. B. UNIX-Programmnamen oder den Namen von in Java geschriebenen Programmen, ist die Groß-/Kleinschreibung zu beachten. Bei den Programmnamen im EGL-Debugger ist dies nicht der Fall. Bei dem Namen kann es sich um eine direkte Abschnittsreferenz ohne Anführungszeichen, eine in Anführungszeichen gesetzte Literalzeichenfolge oder einen Variablen- oder Konstantennamen handeln.
Argument
Eine durch Kommata unterteilte Folge von Wertreferenzen. Bei einem Argument kann es sich um eine Basiselementvariable, ein Formular, einen Datensatz, eine Feldgruppe mit Basiselementtypen, eine Feldgruppe mit Datensätzen, ein nicht numerisches Literal oder eine nicht numerische Konstante handeln. Kann EGL zur Generierungszeit auf das aufgerufene Programm zugreifen, kann es sich bei dem Argument um einen komplexeren Ausdruck mit einem Datum/Uhrzeittyp, einem numerischen Typ oder einem Texttyp handeln. Felder des Typs 'ANY', 'ArrayDictionary', 'BLOB', 'CLOB', 'DataTable' oder 'Dictionary' können nicht übergeben werden. Ebensowenig können Feldgruppen dieser Typen oder Datensätze übergeben werden, die diese Typen enthalten. Bei lokalen Aufrufen ist die Anzahl der Argumente nicht begrenzt. Fernaufrufe unterstützen möglicherweise nur maximal 30 Argumente.
Eigenschaften
Die folgenden Eigenschaften werden unterstützt:
isExternal
Eine boolesche Eigenschaft:
  • Der Standardwert NO gibt an, dass das Element callLink im Verbindungsoptionsabschnitt festlegt, ob ein externes Programm aufgerufen wird. Eine höhere Flexibilität kann erzielt werden, indem ein Wert in das Element callLink eingefügt wird. Auf diese Weise ist die Einstellung nicht im Code integriert.

    Für lokale Aufrufe ist das Attribut pgmType des Elements callLink relevant, für Fernaufrufe und EJB-Aufrufe das Attribut remotePgmType.

  • YES gibt an, dass ein Programm aufgerufen wird, das nicht mit EGL generiert wurde.
isNoRefresh
Eine boolesche Eigenschaft, die nur von Bedeutung ist, wenn das aufrufende Programm Textformulare anzeigt und eine der folgenden Situationen vorliegt:
  • Das aufgerufene Programm zeigt kein Textformular an.
  • Das aufrufende Programm schreibt nach dem Aufruf ein Textformular für die Gesamtanzeige.

Für diese Eigenschaft sind zwei Werte verfügbar:

  • Der Standardwert NO gibt an, dass das Element callLink im Verbindungsoptionsabschnitt festlegt, ob eine Anzeigeaktualisierung vermieden wird. Eine höhere Flexibilität kann erzielt werden, indem ein Wert im Element callLink (Attribut refreshScreen) definiert wird. Auf diese Weise ist die Entscheidung nicht im Code integriert.
  • YES gibt an, dass eine automatische Anzeigenaktualisierung vermieden wird, wenn das aufgerufene Programm die Steuerung zurückgibt.
linkageKey
Eine Zeichenfolge, die das Element callLink in einem Verbindungsoptionsabschnitt referenziert. Die Zeichenfolge stimmt mit dem Attribut pgm in dem betreffenden Element überein. Weitere Angaben hierzu finden Sie im Abschnitt zu 'linkageKey'.
timeout
Eine ganze Zahl, die die maximal zulässige Länge des Zeitraums zwischen einem Serviceaufruf und der zugehörigen Antwort in Millisekunden angibt. Bei einer Anweisung call ist diese Eigenschaft nur für Rich-UI-Anwendungen vorgesehen und gibt die maximal zulässige Länge des Zeitraums zwischen dem Serviceaufruf des EGL Rich UI-Proxys auf dem Webserver und dem Empfang einer Antwort beim Proxy in Millisekunden an. Nähere Angaben hierzu finden Sie im Abschnitt 'Anweisung 'call' und Rückruffunktion für Servicezugriff codieren'.

Gültige Aufrufe

Die folgende Tabelle enthält die gültigen Aufrufe, die von mit EGL generiertem Code ausgehen und von diesem Code empfangen werden können.

Tabelle 1. Gültige Aufrufe in EGL
Aufrufendes Objekt Aufgerufenes Objekt
Ein mit EGL generierter Java-Wrapper in einer Java-Klasse außerhalb von J2EE Ein mit EGL generiertes Java-Programm (nicht J2EE)
Ein mit EGL generiertes Java-Programm in einem J2EE-Anwendungsclient
Eine mit EGL generierte EJB-Session-Bean
Ein IMS/VS-Programm (mit EGL generiert oder nicht)
Eine IMS-Transaktion
Ein CICS-Programm (mit EGL generiert oder nicht)
Ein mit EGL generierter Java-Wrapper in einem J2EE-Anwendungsclient Ein mit EGL generiertes Java-Programm (nicht J2EE)
Ein mit EGL generiertes Java-Programm in einem J2EE-Anwendungsclient
Eine mit EGL generierte EJB-Session-Bean
Ein IMS/VS-Programm (mit EGL generiert oder nicht)
Eine IMS-Transaktion
Ein CICS-Programm (mit EGL generiert oder nicht)
Ein mit EGL generierter Java-Wrapper in einer J2EE-Webanwendung Ein mit EGL generiertes Java-Programm (nicht J2EE)
Ein mit EGL generiertes Java-Programm in einem J2EE-Anwendungsclient
Ein mit EGL generiertes Java-Programm in derselben J2EE-Webanwendung
Eine mit EGL generierte EJB-Session-Bean
Ein IMS/VS-Programm (mit EGL generiert oder nicht)
Eine IMS-Transaktion
Ein CICS-Programm (mit EGL generiert oder nicht)
Ein mit EGL generiertes Java-Programm außerhalb von J2EE Ein EGL-Java-Programm (nicht J2EE)
Ein EGL-Java-Programm in einem J2EE-Anwendungsclient
Eine EGL-EJB-Session-Bean
Ein Java-Programm unter IBM® i
Ein COBOL-Programm unter IBM i
Ein in C oder C++ geschriebenes Nicht-EGL-Programm
Ein IMS/VS-Programm (mit EGL generiert oder nicht)
Eine IMS-Transaktion
Ein CICS-Programm (mit EGL generiert oder nicht)
Ein EGL-Java-Programm in einem J2EE-Anwendungsclient Ein EGL-Java-Programm (nicht J2EE)
Ein EGL-Java-Programm in einem J2EE-Anwendungsclient
Eine EGL-EJB-Session-Bean
Ein Java-Programm unter IBM i
Ein COBOL-Programm unter IBM i
Ein in C oder C++ geschriebenes Nicht-EGL-Programm
Ein IMS/VS-Programm (mit EGL generiert oder nicht)
Eine IMS-Transaktion
Ein CICS-Programm (mit EGL generiert oder nicht)
Ein EGL-Java-Programm in einer J2EE-Webanwendung Ein EGL-Java-Programm (nicht J2EE)
Ein EGL-Java-Programm in einem J2EE-Anwendungsclient
Ein EGL-Java-Programm in derselben J2EE-Webanwendung
Ein Java-Programm unter IBM i
Ein COBOL-Programm unter IBM i
Ein in C oder C++ geschriebenes, nicht generiertes Programm
Ein CICS-Programm (mit EGL generiert oder nicht)
Eine EGL-EJB-Session-Bean Ein EGL-Java-Programm (nicht J2EE)
Ein EGL-Java-Programm in einem J2EE-Anwendungsclient
Eine EGL-EJB-Session-Bean
Ein in C oder C++ geschriebenes, nicht generiertes Programm
Ein CICS-Programm (mit EGL generiert oder nicht)
Ein EGL-CICS-Programm Ein CICS-Programm (mit EGL generiert oder nicht)
Ein EGL-z/OS batch-Programm
Ein EGL-z/OS batch-Programm Ein in einer beliebigen Programmiersprache (EGL eingeschlossen) geschriebenes Batchprogramm, das unter z/OS (außerhalb von CICS oder IMS) ausgeführt wird
Ein Nicht-EGL-CICS-Programm Ein CICS-COBOL-Programm (mit EGL generiert oder nicht)
Ein in einer beliebigen Programmiersprache (EGL eingeschlossen) geschriebenes Batchprogramm, das unter z/OS (außerhalb von CICS oder IMS) ausgeführt wird
Ein EGL-COBOL-Programm unter IBM i Ein EGL-COBOL-Programm unter IBM i
Ein in einer beliebigen Programmiersprache geschriebenes Nicht-EGL-Programm, das unter IBM i ausgeführt wird
Ein in einer beliebigen Programmiersprache geschriebenes Nicht-EGL-Programm, das unter IBM i ausgeführt wird Ein EGL-COBOL-Programm unter IBM i
Ein in einer beliebigen Programmiersprache geschriebenes Nicht-EGL-Programm, das unter IBM i ausgeführt wird

Verwenden Sie einen externen EGL-Typ oder eine Java-Zugriffsfunktion, wenn ein mit EGL generierter Java-Code von einem nicht mit EGL generierten Java-Code aus aufgerufen werden soll.

Beispiel

Das folgende Beispiel veranschaulicht ein aufgerufenes Programm, das die Zinsen bei einem Darlehen berechnet:

  if (userRequest == "C")
    try
      call programA(myCustomer, interestRate);
    onException(myEx InvocationException)
      myErrorHandler(12);
    end
  end

Fehlerbedingungen

Die Anzahl der Bytes, die in den einzelnen Argumenten übergeben werden, muss mit der Anzahl der Bytes übereinstimmen, die vom empfangenden Parameter erwartet werden. Weitere Informationen hierzu finden Sie im Abschnitt 'Kompatibilität'.

Eine Ausnahmebedingung in einem über Fernzugriff aufgerufenen Programm wird nie direkt an das aufrufende Programm weitergegeben. Die Ausnahmebedingung wird stattdessen in eine Ausnahmebedingung des Typs 'InvocationException' eingeschlossen. Werden Ausnahmebedingungen von dem über Fernzugriff aufgerufenen Programm nicht bearbeitet, wird das aufgerufene Programm beendet und das aufrufende Programm löst eine Ausnahmebedingung des Typs 'InvocationException' aus.

Kompatibilität

Tabelle 2. Hinweise zur Kompatibilität für die Anweisung 'call'
Plattform Problem
Java-Generierung
  • Längenabweichungen führen nur zu einem Fehler, wenn die Laufzeitkorrektur der Längenabweichung zu einer Typabweichung führt:
    • Empfängt das aufgerufene Programm zu wenig Bytes, werden die übergebenen Daten am Ende mit Leerzeichen aufgefüllt.
    • Empfängt das aufgerufene Programm zu viele Bytes, werden die übergebenen Daten am Ende abgeschnitten.
    Werden Leerzeichen z. B. zu einer Variablen des Typs NUM hinzugefügt und versucht das aufgerufene Programm, die Daten in der betreffenden Variablen zu verwenden, löst EGL eine Ausnahmebedingung des Typs 'RuntimeException' aus. Werden Leerzeichen zu einer Variablen des Typs CHAR hinzugefügt, wird keine Ausnahmebedingung ausgelöst.
  • Bei Variablen des Typs SMALLFLOAT und FLOAT, die als Argumente in einer Anweisung call oder beim Aufruf einer Servicefunktion übergeben werden, verwendet die Java-Laufzeitumgebung das IBM 370-Format, wenn remoteComType mit CICSECI, CICSJ2C, CICSSSL, IMSJ2C oder IMSTCP definiert ist. Die Java-Laufzeitumgebung verwendet beim Konvertieren von Daten für andere Arten von (Service-)Aufrufen das IEEE-Format.
COBOL-Generierung Rekursive Programmaufrufe sind nur für zSeries zulässig. Diese Unterstützung hängt davon ab, ob die Rekursion für COBOL möglich ist. Unter CICS ist dies für gewöhnlich kein Problem. Im Stapelbetrieb könnte dies jedoch zu Problemen führen. Rekursive Aufrufe müssen ermöglicht werden, indem der symbolische Parameter ALLOWRECURSIVEPROGRAMS mit YES definiert wird. Weitere Informationen finden Sie unter Vordefinierte symbolische Parameter, die vom Benutzer gesetzt werden können.
CICS Entspricht die in den einzelnen Argumenten übergebene Byteanzahl nicht der vom CICS-Programm erwarteten Anzahl, führt dies bei der Laufzeitumgebung zu einer abnormalen Beendigung.
Rich-UI Eine Version der Anweisung call wird unterstützt, jedoch nur für den Aufruf von Services. Nähere Angaben hierzu finden Sie im Abschnitt 'Anweisung 'call' und Rückruffunktion für Servicezugriff codieren'.

Feedback