CICS 環境における制御権移動

CICS® 環境での移動は、以下の方法でサポートされています。

Transfer to program

transfer to program ステートメントでは、オプションのレコードを指定できます。 transfer to program ステートメントは、同じ CICS トランザクションを続行します。以下のセクションでは、transfer to program ステートメントが CICS 環境でどのように動作するかについて詳細に説明します。

transfer to program を使用した EGL プログラムから EGL プログラムへの移動

EGL プログラムは、CICS XCTL コマンドを使用してターゲット・プログラムに即座に制御権を移動します。 レコードは、指定されている場合、COMMAREA で渡されます。 以下のいずれかの場合は、transfer to program ステートメントで CICS SYNCPOINT が発生します。
  • ビルド記述子オプション synchOnPgmTransfer を YES に設定し、PSB がスケジュールされた場合。
  • 発生元プログラムのビルド記述子オプション synchOnPgmTransfer を NO に設定し、発生元プログラムが PSB をスケジュールし、さらに、2 つのプログラムの PSB レコードに対して別々のデフォルト PSB 名が指定された場合。
その他の場合、CICS SYNCPOINT は発生しません。以下の例には、プログラム制御の移動用に EGL が生成するコマンドが示されています。
EXEC CICS XCTL('progname') COMMAREA(record)
                          LENGTH(length of record)

transfer to program を使用した EGL プログラムから非 EGL プログラムへの移動

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 要素で fromPgmtoPgm、および linkType = EXTERNALLYDEFINED を指定する必要があります。 isExternal プロパティーまたは EXTERNALLYDEFINED リンク・タイプは、Rational® COBOL Runtime for zSeries によって割り振られたすべてのリソースが解放されることを示します。 非 EGL プログラムでは、COMMAREA にデータを受け取ります。

CICS XCTL を使用した非 EGL プログラムから EGL プログラムへの移動

発生元のプログラムでは、CICS XCTL コマンドを発行してターゲットの EGL プログラムに移動します。 レコードを渡して、EGL プログラムのプロパティー inputRecord によって識別されるレコードの初期化に使用できます。

発生元のプログラムはメインプログラムとして定義される必要があり、必須のパラメーターはターゲット・プログラム名のみです。 そのパラメーターでは、有効な EGL プログラム名を指し示す必要があります。
EXEC CICS XCTL ('progname') COMMAREA(record)
                           LENGTH (length of record) 

ターゲット・プログラムがセグメント化されている場合は、ターゲット・プログラムが converse ステートメントを発行する前に、CICS TRANSACTION 項目内のターゲット・プログラムに関連付けられたトランザクション・コードに sysVar.transactionID を設定するようにしてください。 そのようにしないと、端末からの入力の受信時に、sysVar.transactionID (現在のトランザクション・コード) のデフォルト値により、ターゲットの EGL プログラムではなく、非 EGL プログラムが再起動されてしまいます。

sysVar.transactionID は、以下のいずれかを実行することにより、適切なトランザクション・コードに設定できます。
  • ビルド記述子オプション restartTransactionID にトランザクション・コードを指定する。
  • 最初の converse ステートメントの前に、プログラム内の sysVar.transactionID にトランザクション・コードを移動する。

Transfer to transaction

transfer to transaction ステートメントでは、オプションのレコードを指定できます。 この transfer to transaction ステートメントにより、新規の CICS トランザクションが起動されます。 この移動プロセスの一部として、リカバリー可能リソースがコミットされます。 新規のトランザクションは、最初のトランザクションの終了の直後にスケジュールされます。 以下のセクションでは、transfer to transaction ステートメントが CICS 環境でどのように動作するかについて詳細に説明します。

transfer to transaction を使用した EGL プログラムから EGL プログラムへの移動

以下のセクションでは、genReturnImmediate ビルド記述子オプションに指定する値に応じた、transfer to transaction ステートメント内の違いについて説明します。

