IMS/VS 環境における制御権移動

注: IMSADF II プログラムが関連する場合には、移動に対してさまざまな考慮事項が適用されます。 詳しくは、「Transferring to and from IMSADF II programs」を参照してください。

IMS/VS ターゲット環境用に生成された EGL メイン・テキスト UI プログラムは、IMS™ メッセージ処理プログラム (MPP) として実行されます。

transfer to transaction ステートメントによるプログラム制御の移動は、IMS/VS メイン基本プログラムではサポートされていません。 非 EGL プログラムでは、IMS プログラム間メッセージ交換を使用して EGL MPP プログラムを起動できます。 以下のタイプのメッセージ交換がサポートされています。
即時メッセージ交換
プログラム A は、発生元の端末に最初に応答することなく、プログラム B に関連付けられたトランザクションに制御権を直接渡します。 会話型 MPP の場合、宛先が新規のトランザクション名に設定されている代替 PCB を使用してスクラッチパッド領域 (SPA) を挿入することにより、プログラムはこの操作を実行します。 非会話型の MPP の場合、宛先が新規のトランザクション名に設定されている代替 PCB を使用してプログラムはメッセージを挿入します。
据え置きのメッセージ交換
プログラム A は端末に応答し、IMS に通知して、端末からの次の入力でプログラム B に関連付けられているトランザクションを開始します。 会話型の MPP の場合は、IMS に (入出力 PCB を使用して) 戻す前に新規のトランザクション名を指定するように SPA を変更することにより、メッセージ交換が実現されます。 非会話型の MPP の場合は、入力メッセージの最初の 8 バイトになるようにして新規のトランザクション名をマップに格納することにより、メッセージ交換が実現されます。
ターゲットの非 EGL プログラムまたは EGL プログラムの定義オプションおよび生成オプションにより、可能な交換のタイプおよびデータの受け渡し方法が制御されます。 会話型から非会話型への移動、または非会話型から会話型への移動は、EGL プログラムではサポートされていません。
ターゲット・トランザクションが EGL プログラムである場合は、プロパティー inputForm を使用することにより、以下のように有効なメッセージ交換のタイプを決定できます。 非 EGL プログラムが EGL プログラムへの据え置きのプログラム間メッセージ交換を実行する場合、その非 EGL プログラムではフォーム上のすべてのフィールドの変更データ・タグ (MDT) 属性をオンにして、その他のすべてのフィールドのプロパティーをフォーム定義中に定義された値に設定する必要があります。 プログラム・ユーザーがヘルプを要求する場合、または編集エラーが発生する場合は、プログラムによって、MDT 属性がなく、プログラム・ユーザーが変更していないすべてのフィールドにデフォルト・データが表示されます。 EGL プログラムは、その他のすべてのフィールド・プロパティーに対して定義済みのプロパティーを使用します。

ターゲット・トランザクションが処理の開始時にメッセージ・キューからのフォーム入力を必要とする非 EGL プログラムである場合、その EGL プログラムでは据え置きのプログラム間メッセージ交換 (EGL show ステートメント) を使用する必要があります。 それ以外の場合は、EGL プログラムは、即時のプログラム間メッセージ交換 (EGL transfer to transaction ステートメント) を使用する必要があります。

データの受け渡し方法は、以下の要因によって制御されます。

会話型プログラム間の移動

下の表に、会話型プログラム (ビルド記述子オプション spaSize > 0 で生成) 間のデータの受け渡しに使用される方式を示します。

