Programme in CICS-Umgebungen aufrufen

Verwenden Sie den Verbindungsoptionsabschnitt, um anzugeben, wie EGL die Anweisung "call" generieren soll. Sie können in CICS-Umgebungen einen der folgenden Werte für die Eigenschaft "type" für das Element "callLink" im Verbindungsoptionsabschnitt angeben:
localCall
Ein Aufruf, der in derselben CICS-Region durchgeführt wird.
remoteCall
Ein Aufruf, der von einer CICS-Region zu einer anderen Region oder von einem generierten Java™-Programm aus zu einem generierten COBOL-Programm, das in CICS ausgeführt wird, durchgeführt wird.
Sie können für "localCall" auch die Eigenschaft "linkType" angeben, die die tatsächliche Anweisung "call" wie folgt bestimmt:
DYNAMIC
Dynamischer COBOL-Standardaufruf.
STATIC
Statischer COBOL-Standardaufruf. Das aufgerufene Programm muss mit dem aufrufenden Programm bearbeitet werden.
CICSLINK
CICS-Befehl LINK command (Standardbefehl für CICS-Programme). CICSLINK wird nur in folgenden Situationen unterstützt:
  • Das Element "callLink" für das aufgerufene Programm gibt "remoteCall" an.
  • Das Element "callLink" für das aufgerufene Programm gibt "parmForm = CHANNEL" an.
  • Die Anweisung "call" gibt "isExternal = YES" oder das Element "callLink" für das aufgerufene Programm gibt "pgmType = EXTERNALLYDEFINED" an.
In allen anderen Fällen (auch wenn CICSLINK der Standardbefehl ist) generiert EGL keinen CICS-Befehl LINK für "linkType = CICSLINK". Stattdessen generiert EGL einen dynamischen COBOL-Standardaufruf, derselbe Aufruf wie mit der Angabe von "linkType = DYNAMIC" für das Element "callLink" für das aufgerufene Programm.
Sie müssen den CICS-Eintrag RDO PROGRAM für alle aufgerufene Programme erstellen, die mit den Verbindungsoptionen aufgerufen werden:
Sie können außerdem angeben, wie die Parameter in der Anweisung "call" an das aufgerufene Programm übergeben werden:
COMMPTR
Die Zeiger zu den Parametern werden an den COMMAREA übergeben (standardmäßig für CICS-Programme, wenn die Eigenschaft "type" den Wert "localCall" hat).
COMMDATA
Die Parameterdaten werden an den COMMAREA übergeben (standardmäßig für CICS-Programme, wenn die Eigenschaft "type" den Wert "remoteCall" hat).
OSLINK
Die Parameter werden mit der standardmäßigen COBOL-Parameterliste übergeben. Das aufgerufene Programm kann keine CICS-Anweisungen enthalten und kann kein EGL-Programm sein.
CICSOSLINK
Es wird eine standardmäßige COBOL-Parameterliste verwendet. Die ersten zwei Parameter sind der EXEC-Schnittstellenblock (EIB) und der COMMAREA, gefolgt von den Parametern der Anweisung "call".
CHANNEL
Die Parameter werden in Containern über einen Kanal übergeben. Die Namen der Container lauten EGL-PARM-1 bis EGL-PARM-n, wobei der Maximalwert n 30 ist. Es wird kein COMMAREA in das CHANNEL-Parameterformat übergeben.
Tabelle 1. Gültiges Parameterformat und Verbindungskombinationen für CICS
  COMMPTR COMMDATA OSLINK CICSOSLINK CHANNEL
DYNAMIC Gültig Gültig Gültig Gültig Nein
STATIC Gültig Gültig Gültig Gültig Nein
CICSLINK Gültig Gültig Nein Nein Gültig
REMOTE Gültig, wenn der Aufruf von einem EGL-generierten Java-Programm erfolgt. Nicht gültig, wenn der Aufruf von einem CICS-Programm erfolgt. Gültig Nein Nein Gültig

Weitere Informationen finden Sie in "Verbindungsoptionsabschnitt".

Alle hier beschriebenen Aufrufe sind lokale Aufrufe zwischen Programmen, die im selben CICS-System ausgeführt werden. Aufgerufene Programme können auch unter einem anderen System als das aufrufende Programm ausgeführt werden:

