Steuerung zu CICS-Umgebungen übertragen

Übertragungen zur CICS-Umgebung werden wie folgt unterstützt:

Übertragung zu Programm

Mit der Anweisung "transfer to program" kann ein optionaler Datensatz angegeben werden. Die Anweisung "transfer to program" setzt dieselbe CICS-Transaktion fort. In den folgenden Abschnitten wird detailliert erläutert, wie die Anweisung "transfer to program" in der CICS-Umgebung funktioniert.

Übertragung von EGL-Programmen zu EGL-Programmen mithilfe von "transfer to program"

Das EGL-Programm überträgt mit dem CICS-Befehl XCTL die Steuerung sofort zum Zielprogramm. Der Datensatz, wenn angegeben, wird an den Kommunikationsbereich (COMMAREA) übergeben. Es tritt ein CICS SYNCPOINT für die Anweisung "transfer to program" auf, wenn eine der folgenden Situationen vorliegt:
  • Sie haben die Erstellungsdeskriptoroption "synchOnPgmTransfer" auf YES festgelegt und es ist ein PSB terminiert.
  • Sie haben die Erstellungsdeskriptoroption "synchOnPgmTransfer" für das Ursprungsprogramm auf NO festgelegt und das Ursprungsprogramm hat einen PSB terminiert und es wurden verschiedene PSB-Namen für die PSB-Datensätze für die zwei Programme angegeben.
Anderenfalls tritt ein CICS SYNCPOINT auf. Im folgenden Beispiel wird dargestellt, wie mit dem von EGL generierten Befehl die Programmsteuerung übertragen wird:
EXEC CICS XCTL('progname') COMMAREA(record)
                          LENGTH(length of record)

Übertragung von EGL-Programmen zu Nicht-EGL-Programmen mithilfe von "transfer to program"

Das EGL-Programm überträgt die Steuerung sofort zum Nicht-EGL-Zielprogramm, indem der CICS-Befehl XCTL an den Programmnamen ausgegeben wird, der in der Anweisung "transfer to program" angegeben ist. Der Datensatz, wenn angegeben, wird an den Kommunikationsbereich (COMMAREA) übergeben. Es tritt ein CICS SYNCPOINT für die Anweisung "transfer to program" auf, wenn ein PSB terminiert ist.

Die Anweisung "transfer to program" von einem EGL-Programm zu einem Nicht-EGL-Programm wird auf dieselbe Art und Weise implementiert wie die Übertragung von einem EGL-Programm zum anderen. Sie müssen entweder "isExternal = YES" für die Anweisung "transfer to program" angeben oder "fromPgm", "toPgm" und "linkType = EXTERNALLYDEFINED" im Element "transferToProgram" im Verbindungsoptionsabschnitt während der Generierung angeben. Die Eigenschaft "isExternal" oder der Linktyp "EXTERNALLYDEFINED" geben an, dass alle Ressourcen, die von Rational COBOL Runtime für zSeries zugeordnet wurden, freigegeben wurden. Das Nicht-EGL-Programm empfängt Daten im Kommunikationsbereich (COMMAREA).

Übertragung von Nicht-EGL-Programmen zu EGL-Programmen mithilfe von CICS XCTL

Das Ursprungsprogramm gibt den CICS-Befehl XCTL aus, um eine Übertragung zum EGL-Zielprogramm durchzuführen. Der Datensatz kann übergeben werden und wird verwendet, um den Datensatz zu initialisieren, der von der Eigenschaft "inputRecord" des EGL-Programms identifiziert wurde.

Das Ursprungsprogramm muss als Hauptprogramm definiert sein und der Zielprogrammname ist der einzige erforderliche Parameter. Dieser Parameter muss auf einen gültigen EGL-Programmnamen verweisen.
EXEC CICS XCTL ('progname') COMMAREA(record)
                           LENGTH (length of record) 

