IMSADF II プログラムとの間の移動

生成された EGL プログラムでは、IMSADF プログラムへの移動、または IMSADF プログラムからの移動が可能です。 即時のプログラム間メッセージ交換は、IMSADF II 会話型プログラムと、ビルド記述子オプション spaADF を YES に設定して生成された EGL セグメント化会話型プログラムの間で実行できます。 さらに、IMSADF II 2 次トランザクションは EGL バッチ・プログラムにより処理が可能です。

ただし、以下について注意してください。

IMSADF II 会話型処理

EGL は、IMSADF II の開始には使用できませんが、IMSADF II トランザクション・ドライバーに対する制御権の受け取り、または制御権の返還には使用できます。 これは、IMSADF II プログラム・システムが作業データベースで IMSADF II 28 バイト SPA を使用する場合にのみサポートされます。

以下のコード・サンプルには、IMSADF II、バージョン 2、リリース 2、作業データベースに対する EGL DLISegment レコード定義が示されています。 この定義の各フィールドは、EGL プログラムが IMSADF II 会話型トランザクション・ドライバーに直接移動する場合に変更が必要なフィールドに限定されます。
//*** RECORD=ADFWKDB ****
// ADFWORK データベースのサンプル・セグメント・レイアウトのデフォルト・
// セグメント・サイズは 6000 バイトです。 この DLISegment 定義は、
// ADF 作業データベースに対するデータの取得および保存に使用されます。
// 更新するフィールドについて詳しくは、「IMSADF Application Development Guide」
// 『付録 E』を参照してください。
// ***********************
Record ADFWKDB type DLISegment  {
  keyItem = "LTERMNME"
  }
  3 LTERMNME char(8) ; 
  3 SPALEGTH smallint ; 
  3 * char(4) ; 
  3 SPATRANS char(8) ; 
  3 * char(397) ; 
  3 SPABITS hex(2) ; 
  3 * char(6) ; 
  3 SPAFIRST smallint ; 
  3 SPARTNCD int ; 
  3 SPASECTX smallint ; 
  3 * char(4) ; 
  3 SPAPGOPT smallint ; 
  3 SPASWITH char(2) ; 
    4 RDFSWITH smallint ; 
  3 SPATRX char(3) ; 
  3 SPACGTRX char(3) ; 
  3 * char(66) ; 
  3 SPASHOTR char(8) ; 
  3 * char(31) ; 
  3 SPAKEYID char(255) ; 
  3 SPAFLDSG char(5192) ; 
end   // end ADFWKDB

Rational® COBOL Runtime for zSeries では、IMSADF II とその作業データベースを共用しません。 2 つのデータベースは形式が異なります。 IMSADF II 作業データベースへの変更は、Rational COBOL ランタイム作業データベースに影響しません。 同様に、EGL プログラムによる Rational COBOL ランタイム作業データベースへの変更は、IMSADF II 作業データベースに影響しません。

IMSADF II の側から開始し、すべて COBOL で作成されたトランザクションの定義と同じ方法で、EGL プログラムから IMSADF II に定義します。 詳しくは、ご使用のシステムの IMSADF II 資料を参照してください。 EGL 生成プログラム名 (およびその結果のロード・モジュール名) は、以下の IMSADF II 命名規則に従う必要があります。
ssssTcc
ssss
IMSADF II プログラム・システム ID。
T
定数。
cc
EGL プログラムへの切り替えを発生するトランザクションの生成に使用されるクラスター・コード (SOMTX) オペランド。

IMSADF II トランザクション・ドライバーから EGL プログラム

プログラム・ユーザーが EGL プログラムに対応する IMSADF II トランザクション ID を入力すると、IMSADF II は要求されたトランザクションに即時のプログラム間メッセージ交換を実行します。 IMSADF II は独自の 28 バイト SPA を IMS™ メッセージ・キューに書き込んで、交換を実行します。

EGL プログラムは、ビルド記述子オプション spaADF を YES に設定し、spaSize を IMSADF II SPA サイズに一致する 28 に設定して生成される必要があります。 IMS が新規のトランザクションをスケジュールする場合、EGL プログラム制御ロジックでは入出力 PCB から IMSADF II SPA を読み取ります。 上記のビルド記述子オプションがあるために、EGL プログラム制御ロジックは SPA を変更しません。 その結果、EGL プログラムは、最終的に即時のプログラム間メッセージ交換を実行して IMSADF II 会話型トランザクション・ドライバーに戻ることができます。 IMSADF II サインオン・トランザクションへの直接の交換はサポートされていません。

