CICS 環境でのプログラムの呼び出し
- localCall
- 同じ CICS 領域内で実行される呼び出し。
- remoteCall
- ある CICS 領域から別の領域に、または生成された Java™ プログラムから CICS で実行される生成済み COBOL プログラムに対して実行される呼び出し。
- DYNAMIC
- 標準の動的 COBOL 呼び出し。
- STATIC
- 標準の静的 COBOL 呼び出し。 呼び出し先プログラムは、呼び出し側プログラムでリンク・エディットされる必要があります。
- CICSLINK
- CICS LINK コマンド (CICS プログラムのデフォルト)。
CICSLINK は、以下の状況でのみサポートされます。
- 呼び出し先プログラムの callLink 要素が remoteCall を指定する。
- 呼び出し先プログラムの callLink 要素が parmForm = CHANNEL を指定する。
- call ステートメントが isExternal = YES を指定する、または呼び出し先プログラムの callLink 要素が pgmType = EXTERNALLYDEFINED を指定する。
- その他すべての場合は (CICSLINK がデフォルトの場合を含む)、EGL は、linkType = CICSLINK の CICS LINK コマンドを生成しません。 代わりに、EGL は、標準の動的 COBOL 呼び出し (呼び出し先プログラムの callLink 要素に linkType = DYNAMIC を指定した場合と同じ呼び出し) を生成します。
- linkType プロパティーが DYNAMIC または CICSLINK に設定された localCall。または、localCall について、プログラムの CICS 自動インストール機能を使用できます。
- remoteCall
- COMMPTR
- パラメーターへのポインターが COMMAREA で渡されます (プロパティー type が localCall である場合の CICS プログラムのデフォルト)。
- COMMDATA
- パラメーター・データが COMMAREA で渡されます (プロパティー type が remoteCall である場合の CICS プログラムのデフォルト)。
- OSLINK
- パラメーターが標準 COBOL パラメーター・リストを使用して渡されます。 呼び出し先プログラムには CICS ステートメントを含めることはできず、EGL プログラムにもなりません。
- CICSOSLINK
- 標準 COBOL パラメーター・リストが使用されます。 最初の 2 つのパラメーターは EXEC インターフェース・ブロック (EIB) と COMMAREA であり、後には call ステートメントのパラメーターが続きます。
- CHANNEL
- パラメーターがチャネル内のコンテナーで渡されます。コンテナーの名前は EGL-PARM-1 から EGL-PARM-n であり、n の最大値は 30 です。COMMAREA は、CHANNEL パラメーター・フォーマットでは渡されません。
| COMMPTR | COMMDATA | OSLINK | CICSOSLINK | CHANNEL | |
|---|---|---|---|---|---|
| DYNAMIC | 有効 | 有効 | 有効 | 有効 | なし |
| STATIC | 有効 | 有効 | 有効 | 有効 | なし |
| CICSLINK | 有効 | 有効 | なし | なし | 有効 |
| REMOTE | EGL 生成の Java プログラムからの呼び出しの場合は有効、CICS プログラムからの呼び出しの場合は無効。 | 有効 | なし | なし | 有効 |
詳しくは、『リンケージ・オプション・パーツ』を参照してください。
- 両方のプログラムが CICS で実行される場合は、プロパティー type を remoteCall に、プロパティー linkType を COMMDATA に設定します。 call ステートメントは CICS LINK コマンドとして生成され、データは COMMAREA 制御ブロック (COMMDATA) で渡されます。
- 呼び出し側プログラムが、生成された Java プログラムであり、呼び出し先プログラムが CICS で実行される場合は、type プロパティーを remoteCall に設定し、呼び出し先プログラムでのパラメーターの受け取り方法に応じて linkType プロパティーを COMMPTR または COMMDATA のいずれかに設定します。
呼び出し側または呼び出し先プログラムのいずれかが PL/I プログラムである場合は、プロパティー linkType を CICSLINK に設定する必要があります。また、呼び出し先プログラムが PL/I プログラムの場合、call ステートメントで isExternal = YES を指定するか、呼び出し先プログラムの callLink 要素で pgmType = EXTERNALLYDEFINED を指定する必要があります。 呼び出し側プログラムが PL/I プログラムの場合、呼び出し先 EGL プログラムの callLink 要素で linkType = CICSLINK を指定する必要があります。
以下のセクションでは、call ステートメントでのパラメーターの使用について詳しく説明します。
CICS 用の call ステートメント・パラメーターのフォーマット
以下のセクションでは、CICS 環境における call ステートメントに使用されるパラメーター・フォーマットについて詳細に説明します。
COMMAREA ポインター (COMMPTR) のパラメーター・フォーマット
COMMPTR パラメーター・フォーマットの場合は、ポインターが CICS COMMAREA で渡されます。 COMMAREA は、呼び出し側プログラムの COBOL 作業用ストレージ領域に生成されます。 上位ビットは、パラメーター・フォーマット COMMPTR の COMMAREA 内の最終パラメーター・アドレスに設定されます。
下の図には、COMMPTR パラメーター・フォーマットが示されています。 レジスター 1 は、ポインターのリストを指しています。 最初は EXEC インターフェース・ブロック (EIB) のアドレスであり、後に COMMAREA のアドレスが続きます。 パラメーターへのポインターは、COMMAREA で渡されます。