表 1. 会話型 EGL プログラム (非 IMSADF インターフェース) でのプログラム交換
アクション 即時の交換 (入力フォームはオプション) 据え置きの交換 (入力フォーム付き)
コーディングおよび生成 両方のプログラムを segmented = YES として定義する。両方のプログラムを会話型 (spaSize > 0) として生成する。 両方のプログラムを segmented = YES として定義する。両方のプログラムを会話型 (spaSize > 0) として生成する。
移動の実行 移動元のプログラムはフォームを送信できない。 EGL プログラムである場合は、transfer to transaction ステートメントを使用してレコードを送信する。 移動元のプログラムは、SPA の最初の書き込み後に端末に関連付けられたメッセージ・キューにフォームを書き込む必要がある。 EGL プログラムである場合は、フォームおよびオプションのレコードで show を使用し、これを実行する。
入力フォームの使用 ターゲット・プログラムはオプションで入力フォームを取得できる。 ターゲット・プログラムには入力フォームが必要。
レコードの受け渡し。 レコードは SPA で転送される。 レコードがある場合、レコードは SPA で転送される。
セグメンテーション状況バイトの指定 spaStatusBytePosition が指定された場合、 セグメンテーション状況バイトは常に SPA の最終バイトに配置される。 ターゲット・プログラムは常にセグメンテーション状況バイトの値を無視する。 spaStatusBytePosition=n が指定された場合、 セグメンテーション状況バイトは n の値に基づいて、15 の位置、または SPA の最終バイトのいずれかに配置される。 ターゲット・プログラムでは、プログラム・ユーザーが PA1 または PA2 を押すことにより発生する入力フォームの整合性に関する問題がある場合に、セグメンテーション状況バイトの値を使用する。
注: spaStatusBytePosition によって指定されるセグメンテーション状況バイトは、会話型プログラムのプログラム間の移動に対してのみ使用されます。 バイトは、会話型プログラムとその他のプログラムとの間の移動用に存在します。 ただし、非 EGL プログラムの移動には、常にバイトをブランクに設定する必要があります。 ターゲットの非 EGL プログラムでは、常にセグメンテーション状況バイトの値を無視する必要があります。
移動の実行に transfer to transaction ステートメントまたは show ステートメントのいずれを使用するかに応じて、2 つのプログラム間で以下の項目を渡すことができます。
  • スクラッチパッド領域 (SPA) は、transfer to transaction ステートメントまたは show ステートメントのいずれによっても渡すことができます。
  • MFS マップ (EGL フォーム) は、show ステートメントでのみ受け渡しが可能です。
詳細およびレイアウトについては、『メッセージ交換用の IMS SPA のフォーマット』および『IMS MFS メッセージ入力記述子 (MID) のフォーマット』を参照してください。
会話型プログラムでは常に SPA を使用します。 SPA は、即時および据え置きのメッセージ交換の両方で渡されます。 EGL のメイン・テキスト UI プログラムを spaSize > 0 の設定で生成する場合、EGL では以下のように SPA を使用します。
  • あるユーザーに対して最初にトランザクションが開始すると、EGL は SPA のデータ部分からそのプログラムの入力レコードを初期化します。
  • transfer to transaction ステートメントまたは show ステートメントを使用して別のトランザクションにレコードを渡す場合、EGL は指定されたレコード内のデータに SPA のデータ部分を設定します。
さらに、据え置きの交換では、MFS マップを端末に渡すことができます。 EGL では、これを以下のように実行します。
  • あるユーザーに対して最初にトランザクションが開始されると、EGL は渡されたフォームを検査します。 そのようなフォームが存在する場合は、EGL はそのデータを使用してプログラムの入力フォームを初期化します。
  • show ステートメントの場合、EGL は端末にフォームを送信します。

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

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

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

この手法では、2 つのセグメント化された会話型 EGL プログラムが、フォームをプログラム・ユーザーに提示することなく、トランザクション名と PSB 名の両方を交換できます。 2 つのプログラムで異なる FormGroup を使用できます。 以下の例に、2 つのプログラムのスケルトン定義を示します。

program ProgramA type textUIProgram 
  {segmented=yes, inputRecord="basicRecord1", 
   @DLI { psb="psb" } }

  // 宣言
  basicRecord1 TRANSFER_RECORD;  
  psb PSB1A;

  // FormGroup
  use FORMGX;

  function main()
    ...
    sysVar.transferName = 'trx1b';
    transfer to transaction sysVar.transferName passing basicRecord1;
    ...
  end // end main
end // end ProgramA 
    
program ProgramB type textUIProgram    // inputForm はオプションです
  {segmented=yes, inputRecord="basicRecord1", inputForm="form2",
   @DLI { psb="psb" } }

  // 宣言
  basicRecord1 TRANSFER_RECORD;  
  psb PSB1B;

  // FormGroup
  use FORMGY;

  function main()
    // 生成された EGL ロジックでは以下を実行します:
    //   basicRecord1 を初期化
    //   inputForm が指定された場合:
    //     form2 と会話
    //     form2 の編集を実行
    //     form2 がすべての編集をパスするまで form2 と会話
    //   main 関数の最初のステートメントに制御権を提供
    ...
  end // end main
