OUTQにスプールが入ったタイミングで後処理を流すCLP
AS/400ではこのような場合に、OUTQに投入されたスプールの情報をデータ待ち行列で取得することが出来ます。
■データ待ち行列オブジェクトについて
まず「データ待ち行列」についてですが、AS/400では待ち行列OBJはいくつかあります。
・OUTQ
・JOBQ
・MSGQ
・DTAQ など
データ待ち行列は文字どおりデータPGM間で処理するためのOBJです。
データ待ち行列は、QSNDDTAQというAPIでデータの送信を行い、QRCVDTAQで受信を行います。
「CLプログラミング」のマニュアルの「プログラムとプロシージャー間の通信のためのデータ待ち行列の使用法」に詳しい解説があります。
それぞれのパラメータは以下のとおりです。
データ待ち行列の受信(QRCVDTAQ)パラメータ
| 1 | 10BYTE-文字(I) | データ待ち行列名 |
| 2 | 10BYTE-文字(I) | データ待ち行列ライブラリー |
| 3 | 5BYTE-パック数字(O) | 受信レコード長 |
| 4 | 文字(O) | 受信文字列 |
| 5 | 5BYTE-パック数字(I) | 待機時間(マイナスはタイムアウトなしで永遠に待機) |
| ★以降は任意★ | ||
| 6 | 2BYTE-文字(I) | キー付DTAQの時の比較式(GT/LT/EQ/NE/GE/LE) |
| 7 | 3BYTE-パック数字(I) | キーフィールド長 |
| 8 | 文字(I) | キーデータ |
| 9 | 3BYTE-パック数字(O) | 送信元情報ID(?) |
| 10 | 文字(O) | 送信元情報(?) |
データ待ち行列への送信(QSNDDTAQ)パラメータ
| 1 | 10BYTE-文字(I) | データ待ち行列名 |
| 2 | 10BYTE-文字(I) | データ待ち行列ライブラリー |
| 3 | 5BYTE-パック数字(O) | 受信レコード長 |
| 4 | 文字(O) | 受信文字列 |
| ★以降は任意★ | ||
| 5 | 3BYTE-パック数字(I) | キーフィールド長 |
| 6 | 文字(I) | キーデータ |
データ待ち行列の作成
以下はDTAQという名前でキーなしのデータ待ち行列とKEYDTAQというキー付データ待ち行列を作成した例です。
| > CRTDTAQ DTAQ(XYZLIB/DATQ) MAXLEN(256) AUTORCL(*YES) オブジェクト DATQ タイプ *DTAQ がライブラリー XYZLIB に作成された。 > CRTDTAQ DTAQ(XYZLIB/KEYDTAQ) MAXLEN(256) SEQ(*KEYED) KEYLEN(10) AUTORCL(*YES) オブジェクト KEYDATQ タイプ *DTAQ がライブラリー XYZLIB に作成された。 |
■OUTQにスプールが投入されたときにデータ待ち行列からデータを取得する
それでは本題です。
OUTQは属性にDTAQを持っていて紐付けすることができます。
このような設定を行ったOUTQはスプールが投入された際に事前に紐付けられたデータ待ち行列に決められたフォーマットでデータが送信されます。このデー タをユーザーPGMにて読み込み処理を行うことで、スプールをリアルに近い形での処理を行うことができます。
1)前準備1=データ待ち行列の作成
ここではまずキーなしのデータ待ち行列を作成します。
| > CRTDTAQ DTAQ(XYZLIB/DATQ) MAXLEN(128) AUTORCL(*YES) オブジェクト DATQ タイプ *DTAQ がライブラリー XYZLIB に作成された。 |
2)前準備2=OUTQの変更
ここでは、OUTQの属性で紐付するデータ待ち行列を指定します。
| > CHGOUTQ OUTQ(XYZLIB/TESTQ) DTAQ(XYZLIB/DTAQ) |
3)前準備3=データ受信PGM作成。
サンプルPGMを参照ください。
作成後、このPGMをSBMJOBし動作させることによりスプールのキー情報を基にスプール一つ一つの処理を行うことが出来ます。
データ待ち行列で受信されるデータフォーマットは以下のとおり
| 1 | 13〜22(文字) | JOB名 |
| 2 | 23〜32(文字) | ユーザー名 |
| 3 | 33〜38(文字) | JOB番号 |
| 4 | 39〜48(文字) | スプールファイル名 |
| 5 | 49〜52(BIN) | スプール番号 |
| 6 | 53〜62(文字) | OUTQ名 |
| 7 | 63〜72(文字) | OUTQライブラリー |
| 8 | 73〜80(文字) | 作成システム |
| 9 | 81〜128 | 予備 |
サンプルではデータ待ち行列からデータを受信した後の処理は行っていませんので、皆さんで必要な処理を組み込んでお使いください。