IMSADF II 会話型トランザクション・ドライバーに交換して戻る前に複数の EGL プログラムが実行される場合は、すべての EGL プログラムが上記と同じビルド記述子オプションで生成される必要があります。 プログラム制御ロジックは、Rational COBOL ランタイム作業データベース、または SPA に続く第 2 メッセージ・セグメントを使用して、EGL プログラム間でレコードを渡します。これにより、IMSADF II フォーマットの SPA は保持されます。 据え置きおよび即時の両方のプログラム間メッセージ交換が EGL プログラムの間で使用できます。

また、ビルド記述子オプション spaStatusBytePosition=p を指定することもできます。p は、EGL のセグメンテーション状況バイトに使用できる IMSADF II SPA の使用可能バイトを示します。 IMSADF II トランザクション・ドライバーから開始された一連のメッセージ交換に関連するすべての EGL プログラムには、同一のビルド記述子オプション spaSizespaADF、 および spaStatusBytePosition が必要です。 使用可能な SPA の位置に関する情報については、ご使用の IMSADF II の資料を参照してください。

COBOL プログラムのように、EGL は IMSADF II 作業データベースにアクセスして、IMSADF II 通信域内の情報を使用または変更できます。 IMSADF II 作業データベースにアクセスする場合、EGL ではその他のプログラム・データベースに対する方法で IMSADF II 作業データベースを処理します。 IMSADF II 作業データベースにアクセスするには、上記のレコード定義を使用してください。 DL/I IMSADF II 作業データベースを使用する場合は、EGL プログラムの PSB 定義に必ずデータベース PCB を含めてください。

EGL プログラムから IMSADF II トランザクション・ドライバー

IMSADF II トランザクション・ドライバーに切り替え戻すには、制御の受け取り時にそのトランザクション・ドライバーが実行する作業を通知する IMSADF II 作業データベース内のフラグを EGL プログラムで設定する必要があります。 詳しくは、ご使用のシステムの IMSADF II 資料を参照してください。 EGL プログラムでは、レコードを指定しない transfer to transaction ステートメントを使用して制御権を移動します。 開始する新規トランザクションの名前に sysVar.transferName を設定します。 この変数には、IMSADF II の変数 SPATRANS に配置された同じ値を格納する必要があります。 EGL プログラム制御ロジックは SPA を挿入し、結果として IMSADF II に戻す即時のプログラム間メッセージ交換が実行されます。

ADF モードの会話型プログラムでの移動

このセクションで説明されている手法は、IMSADF II から一連の EGL プログラムおよび非 EGL プログラムへの移動が IMSADF II へ戻す移動の前にある場合にのみ使用されます。 単一の EGL プログラムが実行され、次に IMSADF II に戻して移動する場合、プログラム制御ロジックでは自動的に IMSADF II SPA を保持します。 IMSADF II が関連しない場合の移動については、『IMS/VS 環境における制御権移動』を参照してください。

下の表に、ビルド記述子オプション spaADF が YES に設定されている場合の EGL プログラム間の移動に使用される規則を示します。 これらの規則は、特別な手法がレコードの受け渡しに使用されるため SPA をそのまま保持できるという点で、IMSADF II が関与しない場合に使用される手法とは異なっています。 ADF モードでは、セグメント化の非会話型プログラム間の移動はサポートされていません。

表 1. EGL 会話型プログラム間の移動
アクション 即時の交換 (入力フォームはオプション) 据え置きの交換 (入力フォーム付き)
コーディングおよび生成 両方のプログラムを segmented = YES として定義する。ビルド記述子オプション spaSize を 28 に設定し、spaADF を YES に設定して、両方のプログラムを会話型として生成する。 両方のプログラムを segmented = YES として定義する。ビルド記述子オプション spaSize を 28 に設定し、spaADF を YES に設定して、両方のプログラムを会話型として生成する。
移動の実行 発生元のプログラムはフォームを送信できない。 EGL プログラムである場合は、レコードで transfer to transaction ステートメントを使用してこれを実行する。 発生元のプログラムは、SPA の最初の書き込み後に端末に関連付けられたメッセージ・キューにフォームを書き込む必要がある。 EGL プログラムである場合は、フォームおよびオプションのレコードで show ステートメントを使用し、これを実行する。
入力フォームの使用 ターゲット・プログラムはオプションで入力フォームを取得できる。 ターゲット・プログラムには入力フォームが必要。
レコードの受け渡し。 レコードは SPA に後続するメッセージ・セグメントに転送される。 レコードがある場合、レコードは作業データベースを経由して転送される。
セグメンテーション状況バイトの指定 spaStatusBytePosition が指定された場合、ターゲット・プログラムでは、SPA の指定されたオフセット位置にあるセグメンテーション状況バイトの値を常に無視する。 spaStatusBytePosition が指定された場合、ターゲット・プログラムでは、プログラム・ユーザーが PA1 または PA2 を押すことにより発生する入力フォームの整合性に関する問題がある場合に、指定されたオフセット位置にあるセグメンテーション状況バイトの値を使用する。
spaStatusBytePosition によって指定されるセグメンテーション状況バイトは、会話型プログラムのプログラム間の移動に対してのみ使用されます。 バイトは、会話型プログラムとその他のプログラムとの間の移動用に存在します。 ただし、非 EGL プログラムの移動には、常にバイトをブランクに設定する必要があります。 ターゲットの非 EGL プログラムでは、セグメンテーション状況バイトの値を無視できます。

