RPG

194. API : QUSLOBJ : オブジェクトのリスト

QUSLOBJ も使用頻度の高い API であり、オブジェクトの一覧をユーザー・スペースに
出力して、それを検索して解析したり別の一覧表に出力するような目的のために使用される。
API の結果の出力方法は QUSROBJD で紹介したレシーバー変数に出力する場合と
結果の項目が複数個ある場合は、この QUSLOBJ のようにユーザー・スペースに
出力する方法に分かれる。

QUSLOBJ : オブジェクトのリスト

パラメータ

必須パラメータ・グループ:

1.ユーザー・スペース修飾名入力Char(20)
2.形式名入力Char(8)
3.オブジェクト修飾名入力Binary(4)
4.オブジェクト・タイプ入力Char(10)の配列(*)

任意選択パラメータ:

5.エラー・コード入出力Char(*)

任意選択パラメータ:

6.権限制御入力Char(*)
7.選択制御入力Char(*)

【解説】

結果の内容を受け取るためのユーザー・スペース ( *USRSPC ) は QUSLOBJ を実行する前には
予め作成して準備しておかなければならない。
後で示すサンプル・ソースには、この作業も含めてある。

形式名 は、

OBJL0100 形式・・・・・・オブジェクト名(最高速)
OBJL0200 形式・・・・・・テキスト記述および拡張属性
OBJL0300 形式・・・・・・基本オブジェクト情報
OBJL0400 形式・・・・・・作成情報
OBJL0500 形式・・・・・・保管および復元情報
OBJL0600 形式・・・・・・使用状況情報
OBJL0700 形式・・・・・・すべてのオブジェクト情報(最低速)

形式によって受け取る情報の詳細は後述する。

オブジェクト修飾名( オブジェクト名 ) + ( ライブラリー名 ) であるが、次の特殊値を
指定することができる。

