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
のようにして変更日付と時刻を検索することができる。