end // end ProgramB 

EGL 生成のプログラム制御ロジックでは、プログラム A からプログラム B に渡された SPA およびレコード (basicRecord1) を自動的に処理します。 プログラム A および B の各 SPA のデータ域は、関係する最大レコードの保持に十分な大きさでなければなりません。

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

非 EGL プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、上記の『2 つの EGL プログラム間の即時の交換』のプログラム B と同様に定義する必要があります。 ビルド記述子オプション spaSize では、非 EGL プログラムで使用されている SPA のサイズを指定する必要があります。

非 EGL プログラムは、以下のようにすることが必要です。
  1. 『メッセージ交換用の IMS SPA のフォーマット』で定義されているフォーマットで SPA を作成します。SPA のデータ域は、EGL プログラムが予定する入力レコードの定義に一致する必要があります。 EGL 生成のプログラム制御ロジックはヘッダー情報 (長さ、SPA ID、トランザクション名) を除去するため、EGL プログラムではデータのみを受け取ります。

    ビルド記述子オプションとして spaSize=n および spaStatusBytePosition=p を指定した場合、 spaStatusBytePosition の値にかかわらず、セグメンテーション状況バイトは SPA の最後にあります。 非 EGL プログラムでは、SPA の挿入前に、セグメンテーション状況バイトをブランクに初期化する必要があります。

  2. 代替 PCB に SPA を挿入します。 代替 PCB では、EGL プログラムのトランザクション名にその宛先を設定する必要があります。

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

非 EGL プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、上記の『2 つの EGL プログラム間の即時の交換』のプログラム A と同様に定義する必要があります。 ビルド記述子オプション spaSize では、非 EGL プログラムで使用されている SPA のサイズを指定する必要があります。

非 EGL プログラムでは、入出力 PCB に get unique を発行し、SPA を読み取る必要があります。 必要な SPA のレイアウトについては、『メッセージ交換用の IMS SPA のフォーマット』を参照してください。 SPA は、EGL プログラム制御ロジックによって生成されます。 SPA のデータ域には、EGL プログラムが transfer to transaction ステートメントで渡したレコードが格納されています。

ビルド記述子オプションとして spaSize=n および spaStatusBytePosition=p を指定した場合、 spaStatusBytePosition の値にかかわらず、セグメンテーション状況バイトは SPA の最後にあります。 非 EGL プログラムでは、SPA の最終バイトを無視する必要があります。

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

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

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

この手法では、フォームがプログラム・ユーザーに提示される場合、2 つのセグメント化会話型の EGL プログラムがトランザクション名と PSB 名の両方を交換できます。 両方のプログラムで同じ FormGroup を使用する必要があります。 レコードを転送する必要はありませんが、フォームは必須です。 以下の例に、2 つのプログラムのスケルトン定義を示します。

program ProgramA type textUIProgram 
  {segmented=yes, inputRecord="basicRecord2", 
   @DLI { psb="psb" } }

  // 宣言
  basicRecord2 TRANSFER_RECORD;  
  psb PSB2A;

  // FormGroup
  use FORMG2;

  function main()
    ...
    sysVar.transferName = 'trx2b';
    show form2 returning to sysVar.transferName passing basicRecord2;
    ...
  end // end main
end // end ProgramA 
    
program ProgramB type textUIProgram    // inputForm は必須です
  {segmented=yes, inputRecord="basicRecord2", inputForm="map2",
   @DLI { psb="psb" } }

  // 宣言
  basicRecord2 TRANSFER_RECORD;  
  psb PSB2B;

  // FormGroup
  use FORMG2;

  function main()
    // 生成された EGL ロジックでは以下を実行します:
    //   basicRecord2 を初期化
    //     map2 の編集を実行
    //     map2 がすべての編集をパスするまで map2 と会話
    //   main 関数の最初のステートメントに制御権を提供
    ...
  end // end main
