RPG

193. API : QUSROBJD : オブジェクトの属性の検索

API には

の 2 種類の結果の戻し方がある。
ここでは最初に結果の値を直接、受け取る API として QUSROBJD : オブジェクトの属性の検索を紹介しよう。

QUSROBJD は API の中でもかなり使用頻度が高い API であり、CLP 開発者が最初に使う API かも
知れないと思うほどポピュラーな API である。
QUSROBJDDSPOBJD コマンドとほぼ同じ情報を提供する。
もちろん 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進数
00BINARY(4)返されるバイト数
44BINARY(4)使用可能なバイト数
88CHAR(10)オブジェクト名
1812CHAR(10)オブジェクト・ライブラリー名    
281CCHAR(10)オブジェクト・タイプ
3826CHAR(10)戻りライブラリー
4830BINARY(4)補助記憶域プール
5234CHAR(10)オブジェクト所有者
623ECHAR(2)オブドェクト・ドメイン
6440CHAR(13)作成日時
7740CHAR(13)オブジェクト変更日時

OBJD0200 形式

オフセットタイプフィールド
10進数16進数
00OBJD0100 形式からのすべての情報
905ACHAR(10)オブジェクトの拡張属性
10064CHAR(50)テキスト記述
15096CHAR(10)ソース・ファイル名
160A0CHAR(10)ソース・ファイル・ライブラリー名
170AACHAR(10)ソース・ファイル・メンバー名

OBJD0300 形式

オフセットタイプフィールド
10進数16進数
00OBJD0200 形式からのすべての情報
180B4CHAR(13)ソース・ファイルの更新日時
193C1CHAR(13)オブジェクト保管日時
206CECHAR(13)オブジェクト復元日時
219DBCHAR(10)作成者のユーザー・プロフィール
229E5CHAR(8)オブジェクトが作成されたシステム
237EDCHAR(7)リセット日付
244F4BINARY(4)保管サイズ
248F8BINARY(4)保管順序番号
252FCCHAR(10)記憶域
262106CHAR(10)保管コマンド
272110CHAR(71)保管ボリュームID
343157CHAR(10)保管装置
353161CHAR(10)保管ファイル名
36316BCHAR(10)保管ファイル・ライブラリー名
373175CHAR(17)保管ラベル
390186CHAR(9)システム・レベル
39918FCHAR(16)コンパイラー
41519FCHAR(8)オブジェクト・レベル
4231A7CHAR(1)ユーザーの変更
4241A8CHAR(16)ライセンス・プログラム
4401B8CHAR(10)プログラム一時修正(PTF)
4501C2CHAR(10)プログラム診断依頼書(APAR)

OBJD0400 形式

オフセットタイプフィールド
10進数16進数
00OBJD0300 形式からのすべての情報
4601CCCHAR(7)最終使用日付
4671D3CHAR(1)使用状況の更新
4681D4BINARY(4)使用日数カウント
4721D8BINARY(4)オブジェクト・サイズ
4761DCBINARY(4)オブジェクト・サイズの乗数
4801E0CHAR(1)オブジェクト圧縮状況
4811E1CHAR(1)プログラムによる変更許可<
4821E2CHAR(1)プログラムによる変更
4831E3CHAR(10)ユーザー定義属性
4931EDCHAR(1)オブジェクト ASP オーバーフロー標識  
4941EECHAR(13)SAVACT 保管日時
5071FBCHAR(10)オブジェクト監査値
517205CHAR(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 の実行でエラーがあった場合は QCPFMSGMSGIDMSGDTA

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                  

のようにして変更日付と時刻を検索することができる。