呼び出し側プログラムのビルド記述子オプション endCommarea を YES に設定すると、呼び出し側プログラムではパラメーター・リストの最後にフルワード x'FFFFFFFF' を追加します。 endCommarea を YES に設定するのは、CSP/AE (システム共通プロダクト/適用業務実行機能) プログラムから以前に呼び出されたプログラムのように、呼び出し先プログラムでこの終端フルワードが必要な場合のみにする必要があります。 endCommarea が YES に設定されている場合を除き、COMMAREA の長さにはこのフルワードの 4 バイトは含まれていません。 特定の条件では、CICS は呼び出し先プログラムに COMMAREA のコピーを渡します。
COMMAREA データ (COMMDATA) のパラメーター・フォーマット
COMMDATA パラメーター・フォーマットの場合、実際のデータは CICS COMMAREA の単一バッファーで渡されます。 COMMAREA は、呼び出し側プログラムの作業用ストレージ領域に生成されます。 各パラメーター値は COMMAREA に移動されます。 このとき、各値は相互に結合され、境界合わせは考慮されません。 可変長レコードが渡される場合は、EGL に定義されている最大レコード長でスペースが予約されます。 lengthItem プロパティーが設定された可変長レコードが渡される場合、必要スペースをレコードの固定部分内で定義する必要があります。 呼び出し先プログラムでは、COMMAREA に同じ順序でパラメーター値を戻す必要があります。 呼び出し側プログラムでは、COMMAREA に戻されたパラメーター値をオリジナルのパラメーターに移動します。
下の図には、COMMDATA パラメーター・フォーマットが示されています。 レジスター 1 は、ポインターのリストを指しています。 最初は EIB のアドレスであり、後に COMMAREA のアドレスが続きます。 実パラメーター・データは COMMAREA で渡されます。

OSLINK のパラメーター・フォーマット
- EXEC CICS コマンドを含まない非 EGL プログラム
- ZOSBATCH 環境用に生成される EGL プログラム。この場合、呼び出し先 EGL プログラムは入出力を行ってはなりません。また、呼び出し先 EGL プログラムの callLink 項目で linkType = DYNAMIC を指定する必要があります。
下の図には、OSLINK パラメーター・フォーマットが示されています。 レジスター 1 は、パラメーター・データのバッファーのアドレスであるポインターのリストを指しています (各パラメーターに 1 つ)。

CICSOSLINK のパラメーター・フォーマット
CICSOSLINK パラメーター・フォーマットの場合、EIB および COMMAREA が常に最初の 2 つのパラメーターとして渡され、それに続いて call ステートメントに指定されたパラメーターが渡されます。 CICSOSLINK は、STATIC および DYNAMIC の各リンケージ・タイプに対してのみ有効です。
下の図には、CICSOSLINK パラメーター・フォーマットが示されています。 レジスター 1 は、ポインターのリストを指しています。 最初は EIB のアドレスであり、後に COMMAREA のアドレスが続き、その後にはパラメーター・データのバッファーのアドレス (各パラメーターに 1 つ) が続きます。