genReturnImmediate="NO" を指定した transfer to transaction

ビルド記述子オプション genReturnImmediate を NO に設定した場合、発信元のプログラムではターゲット・トランザクションに対して EXEC CICS START コマンドを発行します。 レコードが transfer to transaction ステートメントに指定されている場合、 そのレコードは EXEC CICS START コマンドの FROM データとして渡されます。 その他の場合、FROM および LENGTH の各パラメーターは使用されません。

以下の例では、レコードが transfer to transaction ステートメントに指定されている場合に EGL が生成する START コマンドのフォーマットを示します。
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 ステートメントを発行しているプログラムは終了します。

genReturnImmediate="YES" を指定した transfer to transaction

ビルド記述子オプション genReturnImmediate を YES に設定した場合、発信元のプログラムではターゲット・プログラムに対して EXEC CICS RETURN IMMEDIATE コマンドを発行します。 レコードが指定されている場合、そのレコードは COMMAREA の 11 番目から n 番目のバイトに渡されます。 最初の 10 バイトは 2 進ゼロであり、レコードを渡す transfer to transaction ステートメントであることを示しています。 以下の例は、transfer to transaction ステートメントでレコードが指定されている場合に EGL が生成する、EXEC CICS RETURN IMMEDIATE コマンドを示します。
EXEC CICS RETURN TRANSID('transid') COMMAREA(name of COMMAREA)
                                 LENGTH(length of COMMAREA)
                                 IMMEDIATE

transfer to transaction を使用した EGL プログラムから非 EGL プログラムへの移動

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 が発生します。

ビルド記述子オプション genReturnImmediate が NO に設定されている場合、transfer to transaction ステートメントは EXEC CICS START コマンドとして実装されます。 transfer to transaction ステートメントの使用時に渡されるレコードは、CICS の一時ストレージに格納されます。 非 EGL ターゲット・プログラムは、レコードをその独自のデータ域に取得します。 また、CICS は取得したデータの長さをプログラムに渡します。 この長さは、レコードが渡されない場合はゼロになります。 以下の CICS コマンドでは、渡されたレコードを取り出します。
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 バイト目以降にあります。

CICS START を使用した非 EGL プログラムから EGL プログラムへの移動

プログラムは、EGL プログラムに関連付けられた CICS トランザクション ID に対して CICS START コマンドを発行できます。 メイン・テキスト UI プログラムが開始されている場合は、CICS START コマンドの TERMID オプションに端末を指定する必要があります。 トランザクションは、端末が CICS TCT で TRANSCEIVE ステータスにある場合を除き、起動されません。レコードは、START コマンドの FROM オプションを使用して渡すことができます。 レコードが渡されると、EGL プログラムのプロパティー inputRecord によって識別されるレコードの初期化に使用されます。 ターゲット EGL プログラムでは、プログラムのロード時に自動的に表示されるその inputForm プロパティーに書式を指定できます。

以下の例に、EGL プログラムにレコードを渡す場合に使用できる START コマンドのフォーマットを示します。
EXEC CICS START TRANSID('transid') FROM(record)
                                 LENGTH(length of record)
                                 TERMID(current-terminal)
発生元のプログラムで EXEC CICS START コマンドが使用されている場合は、ターゲット・プログラムの生成時にビルド記述子オプション genReturnImmediate を YES または NO のいずれかに設定できます。

CICS RETURN IMMEDIATE を使用した非 EGL プログラムから EGL プログラムへの移動

ビルド記述子オプション genReturnImmediate を YES に設定して EGL プログラムが生成された場合、発生元の (非 EGL) プログラムでは CICS トランザクションに対して CICS RETURN IMMEDIATE コマンドを発行できます。 レコードは COMMAREA で渡すことができます。レコードの開始位置は COMMAREA 内の 11 バイト目です。 最初の 10 バイトは 2 進ゼロにする必要があります。 レコードが渡されると、EGL プログラムのプロパティー inputRecord によって識別されるレコードの初期化に使用されます。 ターゲット EGL プログラムでは、プログラムのロード時に自動的に表示されるその inputForm プロパティーに書式を指定できます。

