CICS 環境でのプログラムの呼び出し

EGL での call ステートメントの生成方法を指定するには、リンケージ・オプション・パーツを使用します。 CICS® 環境では、 リンケージ・オプション・パーツ内の callLink エレメントのプロパティー type に以下のいずれかの値を指定できます。
localCall
同じ CICS 領域内で実行される呼び出し。
remoteCall
ある CICS 領域から別の領域に、または生成された Java™ プログラムから CICS で実行される生成済み COBOL プログラムに対して実行される呼び出し。
localCall の場合は、以下のように実際の call ステートメントを決定するプロパティー linkType も指定できます。
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 を指定した場合と同じ呼び出し) を生成します。
以下のリンケージ・オプションを使用して呼び出したすべての呼び出し先プログラムについて、CICS RDO PROGRAM 項目を作成する必要があります。
また、call ステートメントのパラメーターを呼び出し先プログラムに渡す方法も以下のように指定できます。
COMMPTR
パラメーターへのポインターが COMMAREA で渡されます (プロパティー typelocalCall である場合の CICS プログラムのデフォルト)。
COMMDATA
パラメーター・データが COMMAREA で渡されます (プロパティー typeremoteCall である場合の CICS プログラムのデフォルト)。
OSLINK
パラメーターが標準 COBOL パラメーター・リストを使用して渡されます。 呼び出し先プログラムには CICS ステートメントを含めることはできず、EGL プログラムにもなりません。
CICSOSLINK
標準 COBOL パラメーター・リストが使用されます。 最初の 2 つのパラメーターは EXEC インターフェース・ブロック (EIB) と COMMAREA であり、後には call ステートメントのパラメーターが続きます。
CHANNEL
パラメーターがチャネル内のコンテナーで渡されます。コンテナーの名前は EGL-PARM-1 から EGL-PARM-n であり、n の最大値は 30 です。COMMAREA は、CHANNEL パラメーター・フォーマットでは渡されません。
表 1. 有効な CICS のパラメーター・フォーマットとリンケージの組み合わせ
  COMMPTR COMMDATA OSLINK CICSOSLINK CHANNEL
DYNAMIC 有効 有効 有効 有効 なし
STATIC 有効 有効 有効 有効 なし
CICSLINK 有効 有効 なし なし 有効
REMOTE EGL 生成の Java プログラムからの呼び出しの場合は有効、CICS プログラムからの呼び出しの場合は無効。 有効 なし なし 有効

詳しくは、『リンケージ・オプション・パーツ』を参照してください。

ここで説明されているすべての呼び出しは、同じ CICS システムで実行されているプログラム間のローカル呼び出しです。 呼び出し先プログラムは、以下のように呼び出し側プログラムとは異なるシステムで実行できます。

呼び出し側または呼び出し先プログラムのいずれかが PL/I プログラムである場合は、プロパティー linkType を CICSLINK に設定する必要があります。また、呼び出し先プログラムが PL/I プログラムの場合、call ステートメントで isExternal = YES を指定するか、呼び出し先プログラムの callLink 要素で pgmType = EXTERNALLYDEFINED を指定する必要があります。 呼び出し側プログラムが PL/I プログラムの場合、呼び出し先 EGL プログラムの callLink 要素で linkType = CICSLINK を指定する必要があります。

以下のセクションでは、call ステートメントでのパラメーターの使用について詳しく説明します。

CICS 用の call ステートメント・パラメーターのフォーマット

以下のセクションでは、CICS 環境における call ステートメントに使用されるパラメーター・フォーマットについて詳細に説明します。

注: パラメーターとして dliLib.psbData または PCB レコードを渡す場合は、特別な考慮事項が適用されます。詳しくは、『call または transfer ステートメントにおける特殊なパラメーターの参照情報』を参照してください。

COMMAREA ポインター (COMMPTR) のパラメーター・フォーマット

COMMPTR パラメーター・フォーマットの場合は、ポインターが CICS COMMAREA で渡されます。 COMMAREA は、呼び出し側プログラムの COBOL 作業用ストレージ領域に生成されます。 上位ビットは、パラメーター・フォーマット COMMPTR の COMMAREA 内の最終パラメーター・アドレスに設定されます。

下の図には、COMMPTR パラメーター・フォーマットが示されています。 レジスター 1 は、ポインターのリストを指しています。 最初は EXEC インターフェース・ブロック (EIB) のアドレスであり、後に COMMAREA のアドレスが続きます。 パラメーターへのポインターは、COMMAREA で渡されます。

COMMPTR パラメーター・フォーマット

呼び出し側プログラムのビルド記述子オプション 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 で渡されます。

COMMDATA パラメーター・フォーマット

OSLINK のパラメーター・フォーマット

