CL

23. リストAPIユーザー・スペースの検索

先の「22. ユーザー・スペースを作成するには?」でも少し説明したが、オブジェクトの一覧表などのようにリスト形式の出力を行うAPI を使用するには

  1. ユーザー・スペースを作成する
  2. API を実行する
  3. ユーザー・スペースを検索する

の処理手順を経ることになる。
ここでは 「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)

のように、ライブラリーQTEMPUSRSPC という名前のユーザー・スペースを検索している。

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