Wenn das aufrufende oder aufgerufene Programm ein PL/I-Programm ist, müssen Sie die Eigenschaft "linkType" auf CICSLINK festlegen. Wenn das aufgerufene Programm ein PL/I-Programm ist, müssen Sie entweder "isExternal = YES" in der Anweisung "call" oder "pgmType = EXTERNALLYDEFINED" im Element "callLink" für das aufgerufene Programm angeben. Wenn das aufrufende Programm ein PL/I-Programm ist, müssen Sie "linkType = CICSLINK" im Element "callLink" für das aufgerufene EGL-Programm angeben.

In den folgenden Abschnitten finden Sie weitere Details zur Verwendung von Parametern mit der Anweisung "call".

Format aller Aufrufanweisungsparameter für CICS

In den folgenden Abschnitten werden die Parameterformate detailliert beschrieben, die für die Anweisung "call" in der CICS-Umgebung verwendet werden.

Anmerkung: Es gelten spezielle Überlegungen, wenn Sie "dliLib.psbData" oder einen PCB-Datensatz als Parameter übergeben. Weitere Informationen finden Sie unter "Referenzinformationen für spezielle Parameter für die Anweisung 'call' oder 'transfer'".

COMMAREA-Zeiger (COMMPTR) - Parameterformat

Für das COMMPTR-Parameterformat werden die Zeiger in den CICS-Kommunikationsbereich (COMMAREA) übergeben. Der COMMAREA wird im COBOL-Arbeitsspeicherbereich des aufrufenden Programms generiert. Das höchstwertige Bit wird auf die letzte Parameteradresse im COMMAREA für das COMMPTR-Parameterformat festgelegt.

In der folgenden Abbildung wird das COMMPTR-Parameterformat dargestellt. Register 1 verweist auf eine Liste von Zeigern. Der erste Parameter ist die Adresse des EXEC-Schnittstellenblocks (EIB), gefolgt von der Adresse des COMMAREA. Die Zeiger zu den Parametern werden im COMMAREA übergeben.

COMMPTR-Parameterformat

Wenn Sie die Erstellungsdeskriptoroption "endCommarea" auf YES für das aufrufende Programm festlegen, fügt das aufrufende Programm das Vollwort x'FFFFFFFF' zum Ende der Parameterliste hinzu. Sie sollten "endCommarea" nur dann auf YES festlegen, wenn das aufgerufene Programm dieses Terminal-Vollwort benötigt, wie in einem Programm, das zuvor von einem CSP/AE-Programm (Cross System Product/Application Execution) aus aufgerufen wurde. Die Länge des COMMAREA bezieht die 4 Byte für dieses Vollwort nicht ein, es sei denn, "endCommarea" ist auf YES festgelegt. Unter bestimmten Bedingungen übergibt CICS eine Kopie des COMMAREA an das aufgerufene Programm.

COMMAREA-Daten (COMMDATA) - Parameterformat

Für das COMMDATA-Parameterformat werden die tatsächlichen Daten in einen einzelnen Puffer im CICS-Kommunikationsbereich (COMMAREA) übergeben. Der COMMAREA wird im Arbeitsspeicherbereich des aufrufenden Programms generiert. Alle Parameterwerte werden an den COMMAREA übertragen, wo die Werte ohne Ausrichtung auf Bytegrenze aufeinander folgen. Wenn der Datensatz variabler Länge übergeben wird, wird Platz für den Datensatz maximaler Länge wie für EGL definiert reserviert. Wenn der Datensatz variabler Länge mit festgelegter Eigenschaft "lengthItem" übergeben wird, muss der erforderliche Platz im festgelegten Abschnitt des Datensatzes definiert werden. Das aufgerufene Programm muss die Parameterwerte im COMMAREA in derselben Reihenfolge zurückgeben. Das aufrufende Programm verschiebt die zurückgegebenen Parameterwerte im COMMAREA zurück zu den Originalparametern.

In der folgenden Abbildung wird das COMMDATA-Parameterformat dargestellt. Register 1 verweist auf eine Liste von Zeigern. Der erste Parameter ist die Adresse des EIB, gefolgt von der Adresse des COMMAREA. Die tatsächlichen Parameterdaten werden an den COMMAREA übergeben.