以下の例は、レコードを EGL プログラムに渡す場合の CICS RETURN IMMEDIATE のフォーマットを示します。
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 を使用した移動

制御権の移動にフォーム名を指定する場合は、show ステートメントを使用する必要があります。 returning 節が含まれた show ステートメントでフォームを指定する場合、発生元のプログラムではそのフォームを表示して、CICS に戻ります。 CICS RETURN コマンドは、プログラム・ユーザーによる画面への応答時にスケジュールされる次のトランザクションとして、show ステートメントのターゲット・トランザクション ID を指定します。 ターゲット・トランザクションは、EGL プログラムに関連付ける必要があります。 ターゲット・プログラムには、その inputForm プロパティーに指定されたフォームが必要であり、このフォームは show ステートメントに指定されたフォームと同一である必要があります。 ターゲット・トランザクションは、ユーザーがイベント・キーを押した後に制御権を受け取ります。

レコードが show ステートメントに指定される場合、そのレコードはターゲット・トランザクションによって COMMAREA で受け取られ、ターゲット・プログラムのプロパティー inputRecord によって指定されたレコードの初期化に使用されます。

show ステートメントを使用して非 EGL プログラムに移動することはできません。

非同期タスクの使用

EGL システム関数 vgLib.startTransaction() を使用して、非同期トランザクションを開始できます。非同期トランザクションで開始されるプログラムは、EGL または非 EGL のいずれかで作成できます。また、非 EGL プログラムを作成して、EGL プログラムを非同期的に開始することもできます。以下のセクションでは、その手法について説明します。

EGL プログラムからの非同期タスクの開始

EGL プログラムは、CICS START コマンドを生成する vgLib.startTransaction() ステートメントで、非同期タスクを開始します。 例えば、vgLib.startTransaction() 関数は次のようになります。
vgLib.startTransaction(requestRecord, prID, termID);

デフォルトの動作は、同じ CICS 領域に常駐するプログラムを開始することですが、vgLib.startTransaction() システム関数を呼び出すプログラムの生成時に使用するリンケージ・オプション・パーツの asynchLink 要素を定義することで、別の領域を指定できます。 ターゲット・トランザクションがリモート・システム上で開始された場合、prID および termID パラメーターは無視されます。

requestRecord は、以下のフォーマットである必要があります。
  • レコードのバイト 1 から 2 は、レコードのデータ部分の長さに 10 を加算した値に設定された SMALLINT フィールドである必要があります。
  • バイト 3 から 6 には、CICS トランザクション ID を含める必要があります。
  • バイト 7 から 10 はブランクにする必要があります。
  • requestRecord のデータ部分は、バイト 11 から始まります。レコードの実際のデータ部分のみが、CICS START コマンドの FROM オプションで渡されます。 開始されるトランザクションが EGL プログラムに関連付けられている場合、その EGL プログラムは requestRecord のデータ部分を受け取り、inputRecord プロパティーで指定されたレコードに格納します。
