Übergabe von Daten an andere Programme mit COMMAREA
COMMAREA gibt den Namen eines Datenbereichs (eines sogenannten Kommunikationsbereichs ) an, in dem Daten an ein Programm oder eine Transaktion übergeben werden. Dies ist eine Option der Befehle LINK, XCTL und RETURN.
Die Option COMMAREA der Befehle LINK und XCTL gibt den Namen eines Datenbereichs an, in dem Daten an das aufgerufene Programm übergeben werden.
Die Option COMMAREA eines RETURN-Befehls gibt den Namen eines Kommunikationsbereichs an, in dem Daten an die in der Option TRANSID identifizierte Transaktion übergeben werden. Die Option TRANSID gibt eine Transaktion an, die ausgelöst wird, wenn die nächste Eingabe von dem mit der Aufgabe verbundenen Terminal empfangen wird.
Das aufgerufene Programm erhält die Daten als Parameter. Das Programm muss eine Definition eines Datenbereichs enthalten, um den Zugriff auf die übergebenen Daten zu ermöglichen.
- Das empfangende Programm bei einem LINK- oder XCTL-Befehl, bei dem ein COMMAREA übergeben wird
- Das Ausgangsprogramm, bei dem ein RETURN-Befehl einer zuvor aufgerufenen Task eine COMMAREA und TRANSID angibt
In einem C- oder C++-Programm, das COMMAREA empfängt, muss COMMAREA als Zeiger auf eine Struktur definiert werden. Das Programm muss dann den Befehl ADDRESS COMMAREA geben, um die Adressierbarkeit der übergebenen Daten zu erreichen.
In einem Programm PL/I kann der Datenbereich einen beliebigen Namen haben, er muss jedoch als basierte Variable deklariert werden, die auf dem an das Programm übergebenen Parameter basiert. Der Zeiger auf diese Basisvariable sollte explizit als Zeiger deklariert werden und nicht kontextabhängig durch sein Erscheinen in der Deklaration für den Bereich. Dadurch wird verhindert, dass eine Fehlermeldung PL/I erzeugt wird. Im empfangenden Programm kann keine ALLOCATE-Anweisung für eine auf diesem Zeiger basierende Variable verarbeitet werden. Dieser Zeiger darf nicht durch das Anwendungsprogramm aktualisiert werden.
In einem Assembler-Programm sollte der Datenbereich eine DSECT-Abbildung sein. Das Register, mit dem dieser Datenbereich adressiert wird, muss aus DFHEICAP (communication area pointer) geladen werden, das durch DFHEISTG DSECT abgebildet wird. Ein COMMAREA kann nicht in einem 64-Bit-Speicher liegen.
Der Empfangsdatenbereich kann gleich lang oder kürzer als der ursprüngliche Kommunikationsbereich sein, darf aber nicht länger sein. Wenn nur auf den ersten Teil der Daten zugegriffen werden soll, kann der Empfangsdatenbereich kürzer sein. Wenn der Empfangsdatenbereich länger ist als der ursprüngliche Kommunikationsbereich, versucht Ihre Transaktion möglicherweise, Daten außerhalb des übergebenen Bereichs zu lesen. Es können auch Daten außerhalb des Bereichs überschrieben werden, was zu einem Abbruch von CICS® führen kann.
Um dies zu vermeiden, sollte Ihr Programm prüfen, ob die Länge eines übergebenen Kommunikationsbereichs den Erwartungen entspricht, indem es auf das Feld EIBCALEN im EIB der Task zugreift. Wenn kein Kommunikationsbereich übergeben wurde, ist der Wert von EIBCALEN gleich Null. Andernfalls enthält EIBCALEN immer den in der Option LENGTH eines LINK-, XCTL- oder RETURN-Befehls angegebenen Wert, unabhängig von der Größe des Datenbereichs im aufgerufenen Programm. Vergewissern Sie sich, dass der Wert in EIBCALEN mit dem Wert in der DSECT für Ihr Programm übereinstimmt, und stellen Sie sicher, dass Ihre Transaktion auf Daten in diesem Bereich zugreift.
Sie können auch einen Bezeichner zu COMMAREA hinzufügen, um die übergebenen Daten zusätzlich zu prüfen. Diese Kennung wird mit der sendenden Transaktion gesendet und von der empfangenden Transaktion überprüft.
Wenn ein Kommunikationsbereich mit einem LINK-Befehl übergeben wird, wird dem aufgerufenen Programm ein Zeiger auf den Kommunikationsbereich selbst übergeben. Alle Änderungen, die im aufgerufenen Programm am Inhalt des Datenbereichs vorgenommen werden, stehen dem aufrufenden Programm zur Verfügung, wenn die Kontrolle zu ihm zurückkehrt. Um auf solche Änderungen zuzugreifen, benennt das Programm den in der ursprünglichen Option COMMAREA angegebenen Datenbereich.
Wenn ein Kommunikationsbereich mit Hilfe eines XCTL-Befehls übergeben wird, wird eine Kopie dieses Bereichs erstellt, es sei denn, der zu übergebende Bereich hat dieselbe Adresse und Länge wie der Bereich, der an das den Befehl erteilende Programm übergeben wurde. Wenn beispielsweise Programm A einen LINK-Befehl an Programm B ausgibt, das wiederum einen XCTL-Befehl an Programm C ausgibt, und wenn B denselben Kommunikationsbereich an C weitergibt, den A an B weitergegeben hat, erhält Programm C die Adressierbarkeit des Kommunikationsbereichs, der zu A gehört (und nicht eine Kopie davon), und alle von C vorgenommenen Änderungen stehen A zur Verfügung, wenn die Kontrolle zu ihm zurückkehrt.
Wenn ein untergeordnetes Programm, auf das mit einem LINK-Befehl zugegriffen wurde, einen RETURN-Befehl ausgibt, geht die Kontrolle eine logische Ebene höher als das Programm, das die Kontrolle zurückgibt, zurück. Wenn die Aufgabe mit einem Terminal verbunden ist, kann die Option TRANSID auf der unteren Ebene verwendet werden, um den Transaktionsidentifikator für die nächste Transaktion anzugeben, die mit diesem Terminal verbunden werden soll. Die Transaktionskennung kommt erst ins Spiel, nachdem die höchste logische Ebene die Kontrolle mit einem RETURN-Befehl an CICS abgegeben hat und eine Eingabe vom Terminal empfangen wurde. Alle Eingaben, die über das Terminal getätigt werden, abgesehen von einer Aufmerksamkeitstaste, werden vollständig als Daten interpretiert. Sie können die Option TRANSID ohne COMMAREA verwenden, wenn Sie von einer beliebigen Verknüpfungsebene zurückkehren, aber sie kann bei einem späteren RETURN-Befehl übersteuert werden. Wenn ein RETURN-Befehl auf der höchsten Ebene wegen einer ungültigen COMMAREA fehlschlägt, wird die TRANSID null. Außerdem können Sie COMMAREA oder IMMEDIATE nur auf der höchsten Ebene angeben, ansonsten erhalten Sie ein INVREQ mit RESP2=2.
Darüber hinaus kann die Option COMMAREA verwendet werden, um Daten an die neu zu startende Aufgabe zu übergeben.
Das aufgerufene Programm kann durch Zugriff auf das Feld EIBFN im EIB feststellen, welche Art von Befehl es aufgerufen hat. Dieses Feld muss getestet werden, bevor irgendwelche CICS Befehle erteilt werden. Wenn das Programm durch einen LINK- oder XCTL-Befehl aufgerufen wurde, steht der entsprechende Code im EIBFN-Feld. Wenn sie durch einen RETURN-Befehl aufgerufen wurde, wurden in der Aufgabe keine CICS -Befehle erteilt, und das Feld enthält Nullen.