transfer

EGL の transfer 文は、メインプログラムから別のプログラムに制御権を与えて、転送側のプログラムを終了します。 さらにオプションで、受け取り側プログラムの入力レコード に受け入れられるデータを持っているレコードを渡します。呼び出し先プログラムでは、transfer 文は使用することができません。

ご使用のプログラムで、トランザクションへの制御権移動 書式の文か、またはプログラムへの制御権移動 という書式の文によって、制御権を移動することができます。
  • トランザクションへの転送は、以下のようにして行われます。
    • IMS/VS または CICS® for z/OS® で実行されるメインプログラムでは、 この文はリカバリー可能リソースをコミットし、ファイルをクローズし、カーソルをクローズし、 新規トランザクションを開始します。
    • z/OS メイン・バッチ・プログラム、IMS™ BMP、および Java™ メイン・テキスト・プログラムまたはメイン・バッチ・プログラムとして実行されるプログラムでは、 この文は同一の実行単位内でプログラムを開始しますが、制御権移動前の振る舞いは、ビルド記述子オプション synchOnTrxTransfer の設定によって異なります。
      • synchOnTrxTransfer の値が NO (デフォルト) の場合、transfer 文は、呼び出し先プログラムで使用可能なリソースを、クローズまたはコミットしません。
      • synchOnTrxTransfer の値が YES の場合、transfer 文はリカバリー可能リソースをコミットし、ファイルをクローズして、 カーソルをクローズします。
    • VGWebTransaction 型のプログラムでは、トランザクションへの制御権移動は無効です。 代わりに、以下の文のいずれかを使用してください。
      • プログラムへ制御権移動 という書式の transfer 文 (別の VGWebTransaction プログラムまたはメイン・バッチ・プログラムへ制御権移動する場合)、または
      • forward 文 (制御権を URL へ転送する場合)。
    • PageHandler では、トランザクションへの制御権移動は無効です。 代わりに、forward 文を使用してください。
  • プログラムへ制御権移動すると、同一の実行単位でプログラムが開始されます。 後述の、DL/I 処理に関連した例外を除き、プログラムへの制御権移動は同期点 を発生させません。 つまり、ファイルやカーソルをクローズしたり、リカバリー可能リソースのコミットやロールバックを行いません。
    プログラムへの制御権移動は、(任意のシステム上の) VGWebTransaction 型のプログラムと、 任意のメイン COBOL プログラムで使用できます。
    • CICS for z/OS では、制御権移動によって同期点は発生しません。 ただし、制御権移動が起きたときに PSB がスケジュールされており、 かつ以下の状況のいずれかが存在するときは、同期点が発生します。
      • 受け取り側のプログラムが最初に、異なる PSB をスケジュールするか、PSB を全く使用しないスケジュールをする場合、または
      • 受け取り側のプログラムが同一の PSB をスケジュールすることで開始するが、 ビルド記述子オプション synchOnPgmTransfer がデフォルト値である YES に設定されている場合。

      EGL は、CICS XCTL コマンドでこの文を実装し、 そのコマンドの COMMAREA オプションを使用してレコードを受け渡します。 その後、レコード・データは CICS 共通域の最初のバイトで開始します。

    • z/OS バッチ・プログラムおよび IMS BMP プログラムの場合、プログラムへの制御権移動は有効です。 受け取り側のプログラムが EGL で生成されたわけでも、VisualAge® Generator で生成されたわけでもない場合、EGL は OS XCTL マクロを使用して制御権移動を実装します。 いずれの場合にも、z/OS バッチ・プログラムと IMS BMP プログラムの間の制御権移動は無効です。
    • IMS/VS プログラムの場合、受取側のプログラムが EGL または VisualAge Generator によって生成されていた場合にのみ、プログラムへの制御権移動はサポートされます。

      トランザクションの初期プログラムがメイン・バッチ・プログラムである場合は、 メイン・トランザクション・プログラムへの制御権移動はサポートされません。 初期プログラムがメイン・トランザクションの場合、I/O PCB をアクセスする メイン・バッチ・プログラムへの移動は無効です。

リンケージ・オプション・パーツである transferLink エレメントは、Java コードから Java コードへ制御権を移動する場合は何の効果も与えませんが、それ以外では意味があります。

EGL または VisualAge Generator を使って作成されていないコードに制御コードを転送する場合は、リンケージ・オプション・パーツである transferLink 要素を以下のように設定することをお勧めします。
  • トランザクションに転送する場合は、externallyDefined プロパティーを yes に設定する。
  • プログラムに転送する場合は、linkType プロパティーを externallyDefined に設定する。

VisualAge Generator との互換性モードで実行している場合は、VisualAge Generator からマイグレーションされたプログラムの場合のように、transfer 文で externallyDefined オプションを指定することができます。ただし、その代わりにリンケージ・オプション・パーツに等価な値を設定することをお勧めします。 VisualAge Generator との互換性モードについての詳細は、『VisualAge Generator との互換性』を参照してください。


transfer 文の構文図
program targetName (デフォルト)
制御権を受け取るプログラム。COBOL のプログラムを作成していて、8 文字よりも長いプログラム名を 指定した場合は、そのプログラム名は 8 文字に切り捨てられ、必要であれば文字置換が行われます。 これについては、『名前の別名割り当て』で説明しています。
transaction targetName
前述の、制御権を受け取るトランザクションまたはプログラム。
sysVar.transferName
実行時に設定可能なターゲット名を含むシステム関数。 詳細については、『sysVar.transferName』を参照してください。
passing recordName
ターゲット・プログラムで、入力レコードとして受け取られるレコード。渡されるレコードの型は任意ですが、その長さとプリミティブ型は、データを受け取るレコードと互換性がある必要があります。ターゲット・プログラムの入力レコードは、 basicRecord 型であることが必要です。
externallyDefined
既に説明したように、新規の開発にはお勧めしません。

関連リファレンス
transferName

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.