Wenn das Zielprogramm segmentiert ist, stellen Sie sicher, dass vor der Ausgabe der Anweisung "converse" durch das Zielprogramm die "sysVar.transactionID" auf einen Transaktionscode, der dem Zielprogramm zugeordnet ist, im CICS-Eintrag TRANSACTION festgelegt ist. Wenn die Eingabe vom Terminal empfangen wird, verursacht anderenfalls der Standardwert in "sysVar.transactionID" (der aktuelle Transaktionscode) einen Neustart des Nicht-EGL-Programms anstelle des EGL-Zielprogramms.

Sie können "sysVar.transactionID" auf den richtigen Transaktionscode festlegen, wenn Sie einen der folgenden Schritte durchführen:
  • Angabe des Transaktionscodes als Erstellungsdeskriptoroption "restartTransactionID".
  • Verschiebung des Transaktionscodes zu "sysVar.transactionID" innerhalb des Programms vor der ersten Anweisung "converse".

Übertragung zu Transaktion

Mit der Anweisung "transfer to transaction" kann ein optionaler Datensatz angegeben werden. Die Anweisung "transfer to transaction" ist die Ursache dafür, dass eine neue CICS-Transaktion aufgerufen wird. Wiederherstellbare Ressourcen werden als Teil des Übertragungsprozesses festgeschrieben. Die neue Transaktion wird terminiert, sobald die erste Transaktion endet. In den folgenden Abschnitten wird detailliert erläutert, wie die Anweisung "transfer to transaction" in der CICS-Umgebung funktioniert.

Übertragung von EGL-Programmen zu EGL-Programmen mithilfe von "transfer to transaction"

In den folgenden Abschnitten werden die Unterschiede in der Anweisung "transfer to transaction" beschrieben, die je nach dem Wert auftreten, die Sie für die Erstellungsdeskriptoroption "genReturnImmediate" angeben.

Übertragung zu Transaktion mit "genReturnImmediate=NO"

Wenn Sie die Erstellungsdeskriptoroption "genReturnImmediate" auf NO festgelegt haben, gibt das Ursprungsprogramm den Befehl EXEC CICS START für die Zieltransaktion aus. Wenn ein Datensatz in der Anweisung "transfer to transaction" angegeben wurde, wird der Datensatz als FROM-Daten im Befehl EXEC CICS START übergeben. Anderenfalls werden die Parameter FROM und LENGTH nicht verwendet.

Im folgenden Beispiel wird das Format des Befehls START angezeigt, der von EGL generiert wird, wenn ein Datensatz in der Anweisung "transfer to transaction" angegeben wird:
EXEC CICS START TRANSID('transid') FROM(record) 
                                 LENGTH(length of record) 
                                 TERMID(current-terminal) 
EGL schließt die Option TERMID des CICS-Befehls START immer ein, wenn "transfer to transaction" von einem textUI-Hauptprogramm ausgegeben wird. Die Transaktion wird erst aufgerufen, wenn sich das Terminal im Status TRANSCEIVE in der CICS-Terminalsteuertabelle (TCT) befindet.

Der Befehl START bezieht sich auf eine CICS-Transaktions-ID mit maximal 4 Zeichen. CICS startet die neue CICS-Transaktion auf demselben Terminal wie das Ursprungsprogramm, wenn sich das Terminal zurzeit nicht im Status TRANSACTION befindet.

Die gestartete Transaktion kann ein Nicht-EGL-Programm oder ein EGL-Programm starten, das als textUI-Hauptprogramm definiert wurde. Nach dem Starten der neuen Transaktion wird das Programm, das die Anweisung "transfer to transaction" ausgibt, beendet.

Übertragung zu Transaktion mit "genReturnImmediate=YES"