*ALL・・・・・・すべてのライブラリー
*ALLUSR・・・・・・すべてのユーザー・ライブラリー
( ユーザー・ライブラリーとは 名前が Q で始まっていないライブラリーであり、
#CGULIB, #RPGLIB, #COBLIB, #SDALIB, #DFULIB, #SEULIB, #DSULIB を除く。)
*CURLIB・・・・・・ジョブの現行ライブラリー
*LIBL・・・・・・ライブラリー・リスト
*USRLIBL・・・・・・ジョブのライブラリー・リストのユーザー部分だけ

オブジェクト・タイプ は、特定のオブジェクト・タイプ または *ALL を指定する。
権限制御選択制御 はあまり指定することがないので必要があれば IBM API 解説書を参照のこと。
最初にユーザー・スペースを作成するために ユーザー・スペースの作成 API である QUSCRTUS を紹介する。

QUSCRTUS : ユーザー・スペースの作成 API

パラメータ

必須パラメータ・グループ:

1.ユーザー・スペース修飾名入力Char(20)
2.拡張属性入力Char(10)
3.初期サイズ入力Binary(4)
4.初期値入力Char(1)
5.共通権限入力Char(10)
6.テキスト記述入力Char(20)

任意選択パラメータ:

7.置換入力Char(10)
8.エラー・コード入出力Char(*)
【解説】

ユーザー・スペース修飾名 は例えば、「 USRSPC   QTEMP     」 などのように任意の名前をつけて
QTEMP に作成することが多い。
拡張属性 は、ユーザー・スペースの拡張属性であり使用するユーザーが識別できるものでよい。
例えば、PF, LF, DSPF または SAVF などでよい。
初期サイズは最初にユーザー・スペースを作成するサイズ ( バイト数 ) であるが 1000 バイトあたりに
定義しておけば不測の場合は自動的に OS によって拡張される。
初期値 は最初にユーザー・スペースに埋め込む 1 バイトの Char である。NULL かまたはブランクでよい。
共通権限AUT であるので通常は *ALL として作成しておけばよい。
テキスト記述 は文字通りこのユーザー・スペースのテキストである。
置換 は任意選択とはなっているが必須であろう。
*YES として指定しておけば QUSCRTUS は、作成するユーザー・スペースが存在していても
エラーを発生することなく上書きで作成してくれる便利な機能である。
従って置換には必ず *YES を指定して作成することが肝要である。
QUSCRTUS の実行例は次のとおりである。

D APIERR          DS                                                                     
D  GETBYT                 1      4B 0 INZ(160)                                           
D  AVLBYT                 5      8B 0 INZ(0)                                             
D  MSGID                  9     15                                                       
D  MSGDTA                17    160                                                       
                                                                                         
D USRSPC          DS                                                                     
D  USNAME                       10A   INZ('QUSLOBJ   ')                                  
D  USLIB                        10A   INZ('QTEMP     ')                                  
     :                                                                                   
     ;                                                                                   
C*(1) QUSCRTUS: ユーザー・スペースの作成                                                 
C*----------------------------------------------------+                                  
C                   CALL      'QUSCRTUS'                                                 
C                   PARM                    USRSPC                                       
C                   PARM      'PF        '  EXATTR           10                          
C                   PARM                    INZSIZ                                       
C                   PARM      ' '           INZCHR            1                          
C                   PARM      '*ALL      '  AUT              10                          
C                   PARM                    TEXT             50                          
C                   PARM      '*YES      '  REPLACE          10                          
C                   PARM                    APIERR                                       

次に API : QUSLOBJ によって *ALLUSR のライブラリー一覧を ユーザー・スペースに出力する。
QUSLOBJ の実行自体は次のように簡単である。

D OBJOBJLIB       S             20A   INZ('*ALLUSR   *LIBL     ')                        
     :                                                                                   
C*(2) QUSLOBJ:  オブジェクト一覧                                                         
C*----------------------------------------------------+                                  
C                   CALL      QUSLOBJ                                                    
C                   PARM                    USRSPC                                       
C                   PARM      'OBJL0100'    FOTMAT            8                          
C                   PARM                    OBJOBJLIB                                    
C                   PARM      '*LIB      '  OBJTYPE          10                          
C                   PARM                    APIERR                                       
C*----------------------------------------------------+                                  
C     AVLBYT        CABNE     *ZEROS        SNDERR                                       

結果の ユーザー・スペースの読み取りは API : QUSRTVUS によって検索する。
API : QUSRTVUS もユーザー・スペースを検索するために良く使う API であり
使用方法はどのような場合でも全く同じである。

QUSRTVUS : ユーザー・スペースの読み取り API

パラメータ

必須パラメータ・グループ:

1.ユーザー・スペース修飾名入力Char(20)
2.開始位置入力Birary(4)
3.データの長さ入力Binary(4)
4.レシーバー変数出力Char(*)

任意選択パラメータ:

5.エラー・コード入出力Char(*)

ユーザー・スペースの構造はすべて同じであり、最初のヘッダー部分にレコード数と 1 レコードの長さが
登録されている。従って 最初にヘッダー部分を読んで最初のデータの開始位置と
レコードの長さを取得してから 項目数の分だけ LOOP してデータを読み取ればよい。

C*(4) QUSRTVUS : リスト・セクションの読み取り                                            
C*    HEADER によって OFFSET,LSTSIZ を受取った                                           
C                   Z-ADD     OFFSET        STRPOS                                       
C                   ADD       1             STRPOS                                       
C                   Z-ADD     LSTSIZ        LENDTA                                       
C*     リスト・サイズの分だけ LOOP して検索                                              
C     1             DO        NOENTR        N                                            
C*----------------------------------------------------+                                  
C                   CALL      'QUSRTVUS'                           99                    
C                   PARM                    USRSPC                                       
C                   PARM                    STRPOS                                       
C                   PARM                    LENDTA                                       
C                   PARM                    USL0100                                      
C*----------------------------------------------------+                                  
C*      ------( 処理の開始 - ここから )------                                            
C     'OBJ='        CAT(P)    USL0100.OBJ:0 DSP40            40                          
C     DSP40         DSPLY                                                                
C*      ------( 処理の終了 - ここまで )------                                            
C                   ADD       LENDTA        STRPOS                                       
C                   END                                                                  

ユーザー・スペースの読み取りは ( 処理の開始 ) 〜 ( 処理の終了 ) が変わるだけで
ヘッダー構造もつねに同じである。

以上の処理をひとつのソースにまとめると次のようになる。

0001.00 H DATEDIT(*YMD/)                                                                 
0002.00 F********** ライブラリー一覧表 ****************************************          
0003.00 F*   QUSLOBJ  のサンプル                                                         
0004.00 F**********************************************************************          
0005.00  /COPY QSYSINC/QRPGLESRC,QUS                                                     
0006.00  /COPY QSYSINC/QRPGLESRC,QUSLOBJ                                                 
0007.00 D OBJOBJLIB       S             20A   INZ('*ALLUSR   *LIBL     ')                
0008.00                                                                                  
0009.00 D APIERR          DS                                                             
0010.00 D  GETBYT                 1      4B 0 INZ(160)                                   
0011.00 D  AVLBYT                 5      8B 0 INZ(0)                                     
0012.00 D  MSGID                  9     15                                               
0013.00 D  MSGDTA                17    160                                               
0014.00                                                                                  
0015.00 D USRSPC          DS                                                             
0016.00 D  USNAME                       10A   INZ('QUSLOBJ   ')                          
0017.00 D  USLIB                        10A   INZ('QTEMP     ')                          
0018.00                                                                                  
0019.00 D MSGFFLIB        DS                                                             
0020.00 D  MSGF                         10A   INZ('QCPFMSG   ')                          
0021.00 D  MSGFLIB                      10A   INZ('QSYS      ')                          
0022.00                                                                                  
0023.00 D HEDSTR          DS           256                                               
0024.00 D  OFFSET                 1      4B 0                                            
0025.00 D  NOENTR                 9     12B 0                                            
0026.00 D  LSTSIZ                13     16B 0                                            
0027.00                                                                                  
0028.00 D USL0100         DS                  QUALIFIED                                  
0029.00 D  OBJ                          10A                                              
0030.00 D  OBJLIB                       10A                                              
0031.00 D  OBJTYP                       10A                                              
0032.00                                                                                  
0033.00 D SPCBIN          DS                                                             
0034.00 D  INZSIZ                       10I 0 INZ(1000)                                  
0035.00 D  MSGDTALEN                    10I 0 INZ(100)                                   
0036.00 D  PGMSTKCNT                    10I 0 INZ(1)                                     
0037.00 D  RCVLEN                        4B 0 INZ(%SIZE(QUSL010003))                     
0038.00 D  STRPOS                       10I 0                                            
0039.00 D  LENDTA                       10I 0                                            
0040.00 D  N                             4S 0                                            
0041.00 D  DATE                          6A                                              
0042.00 D  TIME                          6A                                              
0043.00                                                                                  
0044.00 C*(1) QUSCRTUS: ユーザー・スペースの作成                                         
0045.00 C*----------------------------------------------------+                          
0046.00 C                   CALL      'QUSCRTUS'                                         
0047.00 C                   PARM                    USRSPC                               
0048.00 C                   PARM      'PF        '  EXATTR           10                  
0049.00 C                   PARM                    INZSIZ                               
0050.00 C                   PARM      ' '           INZCHR            1                  
0051.00 C                   PARM      '*ALL      '  AUT              10                  
0052.00 C                   PARM                    TEXT             50                  
0053.00 C                   PARM      '*YES      '  REPLACE          10                  
0054.00 C                   PARM                    APIERR                               
0055.00 C*----------------------------------------------------+                          
0056.00 C     AVLBYT        CABNE     *ZEROS        SNDERR                               
0057.00                                                                                  
0058.00 C*(2) QUSLOBJ:  オブジェクト一覧                                                 
0059.00 C*----------------------------------------------------+                          
0060.00 C                   CALL      QUSLOBJ                                            
0061.00 C                   PARM                    USRSPC                               
0062.00 C                   PARM      'OBJL0100'    FOTMAT            8                  
0063.00 C                   PARM                    OBJOBJLIB                            
0064.00 C                   PARM      '*LIB      '  OBJTYPE          10                  
0065.00 C                   PARM                    APIERR                               
0066.00 C*----------------------------------------------------+                          
0067.00 C     AVLBYT        CABNE     *ZEROS        SNDERR                               
0068.00                                                                                  
0069.00 C*(3) QUSRTVUS : ヘッダー構造の読み取り                                          
0070.00 C*----------------------------------------------------+                          
0071.00 C                   CALL      'QUSRTVUS'                                         
0072.00 C                   PARM                    USRSPC                               
0073.00 C                   PARM      125           STRPOS                               
0074.00 C                   PARM      16            LENDTA                               
0075.00 C                   PARM                    HEDSTR                               
0076.00 C                   PARM                    APIERR                               
0077.00 C*----------------------------------------------------+                          
0078.00 C     AVLBYT        CABNE     *ZEROS        SNDERR                               
0079.00                                                                                  
0080.00 C*(4) QUSRTVUS : リスト・セクションの読み取り                                    
0081.00 C*    HEADER によって OFFSET,LSTSIZ を受取った                                   
0082.00 C                   Z-ADD     OFFSET        STRPOS                               
0083.00 C                   ADD       1             STRPOS                               
0084.00 C                   Z-ADD     LSTSIZ        LENDTA                               
0085.00 C*     リスト・サイズの分だけ LOOP して検索                                      
0086.00 C     1             DO        NOENTR        N                              N=1-NOENTR  
0087.00 C*----------------------------------------------------+                          
0088.00 C                   CALL      'QUSRTVUS'                           99            
0089.00 C                   PARM                    USRSPC                               
0090.00 C                   PARM                    STRPOS                               
0091.00 C                   PARM                    LENDTA                               
0092.00 C                   PARM                    USL0100                              
0093.00 C*----------------------------------------------------+                          
0094.00 C*      ------( 処理の開始 - ここから )------                                    
0095.00 C     'OBJ='        CAT(P)    USL0100.OBJ:0 DSP40            40                  
0096.00 C     DSP40         DSPLY                                                        
0097.00 C*      ------( 処理の終了 - ここまで )------                                    
0098.00 C                   ADD       LENDTA        STRPOS                               
0099.00 C                   END                                                    N=1-NOENT
0100.00                                                                                  
0101.00 C                   MOVE      *ON           *INLR                                
0102.00 C     '** END **'   DSPLY                   ANS               1                  
0103.00 C                   RETURN                                                       
0104.00 C     SNDERR        TAG                                                          
0105.00 C     GETBYT        SUB       15            MSGDTALEN                            
0106.00 C*----------------------------------------------------+                          
0107.00 C                   CALL(E)   'QMHSNDPM'                                         
0108.00 C                   PARM                    MSGID                                
0109.00 C                   PARM                    MSGFFLIB                             
0110.00 C                   PARM                    MSGDTA                               
0111.00 C                   PARM                    MSGDTALEN                            
0112.00 C                   PARM      '*ESCAPE   '  MSGTYPE          10                  
0113.00 C                   PARM      '*         '  PGMQUE           10                  
0114.00 C                   PARM                    PGMSTKCNT                            
0115.00 C                   PARM      '    '        MSGKEY            4                  
0116.00 C                   PARM                    APIERR                               
0117.00 C*----------------------------------------------------+                          
0118.00 C                   MOVE      *ON           *INLR                                
0119.00 C                   RETURN                                                       
【解説】

QUSLOBJ 以外の別の ユーザー・スペースに出力する API の場合も

0058.00 C*(2) QUSLOBJ:  オブジェクト一覧                                                 
0059.00 C*----------------------------------------------------+                          
0060.00 C                   CALL      QUSLOBJ                                            
0061.00 C                   PARM                    USRSPC                               
0062.00 C                   PARM      'OBJL0100'    FOTMAT            8                  
0063.00 C                   PARM                    OBJOBJLIB                            
0064.00 C                   PARM      '*LIB      '  OBJTYPE          10                  
0065.00 C                   PARM                    APIERR                               
0066.00 C*----------------------------------------------------+                          

と、

0094.00 C*      ------( 処理の開始 - ここから )------                                    
0095.00 C     'OBJ='        CAT(P)    USL0100.OBJ:0 DSP40            40                  
0096.00 C     DSP40         DSPLY                                                        
0097.00 C*      ------( 処理の終了 - ここまで )------                                    

が変わるだけでありその他は同じソースとなるはずである。
従ってこの例はコピーして繰り返し参照して使用することになるだろう。