会話型の即時プログラム間メッセージ交換

会話型の即時プログラム間メッセージ交換は、以下のようにサポートされます。
  • 2 つの EGL プログラム間。
  • 非 EGL プログラムから EGL プログラムへ。
  • EGL プログラムから非 EGL プログラムへ。

2 つの EGL プログラム間の即時の交換

この手法では、2 つのセグメント化会話型の EGL プログラムが、フォームをプログラム・ユーザーに提示することなく、トランザクション名と PSB 名の両方を交換できます。 2 つのプログラムで、異なる FormGroup を使用できます。 2 つのプログラムのスケルトン定義については、『IMS/VS 環境における制御権移動』で『2 つの EGL プログラム間の即時の交換』を参照してください。IMSADF II プログラムが関連する場合は、ビルド記述子オプション spaADF を YES に設定する必要があることに注意してください。

EGL プログラム制御ロジックでは、SPA を自動的に保持し、プログラム A および B の両方について SPA に後続するメッセージ・セグメントとして渡されるレコードを管理します。プログラム A および B の両方に同じビルド記述子オプション spaSize (28 バイト) を指定してください。

非 EGL プログラムから EGL プログラムへの即時の交換

非 EGL プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、『IMS/VS 環境における制御権移動』にある『2 つの EGL プログラム間の即時の交換』のプログラム B と同様に定義される必要があります。IMSADF II プログラムが関連する場合は、ビルド記述子オプション spaADF を YES に設定する必要があることに注意してください。

非 EGL プログラムは、以下のようにすることが必要です。
  1. IMSADF II SPA フォーマットを保持します。
  2. SPA を代替 PCB に挿入し、宛先は EGL プログラムのトランザクション名に設定します。 ビルド記述子オプション spaStatusBytePosition を指定した場合、セグメンテーション状況バイトは SPA 内の指定したオフセット位置にあります。 SPA の挿入前に、セグメンテーション状況バイトをブランクに初期化してください。
  3. メッセージ・セグメントとして渡すレコードを、SPA の後の同じ代替 PCB に挿入します。 必要なメッセージのレイアウトについては、『IMS 非会話型メッセージ交換の EGL 入力メッセージのフォーマット』を参照してください。

EGL プログラムから非 EGL プログラムへの即時の交換

非 EGL プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、『IMS/VS 環境における制御権移動』にある『2 つの EGL プログラム間の即時の交換』のプログラム A と同様に定義される必要があります。IMSADF II プログラムが関連する場合は、ビルド記述子オプション spaADF を YES に設定する必要があることに注意してください。

非 EGL プログラムは、以下のようにすることが必要です。
  1. 入出力 PCB に get unique を発行し、SPA を読み取ります。 この SPA は元の IMSADF II フォーマットにあり、EGL プログラムによって変更されません。 ビルド記述子オプション spaStatusBytePosition を指定した場合、セグメンテーション状況バイトは SPA 内の指定したオフセット位置にあります。 非 EGL プログラムでは、セグメンテーション状況バイトの値を無視する必要があります。
  2. 入出力 PCB に get next を発行し、EGL プログラムにより渡されたレコードが含まれるメッセージを読み取ります。 必要なメッセージのレイアウトについては、『IMS 非会話型メッセージ交換の EGL 入力メッセージのフォーマット』を参照してください。
  3. IMSADF II SPA フォーマットを保持します。

会話型の据え置きのプログラム間メッセージ交換

会話型の据え置きのプログラム間メッセージ交換は、以下のようにサポートされます。
  • 2 つの EGL プログラム間。
  • 非 EGL プログラムから EGL プログラムへ。
  • EGL プログラムから非 EGL プログラムへ。

2 つの EGL プログラム間の据え置きの交換

この手法では、フォームがプログラム・ユーザーに提示される場合、2 つのセグメント化会話型の EGL プログラムがトランザクション名と PSB 名の両方を交換できます。 2 つのプログラムで、同じ FormGroup を使用する必要があります。 レコードを転送する必要はありませんが、フォームは必須です。 2 つのプログラムのスケルトン定義については、『IMS/VS 環境における制御権移動』で『2 つの EGL プログラム間の据え置きの交換』を参照してください。IMSADF II プログラムが関連する場合は、ビルド記述子オプション spaADF を YES に設定する必要があることに注意してください。