Wenn Sie die Erstellungsdeskriptoroption "genReturnImmediate" auf YES festgelegt haben, gibt das Ursprungsprogramm den Befehl EXEC CICS RETURN IMMEDIATE für das Zielprogramm aus. Wenn ein Datensatz angegeben wird, wird dieser Datensatz an das elfte bis nte Byte des COMMAREA übergeben. Die ersten 10 Byte sind binäre Nullen, das heißt, die Anweisung "transfer to transaction" übergibt einen Datensatz. Im folgenden Beispiel wird der Befehl EXEC CICS RETURN IMMEDIATE angezeigt, der von EGL generiert wird, wenn ein Datensatz in der Anweisung "transfer to transaction" angegeben wird.
EXEC CICS RETURN TRANSID('transid') COMMAREA(name of COMMAREA)
                                 LENGTH(length of COMMAREA)
                                 IMMEDIATE

Übertragung von EGL-Programmen zu Nicht-EGL-Programmen mithilfe von "transfer to transaction"

Die Anweisung "transfer to transaction" von einem EGL-Programm zu einem Nicht-EGL-Programm wird je nach Erstellungsdeskriptoroption "genReturnImmediate" implementiert. Sie müssen entweder "isExternal = YES" für die Anweisung "transfer to transaction" angeben oder "toPgm" und "externallyDefined = YES" im Element "transferToTransaction im Verbindungsoptionsabschnitt während der Generierung angeben. Sie können die Option "isExternal" oder "externallyDefined" verwenden, um eine Dokumentation, d. h. eine Übertragung zu einem Nicht-EGL-Programm, bereitzustellen. Da mit "transfer to transaction" eine neue CICS-Transaktion gestartet wird, tritt ein CICS SYNCPOINT als Ergebnis der Anweisung "transfer" auf.

Wenn die Erstellungsdeskriptoroption "genReturnImmediate" auf NO festgelegt ist, wird die Anweisung "transfer to transaction" als Befehl EXEC CICS START implementiert. Der Datensatz, der bei der Verwendung der Anweisung "transfer to transaction" übergeben wird, wird in den temporären CICS-Speicher gespeichert. Das Nicht-EGL-Zielprogramm muss diesen Datensatz in seinen eigenen Datenbereich abrufen. CICS übergibt außerdem die Länge der abgerufenen Daten an das Programm. Diese Länge beträgt Null, wenn kein Datensatz übergeben wird. Mit dem folgenden CICS-Befehl wird der übergebene Datensatz abgerufen:
EXEC CICS RETRIEVE INTO(myWorkingStorageArea)
                 LENGTH(workLength)
Stellen Sie sicher, dass die Länge von "myWorkingStorageArea" in "workLength" platziert wird, bevor der Befehl RETRIEVE ausgeführt wird.

Wenn die Erstellungsdeskriptoroption "genReturnImmediate" auf YES festgelegt ist, wird die Anweisung "transfer to transaction" als EXEC CICS RETURN IMMEDIATE implementiert. Die ersten zehn Byte des COMMAREA, die vom Zielprogramm empfangen werden, sind binäre Nullen. Wenn ein Datensatz in der Anweisung "transfer to transaction" angegeben wurde, wird der Datensatz im COMMAREA ab dem elften Byte gefunden.

Übertragung von Nicht-EGL-Programmen zu EGL-Programmen mithilfe von CICS START

Das Programm kann den CICS-Befehl START für die CICS-Transaktions-ID ausgeben, die einem EGL-Programm zugeordnet ist. Das Terminal muss in der Option TERMID des CICS-Befehls START angegeben werden, wenn ein textUI-Hauptprogramm gestartet wird. Die Transaktion wird erst aufgerufen, wenn sich das Terminal im Status TRANSCEIVE in der CICS-Terminalsteuertabelle (TCT) befindet. Der Datensatz kann mit der Option FROM des Befehls START übergeben werden. Wenn ein Datensatz übergeben wird, wird dieser verwendet, um den Datensatz zu initialisieren, der von der Eigenschaft "inputRecord" des EGL-Programms identifiziert wurde. Das EGL-Zielprogramm kann ein Formular in seiner Eigenschaft "inputForm" angeben, das automatisch angezeigt wird, sobald das Programm geladen wird.

