最新の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 /*( 処理 -- ここまで )*/
