QUSLOBJ も使用頻度の高い API であり、オブジェクトの一覧をユーザー・スペースに
出力して、それを検索して解析したり別の一覧表に出力するような目的のために使用される。
API の結果の出力方法は QUSROBJD で紹介したレシーバー変数に出力する場合と
結果の項目が複数個ある場合は、この 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 を紹介する。
必須パラメータ・グループ:
| 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 であり
使用方法はどのような場合でも全く同じである。
必須パラメータ・グループ:
| 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* ------( 処理の終了 - ここまで )------
が変わるだけでありその他は同じソースとなるはずである。
従ってこの例はコピーして繰り返し参照して使用することになるだろう。