CHANNEL パラメーター・フォーマット
CHANNEL パラメーター・フォーマットの場合、コンテナーがチャネルで渡されます。チャネルは、CICS プログラム間でデータを受け渡すパラメーターのように機能する、一連のコンテナーです。 COMMAREA は、CHANNEL パラメーター・フォーマットでは渡されません。
EGL 生成プログラムがチャネルを呼び出し先プログラムに渡す場合、チャネルは呼び出し先プログラムと同じ名前を持ちます。 ただし、EGL 呼び出し先プログラムがチャネルを受け取るとき、プログラムは CICS API 呼び出しを使用して、渡されたチャネルの名前を検索します。
コンテナーの名前は EGL-PARM-1 から EGL-PARM-n であり、n の最大値は 30 です。
例えば、タイプ INT、レコード (33,000 バイト)、および EGL STRING の 3 つのパラメーターを渡す場合、下の表に示すように、チャネルには 3 つのコンテナーが含まれます。
| コンテナー名 | コンテナーの値 |
|---|---|
| EGL-PARM-1 | INT を表す 4 バイト |
| EGL-PARM-2 | レコードを表す 33,000 バイト |
| EGL-PARM-3 | STRING へのポインターを表す 4 バイト (呼び出し先プログラムは EGL である必要がある) |
EGL プログラムから EGL プログラムへの呼び出し
実行中の呼び出し先プログラムは、プログラムの終了時、または exit program ステートメントが出現すると、呼び出し側プログラムに制御を返します。 最大で 30 のパラメーターを call ステートメントに渡すことができます。 call ステートメントの結果として CICS SYNCPOINT は発生しません。 呼び出し先プログラムのプロパティー type、linkType、および parmForm は、呼び出し側および呼び出し先の両方のプログラムの生成時に同一にする必要があります。 リンケージ・タイプまたはパラメーター・フォーマットが変更された場合は、呼び出し先プログラムおよびそれを呼び出すすべてのプログラムを再生成する必要があります。 呼び出しで使用されるパラメーター・フォーマットについて詳しくは、上記の call ステートメントの各パラメーター・フォーマットを参照してください。
z/OS® バッチに対応した呼び出し先プログラムを生成して、そのプログラムを CICS で使用することもできます。その呼び出しを CICS で実行するには、メインフレームをセットアップする必要があります (「IBM® Rational® COBOL Runtime for zSeries ガイド」の第 11 章にある『CICS で z/OS バッチ・プログラムを呼び出すための CICS セットアップ』というセクションを参照してください)。
EGL プログラムから非 EGL プログラムへの呼び出し
- EGL call ステートメントで isExternal プロパティーを YES に設定します。
- 呼び出し先プログラムの callLink 項目で pgmType = EXTERNALLYDEFINED を指定する。
ユーザー・プログラムの名前を CICS に定義し、そのプログラムがオペレーティング・システムのロード・ライブラリーに存在している必要があります。プログラム名を定義していない場合、またはプログラムがロード・ライブラリーに存在していない場合、未検出状態が発生します。 また、プログラムは CICS コマンド・レベルのプログラミング規則に準拠してリンク・エディットされる必要もあります。 詳しくは、CICS のアプリケーション・プログラマー解説書を参照してください。
EGL プログラムから非 EGL プログラムへの呼び出しの異常終了の処理
CICS では、 EGL プログラムが非 EGL COBOL プログラムの呼び出しに CICS LINK ではなく COBOL CALL を使用する場合に、異常終了の処理について考慮する必要があります。 このケースでは、COBOL ランタイム環境は、呼び出し先プログラムの開始時に呼び出し側プログラムによって要求された CICS 異常終了処理を使用不可に設定します。 呼び出し先プログラムでは、起動時に CICS POP HANDLE ステートメントを発行し、終了時に CICS PUSH HANDLE ステートメントを発行することにより、EGL プログラムの異常終了ハンドラーを復元する必要があります。
異常終了ハンドラーが復元されていない場合に、呼び出し先プログラムで異常終了が発生すると、EGL プログラムに対する通常のエラー終結処理が実行されません。 プログラム終了に失敗した場合、共用テーブルの使用回数は更新されません。 これにより、共用テーブルの不必要なデータがストレージに残される恐れがあります。 異常終了ハンドラーから、Rational COBOL Runtime for zSeries エラー・メッセージは発行されません。
CICS 環境での COBOL 呼び出しの使用方法について詳しくは、ご使用の CICS 環境のアプリケーション・プログラミング・ガイドを参照してください。
プログラムでの COMMPTR 定義の例
EGL プログラムが、CICSLINK および COMMPTR を使用してパラメーターを非 EGL プログラムに渡す場合、当該パラメーターへのポインターは CICS COMMAREA で渡されます。以下のセクションでは、非 EGL プログラムが、CICSLINK および COMMPTR を使用して渡されたパラメーターを受け取る方法の例を示します。
COMMPTR で CICSLINK からパラメーターを受け取るアセンブラー言語
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
.
. And so on
.
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 " "
.
. And so on
.
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 " "
.
. And so on
.
COMMPTR で CICSLINK からパラメーターを受け取る COBOL
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).
.
. And so on
.
01 PARM2.
02 L7701 PIC X(5).
01 PARM3.
02 WORKSTOR.
03 FLD5 PIC X(5).
03 FLD6 PIC X(5).
.
. And so on
.
PROCEDURE DIVISION.
SET ADDRESS OF PARM1 TO PARM1A
SET ADDRESS OF PARM2 TO PARM2A
SET ADDRESS OF PARM3 TO PARM3A
.
. And so on
.
非 EGL プログラムから EGL プログラムへの呼び出し
EGL プログラムは、呼び出し先プログラムとして定義する必要があります。 呼び出し側の非 EGL プログラムでは、その生成時に、呼び出し先プログラムのリンケージ・オプション・パーツに指定されているようにパラメーターを設定する必要があります。 さまざまなパラメーター・フォーマットに対して生成されるリンケージの図については、CICS 用の call ステートメント・パラメーターのフォーマットを参照してください。
パラメーター・リスト内の変数のフォーマットは、呼び出し先プログラムが受け取るパラメーターに指定された定義と一致する必要があります。 同一ではない場合の結果は予測不可能です。
EXEC CICS LINK
PROGRAM('MYAPPL') COMMAREA(record of pointers)
LENGTH(length of COMMAREA)
linkType が DYNAMIC または STATIC である場合、呼び出し先 EGL プログラムの終了時に COBOL 特殊レジスター RETURN-CODE が EGL 変数 sysVar.returnCode の値に設定されます。
レジスター 15 に格納されるこの戻りコードは、呼び出し側の非 EGL プログラムによって検査が可能です。ランタイム・サービスを初期化するための複数呼び出しの回避
実行単位内で呼び出される最初のプログラムが非 EGL プログラムであり、そのプログラムが EGL プログラムを繰り返し呼び出す場合、Rational COBOL Runtime for zSeries は、それぞれの呼び出しで初期化および終了の関数を実行します。 呼び出し回数が多いと、これらの呼び出しのオーバーヘッドが大きくなる場合があります。
このオーバーヘッドを回避し、初期化および終了の実行を 1 回にするため、EGL では各環境ごとにラッパー・プログラムを用意しています。 適切なラッパー・プログラムおよびご使用のメイン非 EGL プログラムとのリンク・エディットを行う必要があります。 これは、下のリンク・エディット・コマンドを使用して、名前 YOURPROG をご使用のプログラム名に置き換えることで行うことができます。 SELALMD は、ランタイム・サービスのロード・ライブラリーを表しています。
これらのラッパー・プログラムは、ゼロのデフォルト TWA オフセット値で定義されています。 そのため、ご使用の CICS 環境で TWAOFFSET の EGL ビルド記述子オプションをゼロ以外の値にする必要がある場合、これらのラッパー・プログラムは作動しません。 この場合、IBM はラッパーのソース・コードを提供することが可能です。 ソース・コードのアプリケーション・プロファイル・ブロックにある TWA オフセット・フィールドを手動で変更し、次にこれらの更新されたラッパー・プログラムをコンパイルおよびリンクして、使用してください。
次の例は、COMMDATA フォーマットのパラメーターを必要とする EGL プログラムの z/OS CICS 制御ステートメントを示しています。
CHANGE NONVGRTN(YOURPROG)
INCLUDE SELALMD(ELAWCCSD)
ENTRY ELAWCCSD
NAME YOURPROG(R)
次の例は、COMMPTR フォーマットのパラメーターを必要とする EGL プログラムの z/OS CICS 制御ステートメントを示しています。
CHANGE NONVGRTN(YOURPROG)
INCLUDE SELALMD(ELAWCCSP)
ENTRY ELAWCCSP
NAME YOURPROG(R)