Im folgenden Beispiel wird das Format des Befehls START dargestellt, der beim Übergeben eines Datensatzes an das EGL-Programm verwendet werden kann:
EXEC CICS START TRANSID('transid') FROM(record)
                                 LENGTH(length of record)
                                 TERMID(current-terminal)
Wenn das Ursprungsprogramm den Befehl EXEC CICS START verwendet, können Sie die Erstellungsdeskriptoroption "genReturnImmediate" entweder auf YES oder NO festlegen, wenn Sie das Zielprogramm generieren.

Übertragung von Nicht-EGL-Programmen zu EGL-Programmen mithilfe von CICS RETURN IMMEDIATE

Wenn das EGL-Programm mit der auf YES festgelegten Erstellungsdeskriptoroption "genReturnImmediate" generiert wurde, gibt das Ursprungsprogramm (Nicht-EGL) den CICS-Befehl RETURN IMMEDIATE für die CICS-Transaktion aus. Der Datensatz kann an den COMMAREA übergeben werden und muss ab dem elften Byte starten. Die ersten zehn Byte müssen binäre Nullen sein. Wenn ein Datensatz übergeben wird, wird dieser verwendet, um den Datensatz zu initialisieren, der von der Eigenschaft "inputRecord" des EGL-Programms identifiziert wurde. Das EGL-Zielprogramm kann ein Formular in seiner Eigenschaft "inputForm" angeben, das automatisch angezeigt wird, sobald das Programm geladen wird.

Im folgenden Beispiel wird das Format des CICS-Befehls RETURN IMMEDIATE angezeigt, wenn Sie einen Datensatz an das EGL-Programm übergeben:
EXEC CICS RETURN TRANSID('transid')
                 COMMAREA(10 bytes of low-values + record)
                 LENGTH(10 + length of record)
                 IMMEDIATE 
Wenn Sie den CICS-Befehl RETURN IMMEDIATE für die Übertragung an ein EGL-Programm verwenden, müssen Sie die Erstellungsdeskriptoroption "genReturnImmediate" auf YES festlegen, wenn das zu startende EGL-Programm generiert wird.

Übertragung mithilfe von "show"

Wenn Sie einen Formularnamen in einer Steuerungsübertragung angeben möchten, müssen Sie die Anweisung "show" verwenden. Wenn Sie einen Formularnamen mit der Anweisung "show" mit der Klausel "returning" angeben, zeigt das Ursprungsprogramm das Formular an und kehrt zu CICS zurück. Der CICS-Befehl RETURN gibt die Zieltransaktions-ID von der Anweisung "show" als nächste zu terminierende Transaktion an, wenn der Programmbenutzer auf dem Bildschirm antwortet. Die Zieltransaktion muss einem EGL-Programm zugeordnet sein. Das Zielprogramm muss ein Formular besitzen, das in der Eigenschaft "inputForm" angegeben ist. Dieses Formular muss dem Formular entsprechen, das in der Anweisung "show" angegeben ist. Die Zieltransaktion empfängt die Steuerung, nachdem der Benutzer auf einen Ereignisschlüssel gedrückt hat.

Wenn ein Datensatz in der Anweisung "show" angegeben ist, wird der Datensatz im COMMAREA von der Zieltransaktion empfangen und dazu verwendet, den von der Eigenschaft "inputRecord" des Zielprogramms angegebenen Datensatz zu initialisieren.

Sie können keine Übertragung zu einem Nicht-EGL-Programm mit der Anweisung "show" durchführen.

Asynchrone Tasks verwenden