OSLINK パラメーター・フォーマットの場合、EIB および COMMAREA は渡されません。call ステートメントに指定されたパラメーターのみが渡されます。 上位ビットは、パラメーター・フォーマット OSLINK のパラメーター・リスト内の最終アドレスに設定されます。 OSLINK は、DYNAMIC および STATIC の各リンケージ・タイプに対してのみ有効です。 呼び出し先プログラムは、以下のいずれかである必要があります。
  • EXEC CICS コマンドを含まない非 EGL プログラム
  • ZOSBATCH 環境用に生成される EGL プログラム。この場合、呼び出し先 EGL プログラムは入出力を行いません。また、呼び出し先 EGL プログラムの callLink 項目で linkType = DYNAMIC を指定する必要があります。

下の図には、OSLINK パラメーター・フォーマットが示されています。 レジスター 1 は、パラメーター・データのバッファーのアドレスであるポインターのリストを指しています (各パラメーターに 1 つ)。

OSLINK のパラメーター・フォーマット

CICSOSLINK のパラメーター・フォーマット

CICSOSLINK パラメーター・フォーマットの場合、EIB および COMMAREA が常に最初の 2 つのパラメーターとして渡され、それに続いて call ステートメントに指定されたパラメーターが渡されます。 CICSOSLINK は、STATIC および DYNAMIC の各リンケージ・タイプに対してのみ有効です。

下の図には、CICSOSLINK パラメーター・フォーマットが示されています。 レジスター 1 は、ポインターのリストを指しています。 最初は EIB のアドレスであり、後に COMMAREA のアドレスが続き、その後にはパラメーター・データのバッファーのアドレス (各パラメーターに 1 つ) が続きます。

CICSOSLINK のパラメーター・フォーマット

CHANNEL パラメーター・フォーマット

CHANNEL パラメーター・フォーマットの場合、コンテナーがチャネルで渡されます。チャネルは、CICS プログラム間でデータを受け渡すパラメーターのように機能する、一連のコンテナーです。 COMMAREA は、CHANNEL パラメーター・フォーマットでは渡されません。

EGL 生成プログラムがチャネルを呼び出し先プログラムに渡す場合、チャネルは呼び出し先プログラムと同じ名前を持ちます。 ただし、EGL 呼び出し先プログラムがチャネルを受け取るとき、プログラムは CICS API 呼び出しを使用して、渡されたチャネルの名前を検索します。

コンテナーの名前は EGL-PARM-1 から EGL-PARM-n であり、n の最大値は 30 です。

例えば、タイプ INT、レコード (33,000 バイト)、および EGL STRING の 3 つのパラメーターを渡す場合、下の表に示すように、チャネルには 3 つのコンテナーが含まれます。

表 2. コンテナーおよびパラメーターの例
コンテナー名 コンテナーの値
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 は発生しません。 呼び出し先プログラムのプロパティー typelinkType、および parmForm は、呼び出し側および呼び出し先の両方のプログラムの生成時に同一にする必要があります。 リンケージ・タイプまたはパラメーター・フォーマットが変更された場合は、呼び出し先プログラムおよびそれを呼び出すすべてのプログラムを再生成する必要があります。 呼び出しで使用されるパラメーター・フォーマットについて詳しくは、上記の call ステートメントの各パラメーター・フォーマットを参照してください。

z/OS® バッチに対応した呼び出し先プログラムを生成して、そのプログラムを CICS で使用することもできます。その呼び出しを CICS で実行するには、メインフレームをセットアップする必要があります (「IBM® Rational® COBOL Runtime for zSeries ガイド」の第 11 章にある『CICS で z/OS バッチ・プログラムを呼び出すための CICS セットアップ』というセクションを参照してください)。

EGL プログラムから非 EGL プログラムへの呼び出し

非 EGL プログラムを呼び出す call ステートメントは、EGL プログラムの呼び出しと同じ方法で実装されます。 非 EGL プログラムがアセンブラーまたは COBOL で記述されている場合、呼び出し先プログラムの callLink 項目で linkType オプションを DYNAMIC、STATIC、または CICSLINK に設定できます。ただし、非 EGL プログラムがアセンブラーまたは COBOL 以外の言語で記述されている場合、あるいは EXEC CICS LINK を使用して呼び出されている場合、以下のいずれかのオプションも指定する必要があります。
  • EGL call ステートメントで isExternal プロパティーを YES に設定します。
  • 呼び出し先プログラムの callLink 項目で pgmType = EXTERNALLYDEFINED を指定する。
非 EGL プログラムが、デフォルト (linkType = CICSLINK および parmForm = COMMPTR) 以外のリンケージ規約を使用する場合、typelinkType、および parmForm プロパティーに正しい値を指定して、非 EGL プログラムの callLink 項目をリンケージ・オプション・パーツに組み込む必要があります。 呼び出しに使用するパラメーター・フォーマットの説明については、CICS 用の call ステートメント・パラメーターのフォーマットを参照してください。

ユーザー・プログラムの名前を 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 ステートメント・パラメーターのフォーマットを参照してください。

パラメーター・リスト内の変数のフォーマットは、呼び出し先プログラムが受け取るパラメーターに指定された定義と一致する必要があります。 同一ではない場合の結果は予測不可能です。

以下の例に、COMMPTR パラメーター・フォーマットで生成されたプログラムを呼び出す CICS LINK のフォーマットを示します。
  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 プログラムによって検査が可能です。

フィードバック