end // end ProgramB 

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

非 EGL プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、上記の『2 つの EGL プログラム間の据え置きの交換』のプログラム B と同様に定義する必要があります。 ビルド記述子オプション spaSize では、非 EGL プログラムで使用されている SPA のサイズを指定する必要があります。

非 EGL プログラムは、以下のようにすることが必要です。
  1. 『メッセージ交換用の IMS SPA のフォーマット』で定義されているフォーマットで SPA を作成します。SPA のデータ域は、EGL プログラムが予定する入力レコードの定義に一致する必要があります。 EGL のプログラム制御ロジックはヘッダー情報 (長さ、SPA ID、トランザクション名) を除去するため、EGL プログラムではデータのみを受け取ります。

    ビルド記述子オプションとして spaSize=n および spaStatusBytePosition=p を指定した場合、 spaStatusBytePosition=p で指定された SPA 内のオフセット位置にあるセグメンテーション状況バイトを初期化する必要があります。 セグメンテーション状況バイトはブランクに初期化します。

  2. 入出力 PCB に SPA を挿入します。
  3. EGL プログラム内のメッセージ入力記述子に対応するメッセージ出力記述子を使用して、入出力 PCB に MFS マップ (EGL 書式) を挿入します。 非 EGL プログラムでは、据え置きの交換で EGL プログラムに渡される MFS マップ (EGL 書式) 上のすべての変数データ・フィールドの変更データ・タグ (MDT) 属性を設定する必要があります。 その他のすべての属性は、デフォルト値のままにする必要があります。 必要なマップのレイアウトについては、『IMS MFS メッセージ入力記述子 (MID) のフォーマット』を参照してください。EGL では、非 EGL プログラムで使用される MID/MOD レコード・レイアウトの COBOL コピーブックを生成し、確実にレコード・フォーマットが一致するようにします。

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

非 EGL プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、上記の『2 つの EGL プログラム間の据え置きの交換』のプログラム A と同様に定義する必要があります。 EGL プログラムでは、非 EGL プログラムの入力として必要なフォームのすべての変数データ・フィールドの modified プロパティーを YES に設定する必要があります。 ビルド記述子オプション spaSize では、非 EGL プログラムで使用されている SPA のサイズを指定する必要があります。

非 EGL プログラムは、以下のようにすることが必要です。
  1. 入出力 PCB に get unique を発行し、SPA を読み取ります。 必要な SPA のレイアウトについては、『メッセージ交換用の IMS SPA のフォーマット』を参照してください。 SPA は、EGL プログラム制御ロジックによって生成されます。 SPA のデータ域には、EGL プログラムが show ステートメントで渡したレコードが格納されています。

    ビルド記述子オプションとして spaSize=n および spaStatusBytePosition=p を指定した場合、 セグメンテーション状況バイトは 15 の位置、または SPA の最終バイトのいずれかにあります。 非 EGL プログラムでは、セグメンテーション状況バイトの値を無視する必要があります。

  2. 入出力 PCB に get next を発行し、EGL プログラムで使用されるメッセージ出力記述子に対応するメッセージ入力記述子を取得します。 必要なマップのレイアウトについては、『IMS MFS メッセージ入力記述子 (MID) のフォーマット』を参照してください。EGL では、非 EGL プログラムで使用される MID/MOD レコード・レイアウトの COBOL コピーブックを生成し、確実にレコード・フォーマットが一致するようにします。
  3. マップ MID フィールド EZEMAP-SSM-STATUS の値を使用して、MFS マップ (EGL 書式) の整合性に問題があったかどうかを特定します。 EZEMAP-SSM-FILLCHAR が TRUE であり、これが初期 SPA ではない (すなわち、会話の最初のトランザクションではない) 場合は、入力マップの整合性に問題が発生しています (プログラム・ユーザーが PA1 または PA2 を押したことが原因である可能性があります)。 そのプログラムに対して適切な何らかの処置を実行し、入力マップから脱落したデータをリカバリーします。 これには、ユーザー・ユーザーへのエラー・メッセージの送出、トランザクションの再始動、またはプログラム設計に応じたその他のリカバリー処置の実行などが考えられます。

非会話型プログラム間の移動

