先の「22. ユーザー・スペースを作成するには?」でも少し説明したが、オブジェクトの一覧表などのようにリスト形式の出力を行うAPI を使用するには
- ユーザー・スペースを作成する
- API を実行する
- ユーザー・スペースを検索する
の処理手順を経ることになる。
ここでは 「3. ユーザー・スペースを検索する。」 の部分の汎用的な処理の方法を紹介する。
リスト形式のAPIによる結果の出力は、どのAPIであっても同じ形式である。
つまり、以下のCLPによるユーザー・スペースの検索はどのようなリスト形式のAPI の出力結果もほとんど、そのまま使用することができる便利なものである。
0001.00 DCL VAR(&STRPOS) TYPE(*CHAR) LEN(4) + 0002.00 VALUE(X'0000007D') /* 2 進数開始位置 : + 0003.00 125 */ 0004.00 DCL VAR(&LENDTA) TYPE(*CHAR) LEN(4) + 0005.00 VALUE(X'00000010') /* 2 進数受取長さ : 16 */ 0006.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(16) + 0007.00 VALUE(X'0000000000000000') 0008.00 DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* + 0009.00 2 進数 オフセット */ 0010.00 DCL VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* + 0011.00 2 進数項目数 */ 0012.00 DCL VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* + 0013.00 2 進数リストサイズ */ 0014.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */ 0015.00 DCL VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */ 0016.00 DCL VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */ 0017.00 DCL VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */ 0018.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(256) /* + 0019.00 受取データ */ 0020.00 /*( リストAPIで作成されたユーザー空間の検索 )*/ 0021.00 /*( リストデータセクションのオフセットを検索 )*/ 0022.00 CALL PGM(QUSRTVUS) PARM('USRSPC QTEMP ' + 0023.00 &STRPOS &LENDTA &RCVVAR) 0024.00 CHGVAR VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4)) 0025.00 CHGVAR VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4)) 0026.00 CHGVAR VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4)) 0027.00 0028.00 /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/ 0029.00 CHGVAR VAR(&STRPOS) VALUE(&OFFSET) 0030.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) 0031.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + 1) 0032.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) 0033.00 CHGVAR VAR(&LENDTA) VALUE(&LSTSIZ) 0034.00 CHGVAR VAR(&ADDLEN) VALUE(%BIN(&LENDTA)) 0035.00 CHGVAR VAR(&NOENT) VALUE(%BIN(&NOENTR)) 0036.00 NXTRTV: 0037.00 CALL PGM(QUSRTVUS) PARM('USRSPC QTEMP ' + 0038.00 &STRPOS &LENDTA &RCVDTA) 0039.00 /*( 処理の開始 )*/ 0040.00 0041.00 0042.00 /*( 処理の終了 )*/ 0043.00 IF COND(&N < &NOENT) THEN(DO) 0044.00 CHGVAR VAR(&N) VALUE(&N + 1) 0045.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) 0046.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + &ADDLEN) 0047.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) 0048.00 GOTO NXTRTV 0049.00 ENDDO
【 解説 】
この例では
CALL PGM(QUSRTVUS) PARM('USRSPC QTEMP ' + &STRPOS &LENDTA &RCVVAR)
のように、ライブラリーQTEMP の USRSPC という名前のユーザー・スペースを検索している。
NXTRTV: CALL PGM(QUSRTVUS) PARM('USRSPC QTEMP ' + &STRPOS &LENDTA &RCVDTA)
によってリスト形式の1行分のデータは &RCVDTAという変数に格納される。
使用するAPI によっては
DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(256) /* + 受取データ */
の長さ256バイトを修正する必要があるくらいで、ほとんどのリストAPIでもこのCLP は、そのまま利用することができる。
/*( 処理の開始 )*/ /*( 処理の終了 )*/
には、あなたが結果の値である &RCVDTA をどのように処理するかを記述するだけでよい。
上記のリストAPI の代表的な例としては
ファイル・メンバー・リスト | API QUSLMBR |
データベース関連リスト | QDBLMBR |
フィールド・リスト | QUSLFLD |
レコード様式リスト | QUSLRCD |
オブジェクト・リスト | QUSLOBJ |
などが挙げられるがこの他にも多数存在する。
リストAPI が自由に使用できる技術を取得するとApp の幅は大幅に拡張する。
作業ファイルに出力して、それを読むといったようなApp はAPI の使用によって高速になり、
非常にスマートな処理に改善することができる。