CL

202. QUSRTVUS ユーザー・スペースの読取り

最新のCLPの記述でのAPI: QUSRTVUS を使った
ユーザー・スペースの読取り方法を紹介する。
ユーザー・スペースの読取りができるようになるとAPIが怖くなくなる。

[ QUSRTVUS : ユーザー・スペースの読取り ]

ソースはこちらから

0001.00              PGM                                                        
0002.00 /*-------------------------------------------------------------------*/ 
0003.00 /*   QUSRTVUS   :   ユーザー・スペースの検索                         */ 
0004.00 /*                                                                   */ 
0005.00 /*-------------------------------------------------------------------*/ 
0006.00  /*( QUSCRTUS の変数 )*/                                                
0007.00              DCL        VAR(&INZSIZ) TYPE(*INT) VALUE(1024)             
0008.00  /*( QSRTVUS  に必要な変数 )*/                                          
0009.00              DCL        VAR(&STRPOS) TYPE(*INT) VALUE(125)              
0010.00              DCL        VAR(&LENDTA) TYPE(*INT) VALUE(16)               
0011.00              DCL        VAR(&RCVVAL) TYPE(*CHAR) LEN(16)                
0012.00              DCL        VAR(&OFFSET) TYPE(*INT) STG(*DEFINED) +         
0013.00                           DEFVAR(&RCVVAL 1)                             
0014.00              DCL        VAR(&NOENTR) TYPE(*INT) STG(*DEFINED) +         
0015.00                           DEFVAR(&RCVVAL 9)                             
0016.00              DCL        VAR(&LSTSIZ) TYPE(*INT) STG(*DEFINED) +         
0017.00                           DEFVAR(&RCVVAL 13)                            
0018.00              DCL        VAR(&N) TYPE(*INT) /* WORK */                   
0019.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(1024)              
0020.00                                                                         
0021.00 /*(3) ユーザー・スペースを読み取る */                                   
0022.00 /*( リスト検索の開始 )*/                                                
0023.00              CALL       PGM(QUSRTVUS) PARM('NETCNN    CHAO.USR  ' +     
0024.00                    &STRPOS &LENDTA &RCVVAL)                           
0025.00                                                                       
0026.00   /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/                    
0027.00              CHGVAR     VAR(&STRPOS) VALUE(&OFFSET + 1)               
0028.00                                                                       
0029.00              DOFOR      VAR(&N) FROM(1) TO(&NOENTR) /* DO-LOOP */     
0030.00              CALL       PGM(QUSRTVUS) PARM('NETCNN    CHAO.USR  ' +   
0031.00                           &STRPOS &LSTSIZ &RCVDTA)                    
0032.00              /*( 処理 -- ここから )*/                                 
0033.00              IF         COND(%SST(&RCVDTA 1 15) = &CLTADR) THEN(DO)   
0034.00              CHGVAR     VAR(&IPADDR) VALUE(%SST(&RCVDTA 21 15))       
0035.00              LEAVE                                                    
0036.00              ENDDO                                                    
0037.00              /*( 処理 -- ここまで )*/                                 
0038.00              CHGVAR     VAR(&STRPOS) VALUE(&STRPOS + &LSTSIZ)         
0039.00              ENDDO      /* DO-LOOP */                                 
0040.00              /*( 処理のおわり )*/     


                                  

[解説]

ユーザー・スペースのリスト構造はどんなAPIからの出力でも同じ構造として
出力されるように規定されている。
それ故このような汎用的なユーザー・スペースの読取りプログラムを
使って読み取ることができるようになっている。
つまりどんなユーザー・ロスペースの読取りもこのプログラムで
正しく読取ることができる。
ちがうのは処理の部分だけである。
このユーザー・スペースの読取りができるようになると
APIの利用が身近なものになるに違いない。

最初に

0022.00 /*( リスト検索の開始 )*/                                                
0023.00              CALL       PGM(QUSRTVUS) PARM('NETCNN    CHAO.USR  ' +     
024.00                    &STRPOS &LENDTA &RCVVAL)                           
025.00                                                                       
026.00   /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/                    
027.00              CHGVAR     VAR(&STRPOS) VALUE(&OFFSET + 1)               
028.00      

によってリスト項目数が &OFFSET + 1から &NOENTR 数あることがわかる。
このようにユーザー・スペースのヘッダー構造はすべて同じであり
このユーザー・スペースのリスト構造はどこから始まり
ひとつひとつのレコードの長さとレコード数が収められているので
後はそれに従ってQUSRTVUSで読み取るだけである。
DOFOR-LOOPによって &NOENTRの個数だけLOOPして 1項目について
&LSTSIZの分だけ読取りを次のように繰り返す。

029.00              DOFOR      VAR(&N) FROM(1) TO(&NOENTR) /* DO-LOOP */     
030.00              CALL       PGM(QUSRTVUS) PARM('NETCNN    CHAO.USR  ' +   
031.00                           &STRPOS &LSTSIZ &RCVDTA)                    
032.00              /*( 処理 -- ここから )*/                                 
033.00              IF         COND(%SST(&RCVDTA 1 15) = &CLTADR) THEN(DO)   
034.00              CHGVAR     VAR(&IPADDR) VALUE(%SST(&RCVDTA 21 15))       
035.00              LEAVE                                                    
036.00              ENDDO                                                    
037.00              /*( 処理 -- ここまで )*/                                 
038.00              CHGVAR     VAR(&STRPOS) VALUE(&STRPOS + &LSTSIZ)         
039.00              ENDDO      /* DO-LOOP */ 

これがリストAPIの結果のユーザー・スペースの読取り方法である。
このソースをテンプレートとして保管しておいてSEUでインクルードすると
ユーザー・スペースの読取りを簡単に記述することができる。
APIにまだ不慣れな人はぜひマスターして欲しい。
ユーザー・スペースは内部的には物理的なファイルではなくメモリとして管理されているので
パフォーマンスはファイルの入出力にくらべてかなり速くなるのでファイルの読取りより
APIの速さと実力を体感して頂けると思う。
ソフト製品を開発販売している会社でもAPIを使えない会社が実に多い。
一般ユーザーのほうがAPIも含めて技術力は優れているようである。
ぜひAPIも抵抗なく使えるようにして欲しい。

032.00              /*( 処理 -- ここから )*/                                 
   :
   (このあいだに必要な処理を記述すれば良い)
   :                                                   
036.00              ENDDO                                                    
037.00              /*( 処理 -- ここまで )*/