API には
- 結果の値を直接、受け取る
- 結果をユーザー・スペースに書き込む
の 2 種類の結果の戻し方がある。
ここでは最初に結果の値を直接、受け取る API として QUSROBJD
: オブジェクトの属性の検索を紹介しよう。
QUSROBJD
は API の中でもかなり使用頻度が高い API であり、CLP 開発者が最初に使う API かも
知れないと思うほどポピュラーな API である。
QUSROBJD
は DSPOBJD
コマンドとほぼ同じ情報を提供する。
もちろん API であるので DSPOBJD
より詳しい情報を高速で得ることができる。
今回のサンプルはライブラリー SPOOLWTR
の 最終変更日 と 時刻 を QUSROBJD
によって
取得するというものである。
オブジェクト記述の検索(QUSROBJD)API
必須パラメータ・グループ:
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
のようにして変更日付と時刻を検索することができる。