IMS/VS ターゲット環境用に生成された EGL メイン・テキスト UI プログラムは、IMS™ メッセージ処理プログラム (MPP) として実行されます。
ターゲット・トランザクションが処理の開始時にメッセージ・キューからのフォーム入力を必要とする非 EGL プログラムである場合、その EGL プログラムでは据え置きのプログラム間メッセージ交換 (EGL show ステートメント) を使用する必要があります。 それ以外の場合は、EGL プログラムは、即時のプログラム間メッセージ交換 (EGL transfer to transaction ステートメント) を使用する必要があります。
下の表に、会話型プログラム (ビルド記述子オプション spaSize > 0 で生成) 間のデータの受け渡しに使用される方式を示します。
| アクション | 即時の交換 (入力フォームはオプション) | 据え置きの交換 (入力フォーム付き) |
|---|---|---|
| コーディングおよび生成 | 両方のプログラムを 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 プログラムでは、常にセグメンテーション状況バイトの値を無視する必要があります。 | ||
この手法では、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 プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、上記の『2 つの EGL プログラム間の即時の交換』のプログラム B と同様に定義する必要があります。 ビルド記述子オプション spaSize では、非 EGL プログラムで使用されている SPA のサイズを指定する必要があります。
ビルド記述子オプションとして spaSize=n および spaStatusBytePosition=p を指定した場合、 spaStatusBytePosition の値にかかわらず、セグメンテーション状況バイトは SPA の最後にあります。 非 EGL プログラムでは、SPA の挿入前に、セグメンテーション状況バイトをブランクに初期化する必要があります。
非 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 プログラムがトランザクション名と 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 プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、上記の『2 つの EGL プログラム間の据え置きの交換』のプログラム B と同様に定義する必要があります。 ビルド記述子オプション spaSize では、非 EGL プログラムで使用されている SPA のサイズを指定する必要があります。
ビルド記述子オプションとして spaSize=n および spaStatusBytePosition=p を指定した場合、 spaStatusBytePosition=p で指定された SPA 内のオフセット位置にあるセグメンテーション状況バイトを初期化する必要があります。 セグメンテーション状況バイトはブランクに初期化します。
非 EGL プログラムは、IMS 会話型プログラムでなければなりません。EGL プログラムは、上記の『2 つの EGL プログラム間の据え置きの交換』のプログラム A と同様に定義する必要があります。 EGL プログラムでは、非 EGL プログラムの入力として必要なフォームのすべての変数データ・フィールドの modified プロパティーを YES に設定する必要があります。 ビルド記述子オプション spaSize では、非 EGL プログラムで使用されている SPA のサイズを指定する必要があります。
ビルド記述子オプションとして spaSize=n および spaStatusBytePosition=p を指定した場合、 セグメンテーション状況バイトは 15 の位置、または SPA の最終バイトのいずれかにあります。 非 EGL プログラムでは、セグメンテーション状況バイトの値を無視する必要があります。
下の表に、非会話型プログラム間のデータの受け渡しに使用される方式を示します。 非会話型プログラムとは、ビルド記述子オプション spaSize を 0 に設定 (デフォルト設定) して生成されたメイン textUI プログラムです。
| アクション | 即時の交換 (入力フォームはオプション) | 据え置きの交換 (入力フォーム付き) |
|---|---|---|
| コーディングおよび生成 | 両方のプログラムを segmented = YES として定義する。両方のプログラムを非会話型 (spaSize = 0) として生成する。 | 両方のプログラムを segmented = YES として定義する。両方のプログラムを非会話型 (spaSize = 0) として生成する。 |
| 移動の実行 | 移動元のプログラムはフォームを送信できない。 EGL プログラムである場合は、レコードで transfer to transaction を使用する。 | 移動元のプログラムは、端末に関連付けられたメッセージ・キューにフォームを書き込む必要がある。 EGL プログラムである場合は、フォームおよびオプションのレコードで show ステートメントを使用する。 |
| 入力フォームの使用 | ターゲット・プログラムはオプションで入力フォームを取得できる。 | ターゲット・プログラムには入力フォームが必要。 |
| レコードの受け渡し。 | レコードはメッセージに転送される。 | レコードがある場合、レコードは作業データベースに転送される。 |
EGL プログラムを開発する場合、ビルド記述子オプション spaSize が 0 (非会話型) に設定されることを除き、この手法はセグメント化会話型の EGL プログラムと同じです。 この手法では、2 つの非会話型の EGL プログラムが、フォームをプログラム・ユーザーに提示することなく、トランザクション名と PSB 名の両方を交換できます。 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 生成のプログラム制御ロジックでは、制御権の移動に使用される IMS メッセージ、およびプログラム A から B に渡されるレコードが自動的に処理されます。
非 EGL プログラムは、IMS 非会話型プログラムでなければなりません。 EGL プログラムは、非会話型の「2 つの EGL プログラム間の即時交換」のプログラム B と同様に定義する必要があります。
非 EGL プログラムでは、代替 PCB にメッセージを挿入する必要があります。 宛先は、EGL プログラムのトランザクション名に設定する必要があります。 非 EGL プログラムでは、メッセージにヘッダー情報 (長さ、ZZ、およびトランザクション名) を提供する必要があります。 必要なメッセージのレイアウトについては、『IMS 非会話型メッセージ交換の EGL 入力メッセージのフォーマット』を参照してください。EGL 生成のプログラム制御ロジックではヘッダー情報を自動的に削除するため、EGL プログラムはデータのみを受け取ります。
非 EGL プログラムは、IMS 非会話型プログラムでなければなりません。 EGL プログラムは、非会話型の「2 つの EGL プログラム間の即時交換」のプログラム A と同様に定義する必要があります。
非 EGL プログラムでは、入出力 PCB に get unique を発行し、EGL プログラムが transfer to transaction ステートメントで渡したレコードを取得する必要があります。 必要なメッセージのレイアウトについては、『IMS 非会話型メッセージ交換の EGL 入力メッセージのフォーマット』を参照してください。EGL 生成のプログラム制御ロジックはヘッダー情報 (長さ、ZZ、トランザクション名) を自動的に提供するため、EGL プログラムではデータのみを定義します。 ただし、非 EGL プログラムは、ヘッダー情報を受け入れるように準備する必要があります。
EGL 開発者の視点から見ると、ビルド記述子オプション spaSize が非会話型プログラムを示す 0 に設定されることを除き、この手法はセグメント化会話型の EGL プログラムでの移動と同じです。 この手法では、フォームがプログラム・ユーザーに提示される場合、2 つの非会話型の EGL プログラムがトランザクション名と PSB 名の両方を交換できます。 両方のプログラムで同じ formGroup を使用する必要があります。 レコードを転送する必要はありませんが、フォームは必須です。
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 プログラムは、IMS 非会話型プログラムでなければなりません。 EGL プログラムは、非会話型の「2 つの EGL プログラム間の据え置き交換」のプログラム B と同様に定義する必要があります。
非 EGL プログラムは、IMS 非会話型プログラムでなければなりません。 EGL プログラムは、非会話型の「2 つの EGL プログラム間の据え置き交換」のプログラム A と同様に定義する必要があります。 EGL プログラムでは、非 EGL プログラムの入力として必要なフォームのすべての変数データ・フィールドの modified プロパティーを YES に設定する必要があります。
EGL プログラムは、IMS メッセージ・キューに関連付けられたシリアル・ファイルのレコードに対して add ステートメントまたは get next ステートメントを実行することにより、非 EGL プログラムと通信できます。
MPP またはトランザクション駆動型バッチ・メッセージ処理プログラム (BMP) のいずれかとして実行される EGL 基本プログラムでは、ファイルを使用して get next ステートメントでメッセージを読み取ります。 EGL プログラムでは、メッセージからヘッダー情報を自動的にストリップし、そのデータをシリアル・レコードに格納します。
非 EGL プログラムでは、MPP またはトランザクション駆動型 BMP のいずれかとして実行される EGL 基本プログラムが後で処理できるように、IMS メッセージ・キューに一連のレコードを書き込むことができます。 非 EGL プログラムは、レコードを処理するトランザクションに関連付けられた代替入出力 PCB に対して、以下に表に示されたフォーマットでレコードを挿入する必要があります。
| フィールド | 長さ (バイト) | データのタイプ | 説明 |
|---|---|---|---|
| セグメント長 | 2 | 2 進数 | セグメントの長さ。 |
| 予約済み (ZZ) | 2 | 2 進数 | 予約済み。 |
| IMS トランザクション名 | 8 | 文字 | EGL プログラムの IMS トランザクション名。 |
| プログラム定義のフィールド | 可変長 | 可変長 | この領域には、EGL シリアル・レコードに定義されたデータ項目が格納されます。 |
EGL 基本プログラムは、get next を使用して入出力 PCB に関連付けられたシリアル・ファイルを読み取り、メッセージを処理します。 EGL プログラムでは IMS メッセージ・ヘッダー (セグメント長、ZZ、およびトランザクション名) を自動的に除去するため、プログラムはシリアル・レコード内のメッセージ・データのみを受け取ります。
EGL プログラムがメッセージ・キューに関連付けられたシリアル・ファイルに対して add を実行する場合、 EGL プログラムではレコード・データの前に IMS メッセージ・ヘッダーを自動的に追加し、そのメッセージを代替 PCB に挿入します。 EGL プログラムは、メッセージ内の実際のデータにのみ関与します。
MPP またはトランザクション駆動型 BMP のいずれかとして実行される非 EGL プログラムでは、メッセージ・キューを処理できます。 メッセージ・キューに実際に挿入され、非 EGL プログラムによって受け取られるメッセージのフォーマットは、上記のセクション『非 EGL プログラムから EGL プログラム』の表に示されています。