下の表に、非会話型プログラム間のデータの受け渡しに使用される方式を示します。 非会話型プログラムとは、ビルド記述子オプション spaSize を 0 に設定 (デフォルト設定) して生成されたメイン textUI プログラムです。

表 2. 非会話型 EGL プログラム (非 IMSADF インターフェース) でのプログラム交換
アクション 即時の交換 (入力フォームはオプション) 据え置きの交換 (入力フォーム付き)
コーディングおよび生成 両方のプログラムを segmented = YES として定義する。両方のプログラムを非会話型 (spaSize = 0) として生成する。 両方のプログラムを segmented = YES として定義する。両方のプログラムを非会話型 (spaSize = 0) として生成する。
移動の実行 移動元のプログラムはフォームを送信できない。 EGL プログラムである場合は、レコードで transfer to transaction を使用する。 移動元のプログラムは、端末に関連付けられたメッセージ・キューにフォームを書き込む必要がある。 EGL プログラムである場合は、フォームおよびオプションのレコードで show ステートメントを使用する。
入力フォームの使用 ターゲット・プログラムはオプションで入力フォームを取得できる。 ターゲット・プログラムには入力フォームが必要。
レコードの受け渡し。 レコードはメッセージに転送される。 レコードがある場合、レコードは作業データベースに転送される。
transfer to transaction ステートメントまたは show ステートメントのいずれを使用するかに応じて、2 つの非会話型プログラム間の移動で次の項目を渡すことができます。
  • IMS メッセージ・セグメント。 『IMS 非会話型メッセージ交換の EGL 入力メッセージのフォーマット』を参照してください。
  • MFS マップ (EGL フォーム)。 会話型および非会話型の移動で同じ MID および MOD 定義が使用されます。 据え置きのプログラム間メッセージ交換に対するレコード・レイアウトおよびマップ・メッセージ入力記述子 (MID) の COBOL 定義の例については、『IMS MFS メッセージ入力記述子 (MID) のフォーマット』を参照してください。

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

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

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

EGL プログラムを開発する場合、ビルド記述子オプション spaSize が 0 (非会話型) に設定されることを除き、この手法はセグメント化会話型の EGL プログラムと同じです。 この手法では、2 つの非会話型の EGL プログラムが、フォームをプログラム・ユーザーに提示することなく、トランザクション名と PSB 名の両方を交換できます。 2 つのプログラムで異なるフォーム・グループを使用できます。

2 つのプログラムの概要は、2 つの EGL プログラム間の会話型即時交換のプログラムと同じですが、生成時のビルド記述子オプション spaSize の値が異なります。 ただし、パフォーマンスを向上させるために、プログラム B の inputForm を省略できます。
program ProgramA type textUIProgram 
  {segmented=yes, inputRecord="basicRecord1", 
   @DLI { psb="psb" } }

  // 宣言
  basicRecord1 TRANSFER_RECORD;  
  psb PSB1A;

  // FormGroup
  use FORMGX;

  function main()
    ...
    sysVar.transferName = 'trx1b';
    transfer to transaction sysVar.transferName passing basicRecord1;
    ...
  end // end main
end // end ProgramA 
    
program ProgramB type textUIProgram
  // パフォーマンス向上目的で inputForm を省略
  {segmented=yes, inputRecord="basicRecord1", inputForm="form2",
   @DLI { psb="psb" } }

  // 宣言
  basicRecord1 TRANSFER_RECORD;  
  psb PSB1B;

  // FormGroup
  use FORMGY;

  function main()
    // 生成された EGL ロジックでは以下を実行します:
    //   basicRecord1 を初期化
    //   inputForm が指定された場合:
    //     form2 と会話
    //     form2 の編集を実行
    //     form2 がすべての編集をパスするまで form2 と会話
    //   main 関数の最初のステートメントに制御権を提供
    ...
  end // end main
end // end ProgramB 

EGL 生成のプログラム制御ロジックでは、制御権の移動に使用される IMS メッセージ、およびプログラム A から B に渡されるレコードが自動的に処理されます。

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

非 EGL プログラムは、IMS 非会話型プログラムでなければなりません。 EGL プログラムは、非会話型の「2 つの EGL プログラム間の即時交換」のプログラム B と同様に定義する必要があります。

