transfer to program ステートメントでは、オプションのレコードを指定できます。 transfer to program ステートメントは、同じ CICS トランザクションを続行します。以下のセクションでは、transfer to program ステートメントが CICS 環境でどのように動作するかについて詳細に説明します。
EXEC CICS XCTL('progname') COMMAREA(record)
LENGTH(length of record)
EGL プログラムは、CICS XCTL を使用して transfer to program ステートメントに指定されたプログラム名のターゲットの非 EGL プログラムに即座に制御権を移動します。 レコードは、指定されている場合、COMMAREA で渡されます。 PSB がスケジュールされている場合は、transfer to program ステートメントで CICS SYNCPOINT が発生します。
EGL プログラムから非 EGL プログラムへの transfer to program は、EGL プログラム間の転送と同じ方法で実装されます。 transfer to program ステートメントで isExternal = YES を指定するか、生成中に使用されるリンケージ・オプション・パーツの transferToProgram 要素で fromPgm、toPgm、および linkType = EXTERNALLYDEFINED を指定する必要があります。 isExternal プロパティーまたは EXTERNALLYDEFINED リンク・タイプは、Rational® COBOL Runtime for zSeries によって割り振られたすべてのリソースが解放されることを示します。 非 EGL プログラムでは、COMMAREA にデータを受け取ります。
発生元のプログラムでは、CICS XCTL コマンドを発行してターゲットの EGL プログラムに移動します。 レコードを渡して、EGL プログラムのプロパティー inputRecord によって識別されるレコードの初期化に使用できます。
EXEC CICS XCTL ('progname') COMMAREA(record)
LENGTH (length of record)
ターゲット・プログラムがセグメント化されている場合は、ターゲット・プログラムが converse ステートメントを発行する前に、CICS TRANSACTION 項目内のターゲット・プログラムに関連付けられたトランザクション・コードに sysVar.transactionID を設定するようにしてください。 そのようにしないと、端末からの入力の受信時に、sysVar.transactionID (現在のトランザクション・コード) のデフォルト値により、ターゲットの EGL プログラムではなく、非 EGL プログラムが再起動されてしまいます。
transfer to transaction ステートメントでは、オプションのレコードを指定できます。 この transfer to transaction ステートメントにより、新規の CICS トランザクションが起動されます。 この移動プロセスの一部として、リカバリー可能リソースがコミットされます。 新規のトランザクションは、最初のトランザクションの終了の直後にスケジュールされます。 以下のセクションでは、transfer to transaction ステートメントが CICS 環境でどのように動作するかについて詳細に説明します。
以下のセクションでは、genReturnImmediate ビルド記述子オプションに指定する値に応じた、transfer to transaction ステートメント内の違いについて説明します。
ビルド記述子オプション genReturnImmediate を NO に設定した場合、発信元のプログラムではターゲット・トランザクションに対して EXEC CICS START コマンドを発行します。 レコードが transfer to transaction ステートメントに指定されている場合、 そのレコードは EXEC CICS START コマンドの FROM データとして渡されます。 その他の場合、FROM および LENGTH の各パラメーターは使用されません。
EXEC CICS START TRANSID('transid') FROM(record)
LENGTH(length of record)
TERMID(current-terminal)
EGL では、メイン・テキスト UI プログラムから transfer
to transaction が発行された場合は、常に CICS START コマンドの TERMID オプションを含めます。
トランザクションは、端末が CICS TCT で TRANSCEIVE ステータスにある場合を除き、起動されません。START コマンドは、4 文字以内の CICS トランザクション ID を参照します。 端末が現行で TRANSACTION ステータスではない場合、CICS は発信元プログラムと同じ端末上で新規の CICS トランザクションを開始します。
開始されたトランザクションにより、メイン・テキスト UI プログラムとして定義された非 EGL プログラムまたは EGL プログラムを開始できます。 新規トランザクションの開始後に、transfer to transaction ステートメントを発行しているプログラムは終了します。
EXEC CICS RETURN TRANSID('transid') COMMAREA(name of COMMAREA)
LENGTH(length of COMMAREA)
IMMEDIATE
EGL プログラムから非 EGL プログラムへの transfer to transaction ステートメントは、ビルド記述子オプション genReturnImmediate に応じて異なる方法で実装されます。 transfer to transaction ステートメントで isExternal = YES を指定するか、生成中に使用されるリンケージ・オプション・パーツの transferToTransaction 要素で toPgm および externallyDefined = YES を指定する必要があります。 isExternal または externallyDefined オプションを使用して、これが非 EGL プログラムへの転送であることを示す記述を指定できます。transfer to transaction によって新規の CICS トランザクションが開始されるため、 transfer ステートメントの結果として CICS SYNCPOINT が発生します。
EXEC CICS RETRIEVE INTO(myWorkingStorageArea)
LENGTH(workLength)
RETRIEVE コマンドの実行前に、必ず myWorkingStorageArea の長さを workLength に格納してください。ビルド記述子オプション genReturnImmediate が YES に設定されている場合、transfer to transaction ステートメントは EXEC CICS RETURN IMMEDIATE コマンドとして実装されます。 ターゲット・プログラムが受け取る COMMAREA の最初の 10 バイトは、2 進ゼロです。 transfer to transaction ステートメントにレコードが指定されている場合、そのレコードは COMMAREA の 11 バイト目以降にあります。
プログラムは、EGL プログラムに関連付けられた CICS トランザクション ID に対して CICS START コマンドを発行できます。 メイン・テキスト UI プログラムが開始されている場合は、CICS START コマンドの TERMID オプションに端末を指定する必要があります。 トランザクションは、端末が CICS TCT で TRANSCEIVE ステータスにある場合を除き、起動されません。レコードは、START コマンドの FROM オプションを使用して渡すことができます。 レコードが渡されると、EGL プログラムのプロパティー inputRecord によって識別されるレコードの初期化に使用されます。 ターゲット EGL プログラムでは、プログラムのロード時に自動的に表示されるその inputForm プロパティーに書式を指定できます。
EXEC CICS START TRANSID('transid') FROM(record)
LENGTH(length of record)
TERMID(current-terminal)
発生元のプログラムで EXEC CICS START コマンドが使用されている場合は、ターゲット・プログラムの生成時にビルド記述子オプション genReturnImmediate を YES または NO のいずれかに設定できます。ビルド記述子オプション genReturnImmediate を YES に設定して EGL プログラムが生成された場合、発生元の (非 EGL) プログラムでは CICS トランザクションに対して CICS RETURN IMMEDIATE コマンドを発行できます。 レコードは COMMAREA で渡すことができます。レコードの開始位置は COMMAREA 内の 11 バイト目です。 最初の 10 バイトは 2 進ゼロにする必要があります。 レコードが渡されると、EGL プログラムのプロパティー inputRecord によって識別されるレコードの初期化に使用されます。 ターゲット EGL プログラムでは、プログラムのロード時に自動的に表示されるその inputForm プロパティーに書式を指定できます。
EXEC CICS RETURN TRANSID('transid')
COMMAREA(10 bytes of low-values + record)
LENGTH(10 + length of record)
IMMEDIATE
EGL プログラムへの転送に CICS RETURN IMMEDIATE を使用する場合は、開始する EGL プログラムの生成時に genReturnImmediate ビルド記述子オプションを YES に設定する必要があります。制御権の移動にフォーム名を指定する場合は、show ステートメントを使用する必要があります。 returning 節が含まれた show ステートメントでフォームを指定する場合、発生元のプログラムではそのフォームを表示して、CICS に戻ります。 CICS RETURN コマンドは、プログラム・ユーザーによる画面への応答時にスケジュールされる次のトランザクションとして、show ステートメントのターゲット・トランザクション ID を指定します。 ターゲット・トランザクションは、EGL プログラムに関連付ける必要があります。 ターゲット・プログラムには、その inputForm プロパティーに指定されたフォームが必要であり、このフォームは show ステートメントに指定されたフォームと同一である必要があります。 ターゲット・トランザクションは、ユーザーがイベント・キーを押した後に制御権を受け取ります。
レコードが show ステートメントに指定される場合、そのレコードはターゲット・トランザクションによって COMMAREA で受け取られ、ターゲット・プログラムのプロパティー inputRecord によって指定されたレコードの初期化に使用されます。
show ステートメントを使用して非 EGL プログラムに移動することはできません。
EGL システム関数 vgLib.startTransaction() を使用して、非同期トランザクションを開始できます。非同期トランザクションで開始されるプログラムは、EGL または非 EGL のいずれかで作成できます。また、非 EGL プログラムを作成して、EGL プログラムを非同期的に開始することもできます。以下のセクションでは、その手法について説明します。
vgLib.startTransaction(requestRecord, prID, termID);
デフォルトの動作は、同じ CICS 領域に常駐するプログラムを開始することですが、vgLib.startTransaction() システム関数を呼び出すプログラムの生成時に使用するリンケージ・オプション・パーツの asynchLink 要素を定義することで、別の領域を指定できます。 ターゲット・トランザクションがリモート・システム上で開始された場合、prID および termID パラメーターは無視されます。
myCHAR = x"00000000";
EXEC CICS START ('transid') FROM(workRecord) LENGTH(length of workRecord)
TERMID(destTermid)
RTERMID(asyncPrintDest)
開始される EGL プログラムは、メイン基本プログラムとなります。これは、workRecord を使用して、EGL プログラムの inputRecord プロパティーで指定されたレコードを初期化します。
vgLib.startTransaction() システム関数で開始された非 EGL プログラムでは、渡されるレコードの取得に使用される CICS RETRIEVE コマンドに RTERMID オプションが常に含まれている必要があります (値がすべてゼロである場合も同様)。
EXEC CICS RETRIEVE INTO (workRecord) LENGTH(length of workRecord)
RTERMID(userRtermid)