Sie können mit der EGL-Systemfunktion "vgLib.startTransaction()" eine asynchrone Transaktion starten. Sie können das Programm, das für die asynchrone Transaktion gestartet wird, entweder in EGL oder Nicht-EGL schreiben. Sie können außerdem ein Nicht-EGL-Programm schreiben, um ein EGL-Programm asynchron zu starten. In den folgenden Abschnitten werden die Verfahren dazu beschrieben.

Asynchrone Tasks von einem EGL-Programm aus starten

Ein EGL-Programm startet eine asynchrone Task mit der Anweisung "vgLib.startTransaction()", die den CICS-Befehl START generiert. Die Funktion "vgLib.startTransaction()" muss beispielsweise wie folgt aussehen:
vgLib.startTransaction(requestRecord, prID, termID);

Das Standardverhalten lautet wie folgt: Es wird ein Programm gestartet, das sich in derselben CICS-Region befindet. Sie können jedoch eine andere Region angeben, indem Sie das Element "asynchLink" in dem Verbindungsoptionsabschnitt definieren, der beim Generieren des Programms, das die Systemfunktion "vgLib.startTransaction()" aufruft, verwendet wird. Die Parameter "prID" und "termID" werden ignoriert, wenn die Zieltransaktion auf einem fernen System gestartet wird.

"requestRecord" muss das folgende Format haben:
  • Die Byte 1 bis 2 müssen ein SMALLINT-Feld sein, das auf die Länge des Datenabschnitts des Datensatzes plus 10 festgelegt ist.
  • Die Byte 3 bis 6 müssen die CICS-Transaktions-ID enthalten.
  • Die Byte 7 bis 10 müssen leer sein.
  • Der Datenabschnitt von "requestRecord" beginnt ab Byte 11. Es wird nur der tatsächliche Datenabschnitt des Datensatzes in der Option FROM des CICS-Befehls START übergeben. Wenn die gestartete Transaktion einem EGL-Programm zugeordnet ist, empfängt dieses EGL-Programm den Datenabschnitt von "requestRecord" in dem Datensatz, der von der Eigenschaft "inputRecord" angegeben wurde.
Abhängig vom Wert des Parameters "termID" gibt EGL den CICS-Befehl START mit oder ohne zugehöriges Gerät aus:
  • Wenn "termID" nicht angegeben ist, ordnet EGL der Zieltransaktion das aktuelle Terminal zu. EGL ordnet ausdrücklich der Option TERMID im CICS-Befehl START die aktuelle Terminal-ID zu.
  • Wenn "termID" angegeben ist und der Wert nicht aus binären Nullen besteht, ordnet EGL der Zieltransaktion das angegebene Gerät (Terminal oder Drucker) zu. EGL ordnet ausdrücklich den Wert "termID" der Option TERMID im CICS-Befehl START zu, aber schließt die Option RTERMID nicht mit ein. Die Ergebnisse sind nicht vorhersehbar, wenn der Wert in "termID" die CICS-Terminal-ID ist, die der aktuellen Transaktion zugeordnet wurde. Um die aktuelle Transaktion zu beenden und eine neue Transaktion am aktuellen Terminal zu starten, verwenden Sie die Anweisung "transfer to transaction" oder "show" anstelle der Systemfunktion "vgLib.startTransaction()".
  • Wenn der Wert des Parameters "termID" aus binären Nullen besteht, ordnet EGL der Zieltransaktion kein Terminal zu. EGL ordnet ausdrücklich den Wert des Parameters "prID" der Option RTERMID im CICS-Befehl START zu, aber schließt die Option TERMID nicht mit ein. Wenn Sie darüber hinaus die Erstellungsdeskriptoroption "printDestination" auf "TERMINALID" festlegen, wenn Sie das gestartete EGL-Programm generieren, entspricht der Parameter "prID" der Drucker-ID, die verwendet wird, um die Systemvariable "converseVar.printerAssociation" in der Zieltransaktion zu initialisieren. Um das CHAR-Feld "termID" auf binäre Nullen festzulegen, verwenden Sie eine Zuordnungsanweisung, die ein hexadezimales Literal von 4 Byte aus binären Nullen enthält. Beispiel:
    myCHAR = x"00000000";
  • Die Zieltransaktion muss einen CICS-Eintrag TRANSACTION haben.
  • Wenn das erste Programm in der gestarteten Transaktion ein Nicht-EGL-Programm ist, müssen Sie den CICS-Befehl RETRIEVE ausgeben, um den übergebenen Arbeitsbereich und die Terminalinformationen abzurufen. Weitere Informationen finden Sie in Daten für eine gestartete Task in einem Nicht-EGL-Programm abrufen.