COMMDATA-Parameterformat

OSLINK-Parameterformat

Für das OSLINK-Parameterformat werden EIB und COMMAREA nicht übergeben. Es werden nur die Parameter an die Anweisung "call" übergeben. Das höchstwertige Bit wird auf die letzte Adresse in der Parameterliste für das OSLINK-Parameterformat festgelegt. OSLINK ist nur für die Verbindungstypen DYNAMIC und STATIC gültig. Das aufgerufene Programm muss ein folgendes Programm sein:
  • Ein Nicht-EGL-Programm, das keine EXEC CICS-Befehle enthält.
  • Ein EGL-Programm, das für die ZOSBATCH-Umgebung generiert wurde. In diesem Fall darf das aufgerufene EGL-Programm keine Ein-/Ausgaben durchführen. Darüber hinaus müssen Sie "linkType = DYNAMIC" im Eintrag "callLink" für das aufgerufene EGL-Programm angeben.

In der folgenden Abbildung wird das OSLINK-Parameterformat dargestellt. Register 1 verweist auf eine Liste von Zeigern, die Adressen der Puffer für die Parameterdaten sind (eine Adresse pro Parameter).

OSLINK-Parameterformat

CICSOSLINK-Parameterformat

Für das CICSOSLINK-Parameterformat werden EIB und COMMAREA immer als die ersten zwei Parameter übergeben, gefolgt von den Parametern, die in der Anweisung "call" angegeben sind. CICSOSLINK ist nur für die Verbindungstypen STATIC und DYNAMIC gültig.

In der folgenden Abbildung wird das CICSOSLINK-Parameterformat dargestellt. Register 1 verweist auf eine Liste von Zeigern. Der erste Parameter ist die Adresse des EIB, gefolgt von der Adresse des COMMAREA und von den Adressen der Puffer für die Parameterdaten (eine Adresse pro Parameter).

CICSOSLINK-Parameterformat

CHANNEL-Parameterformat

Für das CHANNEL-Parameterformat werden Container in einem Kanal übergeben. Ein Kanal ist eine Gruppe von Containern, die wie Parameter für die Übergabe von Daten zwischen CICS-Programmen fungieren. Es wird kein COMMAREA in das CHANNEL-Parameterformat übergeben.

Wenn ein EGL-generiertes Programm einen Kanal an ein aufgerufenes Programm übergibt, hat der Kanal denselben Namen wie das aufgerufene Programm. Wenn ein aufgerufenes EGL-Programm jedoch einen Kanal empfängt, verwendet das Programm einen CICS-API-Aufruf, um den Namen des übergebenen Kanals abzurufen.

Die Namen der Container lauten EGL-PARM-1 bis EGL-PARM-n, wobei der Maximalwert n 30 ist.

Beispiel: Wenn Sie drei Parameter vom Typ "INT", "Record" (33.000 Byte) und "EGL STRING" übergeben, bezieht der Kanal drei Container ein, wie in der folgenden Tabelle dargestellt:

Tabelle 2. Beispiele für Container und Parameter
Containername Wert in Container
EGL-PARM-1 4 Byte zur Darstellung von INT
EGL-PARM-2 33.000 Byte zur Darstellung des Datensatzes
EGL-PARM-3 4 Byte zur Darstellung des Zeigers zu STRING (das aufgerufene Programm muss EGL sein)

Aufrufe von EGL-Programmen zu EGL-Programmen

Das aufgerufene Programm wird ausgeführt und gibt die Steuerung an das aufrufende Programm zurück, wenn das Programm beendet wird oder die Anweisung "exit program" auftritt. Es können bis zu 30 Parameter an eine "call"-Anweisung übergeben werden. Es tritt kein CICS SYNCPOINT als Ergebnis der Anweisung "call" auf. Die Eigenschaften "type", "linkType" und "parmForm" für ein aufgerufenes Programm müssen identisch sein, wenn sowohl das aufrufende als auch das aufgerufene Programm generiert werden. Wenn der Verbindungstyp oder das Parametertyp geändert werden, müssen das aufgerufene Programm und alle Programme, die es aufrufen, erneut generiert werden. Eine Beschreibung der Parameterformate, die für Aufrufe verwendet werden, finden Sie oben unter "Format aller Aufrufanweisungsparameter".