非 EGL プログラムから EGL プログラムへの据え置きの交換

非 EGL プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、『IMS/VS 環境における制御権移動』にある『2 つの EGL プログラム間の据え置きの交換』のプログラム B と同様に定義します。 IMSADF II プログラムが関連する場合は、ビルド記述子オプション spaADF を YES に設定する必要があることに注意してください。

非 EGL プログラムは、以下のようにすることが必要です。
  1. IMSADF II SPA フォーマットを保持します。ビルド記述子オプション spaStatusBytePosition を指定した場合、セグメンテーション状況バイトは SPA 内の指定したオフセット位置にあります。 SPA の挿入前に、セグメンテーション状況バイトをブランクに初期化してください。
  2. ELATSPUT を呼び出して、作業データベースを経由して EGL プログラムに渡すレコードを保存します。 詳しくは、「IMS/VS での EGL COBOL ランタイム作業データベースの使用」を参照してください。
  3. 入出力 PCB に SPA を挿入します。
  4. EGL プログラム内のメッセージ入力記述子に対応するメッセージ出力記述子を使用して、入出力 PCB にフォームを挿入します。 非 EGL プログラムでは、据え置きの交換で EGL プログラムに渡されるフォーム上のすべての変数データ・フィールドの変更データ・タグ (MDT) 属性を設定する必要があります。 その他のすべての属性は、デフォルト値のままにする必要があります。 必要な書式のレイアウトについては、『IMS MFS メッセージ入力記述子 (MID) のフォーマット』を参照してください。EGL では、非 EGL プログラムが使用する必要がある MID/MOD レコード・レイアウトの COBOL コピーブックを作成し、確実にレコード・フォーマットが一致するようにします。

EGL プログラムから非 EGL プログラムへの据え置きの交換

非 EGL プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、『IMS/VS 環境における制御権移動』にある『2 つの EGL プログラム間の据え置きの交換』のプログラム A と同様に定義します。 IMSADF II プログラムが関連する場合は、ビルド記述子オプション spaADF を YES に設定する必要があることに注意してください。 EGL プログラムでは、非 EGL プログラムが入力として必要とするフォーム上のすべての変数データ・フィールドの modified プロパティーを YES に設定する必要があります。

非 EGL プログラムは、以下のようにすることが必要です。
  1. 入出力 PCB に get unique を発行し、SPA を読み取ります。 この SPA は元の IMSADF II フォーマットにあり、EGL プログラムによって変更されません。
  2. 入出力 PCB に get next を発行し、EGL プログラムで使用されるメッセージ出力記述子に対応するメッセージ入力記述子を取得します。 必要なマップのレイアウトについては、『IMS MFS メッセージ入力記述子 (MID) のフォーマット』を参照してください。EGL では、非 EGL プログラムが使用する必要がある MID/MOD レコード・レイアウトの COBOL コピーブックを作成し、確実にレコード・フォーマットが一致するようにします。
  3. MID フォーム・フィールド EZEMAP-SSM-STATUS の値を使用して、作業データベースでレコードが渡されたかどうかを判別します。
    • EZEMAP-SSM-WSR-SAVED または EZEMAP-SSM-WSR-MAP-SAVED のいずれかが TRUE である場合は、作業データベースにレコードがあります。 以下のステップ 4 に説明されているように、そのレコードを取得します。
    • EZEMAP-SSM-FILL-CHAR が TRUE であり、これが初期 SPA ではない場合は、入力フォームの整合性に問題が発生しています (プログラム・ユーザーが PA1 または PA2 を押したことが原因である可能性があります)。 そのプログラムに対して適切な何らかの処置を実行し、入力フォームから脱落したデータをリカバリーします。 これには、ユーザー・ユーザーへのエラー・メッセージの送出、トランザクションの再始動、またはプログラム設計に応じたその他のリカバリー処置などが考えられます。 この場合、ビルド記述子オプション spaStatusBytePosition を指定すると、プログラムではセグメンテーション状況バイトを使用して、移動前に作業データベースにレコードが保存されていたかどうかを判別できます。 セグメンテーション状況バイトに値 C、c、D、または d がある場合は、作業データベースにレコードが保存されており、以下のステップ 4 に説明されているようにそのレコードを取得できます。
  4. ELATSGET を呼び出し、EGL プログラムによって作業データベースに保存されたレコードを取得します。 詳しくは、「IMS/VS での EGL COBOL ランタイム作業データベースの使用」を参照してください。
  5. IMSADF II SPA フォーマットを保持します。

フィードバック