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* ------( 処理の終了 - ここまで )------
が変わるだけでありその他は同じソースとなるはずである。
従ってこの例はコピーして繰り返し参照して使用することになるだろう。