Sie können ein aufgerufenes Programm für z/OS Batch generieren sowie das Programm unter CICS verwenden. Damit der Aufruf unter CICS funktioniert, führen Sie die Mainframe-Erstellung wie im IBM® Rational COBOL Runtime Guide für zSeries, Kapitel 11, Abschnitt "CICS-Einrichtung zum Aufrufen von z/OS-Batchprogrammen in CICS" beschrieben durch.

Aufrufe von EGL-Programmen zu Nicht-EGL-Programmen

Die Anweisung "call", mit der ein Nicht-EGL-Programm aufgerufen wird, wird auf dieselbe Weise implementiert wie beim Aufrufen eines EGL-Programms. Wenn das Nicht-EGL-Programm in Assembler oder COBOL geschrieben wurde, können Sie die Option "linkType" im Eintrag "callLink" für das aufgerufene Programm auf DYNAMIC, STATIC oder CICSLINK festlegen. Wenn das Nicht-EGL-Programm allerdings in einer anderen Sprache als Assembler oder COBOL geschrieben oder mit dem EXEC CICS-Befehl LINK aufgerufen wurde, müssen Sie eine der folgenden Optionen angeben:
  • Legen Sie die Eigenschaft "isExternal" auf YES in der EGL-Anweisung "call" fest.
  • Geben Sie "pgmType = EXTERNALLYDEFINED" im Eintrag "callLink" für das aufgerufene Programm an.
Wenn das Nicht-EGL-Programm eine andere Verbindungskonvention als die Standardkonvention ("linkType = CICSLINK" und "parmForm = COMMPTR") verwendet, müssen Sie den Eintrag "callLink" für das Nicht-EGL-Programm im Verbindungsoptionsabschnitt mit den korrekten Werten für die Eigenschaften "type", "linkType" und "parmForm" einbeziehen. Eine Beschreibung der Parameterformate, die für Aufrufe verwendet werden, finden Sie in Format aller Aufrufanweisungsparameter für CICS.

Der Benutzerprogrammname muss auf CICS definiert sein und das Programm muss in der Ladebibliothek des Betriebssystems vorhanden sein. Anderenfalls tritt eine NOT FOUND-Bedingung auf. Das Programm muss auch gemäß der Programmierregeln auf CICS-Befehlsebene verknüpfungseditiert sein. Weitere Informationen finden Sie in der CICS-Anwendungsprogrammiererreferenz.

Handhabung von Abbrüchen bei Aufrufen von EGL-Programmen zu Nicht-EGL-Programmen

In CICS gibt es Überlegungen, wie Abbrüche gehandhabt werden, wenn ein EGL-Programm den Befehl COBOL CALL statt des CICS-Befehls LINK verwendet, um ein Nicht-EGL-COBOL-Programm aufzurufen. In dieser Situation inaktiviert die COBOL-Laufzeitumgebung die CICS-Abbruchhandhabung, die vom aufrufenden Programm für den Eintrag zum aufgerufenen Programm angefordert wurde. Das aufgerufene Programm sollte den Abbruchhandler für das EGL-Programm wiederherstellen, indem die Anweisung "CICS POP HANDLE" für den Eintrag zum aufgerufenen Programm und die Anweisung "CICS PUSH HANDLE" für die Beendigung des aufgerufenen Programms ausgegeben werden.

Wenn der Abbruchhandler nicht wiederhergestellt wird und das aufgerufene Programm abnormal beendet wird, wird keine normale Fehlerbereinigung für das EGL-Programm durchgeführt. Der Nutzungszähler der gemeinsam genutzten Tabelle wird nicht aktualisiert, wenn das Programm nicht erfolgreich beendet wird. Dies kann dazu führen, dass eine nicht benötigte Kopie der gemeinsam genutzten Tabelle im Speicher bleibt. Es werden keine Fehlermeldungen für Rational COBOL Runtime für zSeries vom Abbruchhandler ausgegeben.

Weitere Informationen zur Verwendung von COBOL-Aufrufen in der CICS-Umgebung finden Sie im Handbuch zur Anwendungsprogrammierung für Ihre CICS-Umgebung.

Beispiele für COMMPTR-Definitionen in Programmen