EGL-Programme von Nicht-EGL-Programmen aus asynchron starten

Um eine asynchrone Transaktion, die einem EGL-Programm zugeordnet ist, von einem Nicht-EGL-Programm aus zu starten, geben Sie den CICS-Befehl START wie folgt aus:
EXEC CICS START ('transid') FROM(workRecord) LENGTH(length of workRecord)
                TERMID(destTermid)
                RTERMID(asyncPrintDest)

Das gestartete EGL-Programm muss ein Hauptbasisprogramm sein. Mit "workRecord" wird der Datensatz initialisiert, der von der Eigenschaft "inputRecord" des EGL-Programms angegeben wurde.

Die Optionen RTERMID und TERMID haben die folgende Bedeutung, wenn asynchrone Tasks gestartet werden:
  • Wenn Sie eine asynchrone Task ohne eine zugeordnete CICS-Terminal-ID starten möchten, dann lassen Sie das Schlüsselwort TERMID im Befehl START aus.
  • Wenn Sie eine Task mit einer zugeordneten Terminal-ID starten möchten, dann muss der Wert, den Sie in der Option TERMID angeben, eine gültige CICS-Terminal-ID sein. Die Ergebnisse sind nicht vorhersehbar, wenn Sie eine Terminal-ID angeben, die der aktuellen Transaktion zugeordnet ist.
  • Der Wert in der Option RTERMID muss das Ziel für die Druckausgabe für das gestartete EGL-Programm sein. Wenn Sie die Erstellungsdeskriptoroption "printDestination" auf TERMINALID festlegen, wenn Sie das gestartete EGL-Programm generieren, wird der Wert RTERMID verwendet, um "converseVar.printerAssociation" im gestarteten EGL-Programm zu initialisieren.

Daten für eine gestartete Task in einem Nicht-EGL-Programm abrufen

Nicht-EGL-Programme, die mit der Systemfunktion "vgLib.startTransaction()" gestartet wurden, müssen immer die Option RTERMID im CICS-Befehl RETRIEVE einschließen, der zum Abrufen des übergebenen Datensatzes verwendet wird, auch wenn der Wert nur aus Nullen besteht.

Das Programm empfängt die übergebenen Daten, indem Sie Folgendes durchführen:
EXEC CICS RETRIEVE INTO (workRecord) LENGTH(length of workRecord)
                         RTERMID(userRtermid) 
Die Optionen für den CICS-Befehl RETRIEVE haben die folgende Bedeutung, wenn ein Nicht-EGL-Programm als Ergebnis von "vgLib.startTransaction()" gestartet wird:
  • "workRecord" muss so definiert werden, dass er dem Datenabschnitt von "requestRecord" entspricht, den Sie in der Systemfunktion "vgLib.startTransaction()" (von Byte 11 bis zum Ende von "requestRecord") verwendet haben.
  • Die Länge von "workRecord" muss in LENGTH platziert werden.
  • Wenn die Option RTERMID 4 Byte aus binären Nullen enthält, sollte dies ignoriert werden. Wenn die Option RTERMID keine 4 Byte aus binären Nullen besteht, ist der Drucker (Parameter "prID") enthalten, der für die Funktion "vgLib.startTransaction()" angegeben wurde.

Feedback