非 EGL プログラムでは、代替 PCB にメッセージを挿入する必要があります。 宛先は、EGL プログラムのトランザクション名に設定する必要があります。 非 EGL プログラムでは、メッセージにヘッダー情報 (長さ、ZZ、およびトランザクション名) を提供する必要があります。 必要なメッセージのレイアウトについては、『IMS 非会話型メッセージ交換の EGL 入力メッセージのフォーマット』を参照してください。EGL 生成のプログラム制御ロジックではヘッダー情報を自動的に削除するため、EGL プログラムはデータのみを受け取ります。

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

非 EGL プログラムは、IMS 非会話型プログラムでなければなりません。 EGL プログラムは、非会話型の「2 つの EGL プログラム間の即時交換」のプログラム A と同様に定義する必要があります。

非 EGL プログラムでは、入出力 PCB に get unique を発行し、EGL プログラムが transfer to transaction ステートメントで渡したレコードを取得する必要があります。 必要なメッセージのレイアウトについては、『IMS 非会話型メッセージ交換の EGL 入力メッセージのフォーマット』を参照してください。EGL 生成のプログラム制御ロジックはヘッダー情報 (長さ、ZZ、トランザクション名) を自動的に提供するため、EGL プログラムではデータのみを定義します。 ただし、非 EGL プログラムは、ヘッダー情報を受け入れるように準備する必要があります。

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

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

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

EGL 開発者の視点から見ると、ビルド記述子オプション spaSize が非会話型プログラムを示す 0 に設定されることを除き、この手法はセグメント化会話型の EGL プログラムでの移動と同じです。 この手法では、フォームがプログラム・ユーザーに提示される場合、2 つの非会話型の EGL プログラムがトランザクション名と PSB 名の両方を交換できます。 両方のプログラムで同じ formGroup を使用する必要があります。 レコードを転送する必要はありませんが、フォームは必須です。

2 つのプログラムの概要は、2 つの EGL プログラム間の会話型据え置き交換のプログラムと同じですが、生成時のビルド記述子オプション spaSize の値が異なります。
program ProgramA type textUIProgram 
  {segmented=yes, inputRecord="basicRecord2", 
   @DLI { psb="psb" } }

  // 宣言
  basicRecord2 TRANSFER_RECORD;  
  psb PSB2A;

  // FormGroup
  use FORMG2;

  function main()
    ...
    sysVar.transferName = 'trx2b';
    show form2 returning to sysVar.transferName passing basicRecord2;
    ...
  end // end main
end // end ProgramA 
    
program ProgramB type textUIProgram    // inputForm は必須です
  {segmented=yes, inputRecord="basicRecord2", inputForm="map2",
   @DLI { psb="psb" } }

  // 宣言
  basicRecord2 TRANSFER_RECORD;  
  psb PSB2B;

  // FormGroup
  use FORMG2;

  function main()
    // 生成された EGL ロジックでは以下を実行します:
    //   basicRecord2 を初期化
    //     map2 の編集を実行
    //     map2 がすべての編集をパスするまで map2 と会話
    //   main 関数の最初のステートメントに制御権を提供
    ...
  end // end main
end // end ProgramB 

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

非 EGL プログラムは、IMS 非会話型プログラムでなければなりません。 EGL プログラムは、非会話型の「2 つの EGL プログラム間の据え置き交換」のプログラム B と同様に定義する必要があります。

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

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

非 EGL プログラムは、IMS 非会話型プログラムでなければなりません。 EGL プログラムは、非会話型の「2 つの EGL プログラム間の据え置き交換」のプログラム A と同様に定義する必要があります。 EGL プログラムでは、非 EGL プログラムの入力として必要なフォームのすべての変数データ・フィールドの modified プロパティーを YES に設定する必要があります。