Wenn ein EGL-Programm CICSLINK und COMMPTR zum Übergeben von Parametern an ein Nicht-EGL-Programm verwendet, werden Zeiger zu den Parametern im CICS-COMMAREA übergeben. In den folgenden Abschnitten sind Beispiele enthalten, wie Nicht-EGL-Programme übergebene Parameter unter Verwendung von CICSLINK und COMMPTR empfangen können.

Parameter von CICSLINK mit COMMPTR per Assemblersprache empfangen

         L     PARMPTR,DFHEICAP   Address parameter list
         USING PARMAREA,PARMPTR
         L     PARM1PTR,PARM1A    Address parameter 1
         USING PARM1,PARM1PTR
         L     PARM2PTR,PARM2A    Address parameter 2
         USING PARM2,PARM2PTR
         L     PARM3PTR,PARM3A    Address parameter 3
         USING PARM3,PARM3PTR
         .
         .                        usw.
         .
PARMAREA DSECT                    Define storage layout of parmlist
PARM1A   DS    F                  Passed pointer to parameter 1
PARM2A   DS    F                  Passed pointer to parameter 2
PARM3A   DS    F                  Passed pointer to parameter 3
PARM1    DSECT                    Define storage layout of passed parm
RECORD   EQU   *                  Parameter is a record
FLD1     DS    L10                Fields in record structure
FLD2     DS    L20                " "
FLD3     DS    L200               " "
         .
         .                        usw.
         .
PARM2    DSECT                    Define storage layout of passed parm
L7701    DS    L5                 Parameter is single data item level-77
PARM3    DSECT                    Define storage layout of passed parm
WORKSTOR EQU   *                  Parameter is working storage
FLD5     DS    L5                 Fields in working storage
FLD6     DS    L5                 " "
         .
         .                        usw.
         .

Parameter von CICSLINK mit COMMPTR per COBOL empfangen

LINKAGE SECTION.
01 DFHCOMMAREA.
  02 PARM1A                    USAGE IS POINTER.
  02 PARM2A                    USAGE IS POINTER.
  02 PARM3A                    USAGE IS POINTER.
01 PARM1.
  02 RECORD.
    03 FLD1                    PIC X(10).
    03 FLD2                    PIC X(20).
    03 FLD3                    PIC X(200).
      .
      .                               usw.
      .
01 PARM2.
  02 L7701                     PIC X(5).
01 PARM3.
  02 WORKSTOR.
    03 FLD5                    PIC X(5).
    03 FLD6                    PIC X(5).
      .
      .                               usw.
      .
PROCEDURE DIVISION.
  SET ADDRESS OF PARM1 TO PARM1A
  SET ADDRESS OF PARM2 TO PARM2A
  SET ADDRESS OF PARM3 TO PARM3A
      .
      .                               usw.
      .

Aufrufe von Nicht-EGL-Programmen zu EGL-Programmen

Das EGL-Programm muss als aufgerufenes Programm definiert sein. Das aufgerufene Nicht-EGL-Programm ist dafür verantwortlich, die Parameter festzulegen, die im Verbindungsoptionsabschnitt für das aufgerufene Programm bei seiner Generierung angegeben wurden. Diagramme für die Verbindungen, die für verschiedene Parameterformate generiert werden, finden Sie in Format aller Aufrufanweisungsparameter für CICS.

Das Format der Variablen in der Parameterliste muss der Definition entsprechen, die für die vom aufgerufenen Programm empfangenen Parameter angegeben wurde. Wenn sie nicht identisch sind, sind die Ergebnisse nicht vorhersehbar.

Im folgenden Beispiel wird das Format CICS LINK für einen Programmaufruf zu einem Programm dargestellt, das mit dem COMMPTR-Parameterformat generiert wurde:
  EXEC CICS LINK
  PROGRAM('MYAPPL') COMMAREA(record of pointers) 
                   LENGTH(length of COMMAREA)
Wenn für "linkType" DYNAMIC oder STATIC angegeben wurde, wird bei Beendigung des aufgerufenen EGL-Programms das COBOL-Sonderregister RETURN-CODE auf den Wert der EGL-Variable "sysVar.returnCode" festgelegt. Dieser Rückgabecode, der in Register 15 gespeichert ist, kann vom aufrufenden Nicht-EGL-Programm getestet werden.

Feedback