先の「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 の使用によって高速になり、
非常にスマートな処理に改善することができる。