非 EGL プログラムは、以下のようにすることが必要です。
  1. 入出力 PCB に get unique を発行し、EGL プログラムで使用されるメッセージ出力記述子に対応するメッセージ入力記述子を取得します。 必要なマップのレイアウトについては、『IMS MFS メッセージ入力記述子 (MID) のフォーマット』を参照してください。EGL では、非 EGL プログラムで使用される MID/MOD レコード・レイアウトの COBOL コピーブックを生成し、確実にレコード・フォーマットが一致するようにします。
  2. レコードを転送している場合、ELATSGET を呼び出して、EGL プログラムが show ステートメントで作業データベースから渡したレコードを取得します。 詳しくは、「IMS/VS での EGL COBOL ランタイム作業データベースの使用」を参照してください。

IMS のシリアル・ファイルを経由したインターフェース

EGL プログラムは、IMS メッセージ・キューに関連付けられたシリアル・ファイルのレコードに対して add ステートメントまたは get next ステートメントを実行することにより、非 EGL プログラムと通信できます。

以下のタイプのプログラムがシリアル・ファイルにレコードを (add を使用して) 追加できます。
  • メイン textUI プログラム
  • メイン基本プログラム
  • 呼び出し先プログラム
シリアル・ファイルからレコードを (get next を使用して) 取得できるのは、メイン基本プログラムのみです。

EGL プログラム間

EGL プログラムでは、生成時に ResourceAssociations パーツに以下の情報を指定することで、一連のシリアル・レコードを IMS メッセージ・キューに (add を使用して) 追加できます。
  • ファイルがメッセージ・キューであることの指示 (smsgq または mmsgq に設定された fileType)。
  • 使用される PCB 名。 これは、代替 PCB の名前でなければなりません。
EGL プログラムでは、IMS ヘッダー情報 (セグメント長、ZZ、およびトランザクション名) を自動的に処理します。 トランザクション名は、生成時に ResourceAssociations パーツで指定されたデフォルトの systemName か、レコードの resourceAssociation 変数の値に基づいて作成されます (この値を使用してデフォルト値をオーバーライドする場合)。 EGL のシリアル・レコード定義には IMS のヘッダー情報を組み込まないでください。

MPP またはトランザクション駆動型バッチ・メッセージ処理プログラム (BMP) のいずれかとして実行される EGL 基本プログラムでは、ファイルを使用して get next ステートメントでメッセージを読み取ります。 EGL プログラムでは、メッセージからヘッダー情報を自動的にストリップし、そのデータをシリアル・レコードに格納します。

非 EGL プログラムから EGL プログラム

非 EGL プログラムでは、MPP またはトランザクション駆動型 BMP のいずれかとして実行される EGL 基本プログラムが後で処理できるように、IMS メッセージ・キューに一連のレコードを書き込むことができます。 非 EGL プログラムは、レコードを処理するトランザクションに関連付けられた代替入出力 PCB に対して、以下に表に示されたフォーマットでレコードを挿入する必要があります。

表 3. メッセージ・キューに挿入されるレコードのフォーマット
フィールド 長さ (バイト) データのタイプ 説明
セグメント長 2 2 進数 セグメントの長さ。
予約済み (ZZ) 2 2 進数 予約済み。
IMS トランザクション名 8 文字 EGL プログラムの IMS トランザクション名。
プログラム定義のフィールド 可変長 可変長 この領域には、EGL シリアル・レコードに定義されたデータ項目が格納されます。

EGL 基本プログラムは、get next を使用して入出力 PCB に関連付けられたシリアル・ファイルを読み取り、メッセージを処理します。 EGL プログラムでは IMS メッセージ・ヘッダー (セグメント長、ZZ、およびトランザクション名) を自動的に除去するため、プログラムはシリアル・レコード内のメッセージ・データのみを受け取ります。

EGL プログラムから非 EGL プログラム

EGL プログラムがメッセージ・キューに関連付けられたシリアル・ファイルに対して add を実行する場合、 EGL プログラムではレコード・データの前に IMS メッセージ・ヘッダーを自動的に追加し、そのメッセージを代替 PCB に挿入します。 EGL プログラムは、メッセージ内の実際のデータにのみ関与します。

MPP またはトランザクション駆動型 BMP のいずれかとして実行される非 EGL プログラムでは、メッセージ・キューを処理できます。 メッセージ・キューに実際に挿入され、非 EGL プログラムによって受け取られるメッセージのフォーマットは、上記のセクション『非 EGL プログラムから EGL プログラム』の表に示されています。


フィードバック