API には
の 2 種類の結果の戻し方がある。
ここでは最初に結果の値を直接、受け取る API として QUSROBJD : オブジェクトの属性の検索を紹介しよう。
QUSROBJD は API の中でもかなり使用頻度が高い API であり、CLP 開発者が最初に使う API かも
知れないと思うほどポピュラーな API である。
QUSROBJD は DSPOBJD コマンドとほぼ同じ情報を提供する。
もちろん API であるので DSPOBJD より詳しい情報を高速で得ることができる。
今回のサンプルはライブラリー SPOOLWTR の 最終変更日 と 時刻 を QUSROBJD によって
取得するというものである。
必須パラメータ・グループ:
| 1. | レシーバー変数 | 出力 | Char(*) |
| 2. | レシーバー変数長 | 入力 | Binary(4) |
| 3. | 形式名 | 入力 | Binary(4) |
| 4. | オブジェクト修飾名 | 入力 | Char(10)の配列(*) |
| 5. | オブジェクト・タイプ | 入出力 | Char(*) |
任意選択パラメータ:
| 6. | エラー・コード | 入出力 | Char(*) |
レシーバー変数 と レシーバー変数長 は形式名によって異なる。
形式名 は、
OBJD0100 形式 | ・・・・・・ | 基本情報(最高速) |
OBJD0200 形式 | ・・・・・・ | PDM によって表示される情報に良く似た情報 |
OBJD0300 形式 | ・・・・・・ | 保守情報 |
OBJD0400 形式 | ・・・・・・ | 全情報(最低速) |
[参照メンバー] QSYSINC/H(QUSROBJD)
■ OBJD0100 形式
| オフセット | タイプ | フィールド | |
|---|---|---|---|
| 10進数 | 16進数 | ||
0 | 0 | BINARY(4) | 返されるバイト数 |
4 | 4 | BINARY(4) | 使用可能なバイト数 |
8 | 8 | CHAR(10) | オブジェクト名 |
18 | 12 | CHAR(10) | オブジェクト・ライブラリー名 |
28 | 1C | CHAR(10) | オブジェクト・タイプ |
38 | 26 | CHAR(10) | 戻りライブラリー |
48 | 30 | BINARY(4) | 補助記憶域プール |
52 | 34 | CHAR(10) | オブジェクト所有者 |
62 | 3E | CHAR(2) | オブドェクト・ドメイン |
64 | 40 | CHAR(13) | 作成日時 |
77 | 40 | CHAR(13) | オブジェクト変更日時 |
■ OBJD0200 形式
| オフセット | タイプ | フィールド | |
|---|---|---|---|
| 10進数 | 16進数 | ||
0 | 0 | OBJD0100 形式からのすべての情報 | |
90 | 5A | CHAR(10) | オブジェクトの拡張属性 |
100 | 64 | CHAR(50) | テキスト記述 |
150 | 96 | CHAR(10) | ソース・ファイル名 |
160 | A0 | CHAR(10) | ソース・ファイル・ライブラリー名 |
170 | AA | CHAR(10) | ソース・ファイル・メンバー名 |
■ OBJD0300 形式
| オフセット | タイプ | フィールド | |
|---|---|---|---|
| 10進数 | 16進数 | ||
0 | 0 | OBJD0200 形式からのすべての情報 | |
180 | B4 | CHAR(13) | ソース・ファイルの更新日時 |
193 | C1 | CHAR(13) | オブジェクト保管日時 |
206 | CE | CHAR(13) | オブジェクト復元日時 |
219 | DB | CHAR(10) | 作成者のユーザー・プロフィール |
229 | E5 | CHAR(8) | オブジェクトが作成されたシステム |
237 | ED | CHAR(7) | リセット日付 |
244 | F4 | BINARY(4) | 保管サイズ |
248 | F8 | BINARY(4) | 保管順序番号 |
252 | FC | CHAR(10) | 記憶域 |
262 | 106 | CHAR(10) | 保管コマンド |
272 | 110 | CHAR(71) | 保管ボリュームID |
343 | 157 | CHAR(10) | 保管装置 |
353 | 161 | CHAR(10) | 保管ファイル名 |
363 | 16B | CHAR(10) | 保管ファイル・ライブラリー名 |
373 | 175 | CHAR(17) | 保管ラベル |
390 | 186 | CHAR(9) | システム・レベル |
399 | 18F | CHAR(16) | コンパイラー |
415 | 19F | CHAR(8) | オブジェクト・レベル |
423 | 1A7 | CHAR(1) | ユーザーの変更 |
424 | 1A8 | CHAR(16) | ライセンス・プログラム |
440 | 1B8 | CHAR(10) | プログラム一時修正(PTF) |
450 | 1C2 | CHAR(10) | プログラム診断依頼書(APAR) |
■ OBJD0400 形式
| オフセット | タイプ | フィールド | |
|---|---|---|---|
| 10進数 | 16進数 | ||
0 | 0 | OBJD0300 形式からのすべての情報 | |
460 | 1CC | CHAR(7) | 最終使用日付 |
467 | 1D3 | CHAR(1) | 使用状況の更新 |
468 | 1D4 | BINARY(4) | 使用日数カウント |
472 | 1D8 | BINARY(4) | オブジェクト・サイズ |
476 | 1DC | BINARY(4) | オブジェクト・サイズの乗数 |
480 | 1E0 | CHAR(1) | オブジェクト圧縮状況 |
481 | 1E1 | CHAR(1) | プログラムによる変更許可< |
482 | 1E2 | CHAR(1) | プログラムによる変更 |
483 | 1E3 | CHAR(10) | ユーザー定義属性 |
493 | 1ED | CHAR(1) | オブジェクト ASP オーバーフロー標識 |
494 | 1EE | CHAR(13) | SAVACT 保管日時 |
507 | 1FB | CHAR(10) | オブジェクト監査値 |
517 | 205 | CHAR(10) | 1次グループ |
001.00 H DATEDIT(*YMD/)
002.00 F********** ライブラリーの更新日付時刻の検索 *************************
003.00 F* QUSROBJD のサンプル
004.00 F**********************************************************************
005.00 /COPY QSYSINC/QRPGLESRC,QUSROBJD
006.00 D OBJOBJLIB S 20A INZ('SPOOLWTR *LIBL ')
007.00 D CPFMSG C CONST('QCPFMSG *LIBL ')
008.00 D RCVLEN S 4B 0 INZ(%SIZE(QUSD0100))
009.00
010.00 D APIERR DS
011.00 D GETBYT 1 4B 0 INZ(160)
012.00 D AVLBYT 5 8B 0 INZ(0)
013.00 D MSGID 9 15
014.00 D MSGDTA 17 160
015.00
016.00 D SPCBIN DS
017.00 D MSGDTALEN 4B 0 INZ(100) 小数
018.00 D PGMSTKCNT 4B 0 INZ(1) 小数
019.00 D DATE 6A 小数
020.00 D TIME 6A 小数
021.00
022.00 C*----------------------------------------------------+
023.00 C CALL QUSROBJD
0024.00 C PARM QUSD0100
0025.00 C PARM RCVLEN
0026.00 C PARM 'OBJD0100' FOTMAT 8
0027.00 C PARM OBJOBJLIB
0028.00 C PARM '*LIB ' OBJTYPE 10
0029.00 C PARM APIERR
0030.00 C*----------------------------------------------------+
0031.00 C AVLBYT IFEQ *ZEROS
0032.00 C EVAL DATE = %SUBST(QUSCDT11:2:6)
0033.00 C 'DATE=20' CAT(P) DATE:0 DSP40 40
0034.00 C DSP40 DSPLY ANS 1
0035.00 C EVAL TIME = %SUBST(QUSCDT11:8:6)
0036.00 C 'TIME=' CAT(P) TIME:0 DSP40 40
0037.00 C DSP40 DSPLY ANS 1
0038.00 C ELSE
0039.00 C MOVEL CPFMSG MSGFILLIB
0040.00 C*----------------------------------------------------+
0041.00 C CALL 'QMHSNDPM' 99
0042.00 C PARM MSGID
0043.00 C PARM MSGFILLIB 20
0044.00 C PARM MSGDTA
0045.00 C PARM MSGDTALEN
0046.00 C PARM '*COMP ' MSGTYPE 10
0047.00 C PARM '*PGMBDY ' PGMQUE 10
048.00 C PARM PGMSTKCNT
049.00 C PARM MSGKEY 4
050.00 C PARM APIERR
051.00 C*----------------------------------------------------+
052.00 C END
053.00 C MOVE *ON *INLR
054.00 C RETURN
このサンプルRPGはサンプルとは言ってもエラー処理は相当、念入りにバッチや対話式で
行なわれた場合も含めて考慮されている。
RPG で API を利用するときのミソは
005.00 /COPY QSYSINC/QRPGLESRC,QUSROBJD
のようにして i5/OS で提供されているメンバー QSYSINC/QRPGLESRC(QUSROBJD) を参照して
利用することである。
このメンバーには戻り値の型が DS (データ・ストラクチャー) で定義されているので、
自分で定義しなくても便利である。
ただし API は OS のリリース・アップに従って予告なく拡張されるので
そのままでは上位の OS に移行したときに戻り値の長さが不足してエラーで
停止してしまう場合がある。
賢いAPI は戻り値の長さを見てその長さの分だけ戻すのもあるが、多くは実行時の
エラーとなってしまうので RPG を使用しているプログラムであっても上位互換は必ずしも
保証されず、再コンパイルが必要となる場合もあるので API を使っている高度な
プログラムの移行には注意が必要である。
さて、API : QUSROBJD は
0005.00 /COPY QSYSINC/QRPGLESRC,QUSROBJD
0006.00 D OBJOBJLIB S 20A INZ('SPOOLWTR *LIBL ')
0007.00 D CPFMSG C CONST('QCPFMSG *LIBL ')
0008.00 D RCVLEN S 4B 0 INZ(%SIZE(QUSD0100))
:
0022.00 C*----------------------------------------------------+
0023.00 C CALL QUSROBJD
0024.00 C PARM QUSD0100
0025.00 C PARM RCVLEN
0026.00 C PARM 'OBJD0100' FOTMAT 8
0027.00 C PARM OBJOBJLIB
0028.00 C PARM '*LIB ' OBJTYPE 10
0029.00 C PARM APIERR
0030.00 C*----------------------------------------------------+
として実行されていて、ライブラリー SPOOLWTR の変更日付と時刻を調べようとしている。
API の結果の値を受け取るレシーバー変数 &RCVVAR は 90 バイトで十分であるが
将来、API が拡張されることに準備して 256 バイトと余裕を持った長さで定義されており
レシーバー変数の長さ: RCVLEN も
0008.00 D RCVLEN S 4B 0 INZ(%SIZE(QUSD0100))
として 160 バイトで定義しておく必要がある。
0031.00 C AVLBYT IFEQ *ZEROS
:
0038.00 C ELSE
0039.00 C MOVEL CPFMSG MSGFILLIB
0040.00 C*----------------------------------------------------+
0041.00 C CALL 'QMHSNDPM' 99
0042.00 C PARM MSGID
0043.00 C PARM MSGFILLIB 20
0044.00 C PARM MSGDTA
0045.00 C PARM MSGDTALEN
0046.00 C PARM '*COMP ' MSGTYPE 10
0047.00 C PARM '*PGMBDY ' PGMQUE 10
0048.00 C PARM PGMSTKCNT
0049.00 C PARM MSGKEY 4
0050.00 C PARM APIERR
0051.00 C*----------------------------------------------------+
0052.00 C END
のように API : QUSROBJD の実行でエラーがあった場合は QCPFMSG の MSGID と MSGDTA を
0010.00 D APIERR DS 0011.00 D GETBYT 1 4B 0 INZ(160) 0012.00 D AVLBYT 5 8B 0 INZ(0) 0013.00 D MSGID 9 15 0014.00 D MSGDTA 17 160
のようにして取得してエラー・メッセージを表示することができる。
首尾よく &RCVMSG を受け取ることができたら
0032.00 C EVAL DATE = %SUBST(QUSCDT11:2:6) 0033.00 C 'DATE=20' CAT(P) DATE:0 DSP40 40 0034.00 C DSP40 DSPLY ANS 1 0035.00 C EVAL TIME = %SUBST(QUSCDT11:8:6) 0036.00 C 'TIME=' CAT(P) TIME:0 DSP40 40 0037.00 C DSP40 DSPLY ANS 1
のようにして変更日付と時刻を検索することができる。