IMS プログラム・コードの例

これら EGL プログラムからの抜粋は、IMS™ 端末、メッセージ・キュー・およびシリアル・ファイルとの相互作用を示します。

メッセージ・キュー I/O の例

これは、メッセージ・キューにアクセスする EGL プログラムからのコードの抜粋です。 プログラムは、以下のタスクを実行します。
  1. 書式を使用する端末からの入力を要求する
  2. 応答を読み取る
  3. シリアル・レコードをユーザー入力を基にした情報に更新する
  4. 後でバッチ処理を行なうために他のトランザクションにシリアル・レコードを出力する。
プログラムは、IMS 環境に以下の関連があることを前提としています。
  • IMS トランザクション・コード MYTRXCD1 が、MYTRXCD1 という名前の付いた PSB に関連付けられている
  • IMS トランザクション・コード NEXTTRX が MYTRXCD2 という名前の付いた PSB に関連付けられている
//PSB の定義
レコード addToQueue タイプ PSBRecord { defaultPSBName="MYTRXCD1" }
	// IMS の CBLTDLI を必要とする 3 つの PCB
	iopcb IO_PCBRecord { @PCB { pcbType = TP } };
	elaalt ALT_PCBRecord { @PCB { pcbType = TP } };
	elaexp ALT_PCBRecord { @PCB { pcbType = TP } };
	// 他のデータベース PCB
	...
end


レコード myTransactionPart タイプ serialRecord
	{ fileName=”MYMSGQUE” }
	...
end

program addtrans type textUIProgram
	{ alias = “MYTRXCD1”,           // IMS は、pgm が PSB 名と一致することを必要とします
		segmented = yes,
		@DLI { psb = “mypsb” }}

use MYFORMS;  // MYFORMS は、FORM1 を含む formGroup です

// 変数の宣言
myTransaction myTransactionPart;  // メッセージ・キューのシリアル・レコード
mypsb addToQueue;                 // psb

	function main()
		converse FORM1;  
		// 処理が必要なことをすべて実行
		move FORM1 to myTransaction byName;
		add myTransaction;
	end
end
生成するときに、シリアル・ファイルをメッセージ・キューに関連付けるリソース関連パーツを指定しなければなりません。これにより送信先のトランザクションの名前が、使用する PCB の名前とともに提供されます。以下の例を検討してください。これには、後で説明されるバッチ・プログラムによるメッセージ・キュー・データの入力を可能にする関連要素も含まれています。
<ResourceAssociations name="RESOURCEASSOC601_REORDER">
   <association fileName="MYMSGQUE">
      <imsvs>
         <smsgq systemName=”NEXTTRX" pcbName="elaalt"/>
      </imsvs>
   </association>   
   <association fileName="MYINQUE">
      <imsvs>
         <smsgq systemName=”NEXTTRX" pcbName="iopcb"/>
      </imsvs>
   </association>
</ResourceAssociations>

addtrans は、textUI プログラムであるため、EGL によって、IMS 環境下で正常に機能し、キューが空になるまでメッセージ・キューを読み取るようにされます。 これは、EGL がループをプログラムにビルドして、プログラムが後のバッチ処理のためにトランザクションをシリアル・ファイルに配置することを完了すると、converse 文に戻って、もう 1 つのトランザクションを端末に要求するようになることを意味します。

IMS バッチ処理の例

プログラムを作成して、プログラム addtrans がメッセージ・キューに書き込むメッセージを処理することもできます。プログラムは、シリアル・ファイルからレコードを取得して、そのシリアル・ファイルを I/O PCB に関連付ける基本プログラムでなければなりません。

プログラムは、addtrans が使用するのと同じシリアル・レコードを使用することができますが、別の PCB 名が必要なため、新規のファイル名を使用します。以下の例では、キーの変更点が太字で示されています。
//PSB の定義
レコード getFromQueue タイプ PSBRecord { defaultPSBName="MYTRXCD2" }
	// IMS の CBLTDLI を必要とする 3 つの PCB
	iopcb IO_PCBRecord { @PCB { pcbType = TP } };
	elaalt ALT_PCBRecord { @PCB { pcbType = TP } };
	elaexp ALT_PCBRecord { @PCB { pcbType = TP } };
   // 他のデータベース PCB