EGL は、termID パラメーターの値に応じて、関連する装置の有無に関係なく CICS START コマンドを発行します。
  • termID を指定しない場合、EGL は現行の端末とターゲット・トランザクションを関連付けます。 具体的には、EGL は現行の端末 ID を CICS START コマンドで TERMID オプションに割り当てます。
  • 値が 2 進ゼロではない termID を指定した場合、EGL は、指定した装置 (端末またはプリンター) とターゲット・トランザクションを関連付けます。具体的には、EGL は termID の値を、CICS START コマンドの TERMID オプションに割り当てますが、RTERMID オプションは含まれません。 termID の値が、現行トランザクションに関連付けられた CICS 端末 ID である場合、その結果は予測できません。 現行トランザクションを終了して、現行端末で新規トランザクションを開始するには、vgLib.startTransaction() システム関数ではなく、transfer to transaction または show ステートメントを使用します。
  • termID パラメーターの値が 2 進ゼロである場合、EGL は端末をターゲット・トランザクションに関連付けません。 具体的には、EGL は prID パラメーターの値を、CICS START コマンドの RTERMID オプションに割り当てますが、TERMID オプションは含まれません。 また、開始される EGL プログラムの生成時に printDestination ビルド記述子オプションを TERMINALID に設定した場合、prID パラメーターは、ターゲット・トランザクションにおいて converseVar.printerAssociation システム変数の初期化に使用するプリンター ID です。termID CHAR フィールドを 2 進ゼロに設定するには、次の例に示すような 4 バイトの 2 進ゼロの 16 進数リテラルが含まれる割り当てステートメントを使用します。
    myCHAR = x"00000000";
  • ターゲット・トランザクションには CICS TRANSACTION 項目が必要です。
  • 開始されるトランザクション内の最初のプログラムが非 EGL プログラムである場合、CICS RETRIEVE を発行して、受け渡される作業域および端末の情報を取得する必要があります。 詳しくは、非 EGL プログラムでの開始済みタスクのデータ取得を参照してください。

非 EGL プログラムからの EGL プログラムの非同期的な開始

EGL プログラムに関連付けられた非同期トランザクションを非 EGL プログラムから開始するには、次のような CICS START コマンドを発行します。
EXEC CICS START ('transid') FROM(workRecord) LENGTH(length of workRecord)
                TERMID(destTermid)
                RTERMID(asyncPrintDest)

開始される EGL プログラムは、メイン基本プログラムとなります。これは、workRecord を使用して、EGL プログラムの inputRecord プロパティーで指定されたレコードを初期化します。

非同期タスクを開始する場合、RTERMID および TERMID オプションには以下の意味があります。
  • CICS 端末 ID を関連付けないで非同期タスクを開始する場合は、START コマンドで TERMID キーワードを省略します。
  • 端末 ID を関連付けてタスクを開始する場合、TERMID オプションに指定する値は有効な CICS 端末 ID にする必要があります。 現行のトランザクションに関連付けられている端末 ID を指定した場合、その結果は予測できません。
  • RTERMID オプションの値は、開始した EGL プログラムの印刷宛先にする必要があります。 開始される EGL プログラムの生成時に printDestination ビルド記述子オプションを TERMINALID に設定した場合、開始される EGL プログラムで converseVar.printerAssociation を初期化する際に RTERMID の値が使用されます。

非 EGL プログラムでの開始済みタスクのデータ取得

vgLib.startTransaction() システム関数で開始された非 EGL プログラムでは、渡されるレコードの取得に使用される CICS RETRIEVE コマンドに RTERMID オプションが常に含まれている必要があります (値がすべてゼロである場合も同様)。

プログラムでは、以下を実行することにより、渡されたデータを受け取ることができます。
EXEC CICS RETRIEVE INTO (workRecord) LENGTH(length of workRecord)
                         RTERMID(userRtermid) 
vgLib.startTransaction() の結果として非 EGL プログラムが開始される場合、CICS RETRIEVE コマンドのオプションには以下の意味があります。
  • vgLib.startTransaction() システム関数で使用した requestRecord のデータ部分と一致するように、workRecord が定義されている必要があります (バイト 11 から requestRecord の末尾まで)。
  • workRecord の長さを LENGTH に必ず格納してください。
  • RTERMID オプションに 4 バイトの 2 進ゼロが含まれている場合は、それを無視する必要があります。 RTERMID オプションが 4 バイトの 2 進ゼロでない場合、それには vgLib.startTransaction() 関数に指定されたプリンター (prID パラメーター) が含まれます。

フィードバック