end

プログラム gettrans タイプ basicProgram
  { alias = “MYTRXCD2”
    @DLI { psb = “mypsb” }}

// 変数の宣言
myTransaction myTransactionPart             // メッセージ・キューのシリアル・レコード
  {fileName="MYINQUE"};  
mypsb getFromQueue;               // psb

	function main()
     while (myTransaction not endOfFile)
		get next myTransaction;
      // 必要な処理をすべて実行
     end
	end
end

IMS/VS または IMS BMP 環境でプログラムを生成するときは、シリアル・ファイルをメッセージ・キューに関連付けるリソース関連パーツを指定しなければなりません。これにより送信先のトランザクションの名前が、使用する PCB の名前とともに提供されます。 この場合、前のセクションの ResourceAssociations パーツで示されているように、I/O PCB が入力に使用されます。

複数ユーザーおよびメッセージ・キュー

リソースについて競合中の複数ユーザーがあると、IMS の状態は、より複雑になります。 USER1 および USER2 の両方が、端末上で同時に MYTRXCD1 を入力すると想定します。 USER1 のトランザクション・コードが先に MYTRXCD1 に関連付けられたメッセージ・キューに入ると想定します。
  1. IMS は、トランザクション・コード MYTRXCD1 に関連付けられた PSB をスケジュールに入れます。その PSB も偶然 MYTRXCD1 という名前になっていることがありますが、そうでなければならないわけではありません。しかし、PSB に関連付けられたプログラムは、IMS 内の PSB と同じ名前でなければなりません。 その結果、IMS は、プログラム MYTRXCD1 (EGL には addtrans として認識されています) をロードします。
  2. プログラム MYTRXCD1 の中の EGL 生成の制御ロジックは、これが USER1 のために呼び出された最初のプログラムであることを判別し、これを先頭に処理が開始されます。
  3. 最終的に、プログラムは converse 文に到達し、以下のアクションを実行します。
    • プログラムが使用しているすべてのレコードおよび書式のデータを保管する。
    • converse 文が発生したプログラム中の場所についての情報を保管する。
    • 指定された書式で ISRT コマンドを実行する。
  4. EGL が追加した論理に従って、プログラムは最初にループバックし、メッセージ・キューで待機している USER2 を見付けます。プログラムは、USER1 に対して行なったのと同じステップを USER2 で進めます。converse 文に到達し、書式を送信してから、再びメッセージ・キューを検査します。
  5. ここで、おそらくプログラムは、USER1 からの converse 文への応答を見付けます。 EGL 生成制御ロジックは、この応答が USER1 の処理の続きであることを判別して、以下を行ないます。
    • USER1 のデータ (converse 文の場所を含む) を復元する
    • システム変数の数を更新する
    • FORM1 が要求した検証チェックを実行する
    • 入力エラーがないことを前提として、converse 文の後の文の処理を再開する
  6. やがてプログラムは、別の converse 文に到達し、すべてのデータを保管して USER1 に応答を送信します。 その後、プログラムはループバックして、再びメッセージ・キューをチェックします。
  7. USER2 は昼食に出かけ、トランザクション・コード MYTRXCD1 に関連付けられたメッセージ・キューには何も残っていないと想定します。IMS は、プログラム MYTRXCD1 をシャットダウンします。
  8. 後で、USER1 が最近のコンソール・メッセージに応答した場合、IMS は、再びトランザクション・コード MYTRXCD1 に関連付けられたキューにメッセージを持ち、プログラム MYTRXCD1 を開始します。EGL 生成制御ロジックは、この応答が USER1 の処理の続きであることを判別し、すべてのデータを復元して処理を継続します。
フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.