以前に「170.QUSLRCDを使わないレコード名検索」というテクニックを
紹介してCLPで API: QDBRTVFD を利用すれば簡単にレコード名を検索することができることを紹介した。
API: QDBRTVFD は莫大な構造を持つAPIであり
APIのマニュアルを参照しただけでは容易に利用することはできない。
さてここでは API : QDBRTVFD によるレコード名の検索を
ILE-RPGによって行う方法を紹介する。
_
[ TESTDBF ] データ・ベースのレコード名検索
ソースはこちらから
0001.00 H DFTNAME(TESTDBF) DATEDIT(*YMD/) BNDDIR('QC2LE') DFTACTGRP(*NO)
0002.00 F********** D/B レコード名の検索 ********************************
0003.00 F*
0004.00 F*****************************************************************
0005.00
0006.00 D APIERR DS QUALIFIED
0007.00 D GETBYT 1 4B 0 INZ(160)
0008.00 D AVLBYT 5 8B 0 INZ(0)
0009.00 D MSGID 9 15
0010.00 D MSGDTA 17 160
0011.00
0012.00 D*( QDBRTVFD のプロトタイプ宣言 )
0013.00 D QDBRTVFD PR EXTPGM('QSYS/QDBRTVFD')
0014.00 D FMTBUF 32727A CONST
0015.00 D FMTLEN 10I 0 CONST
0016.00 D RTNFILLIB 20A CONST
0017.00 D FOTMAT 8A CONST
0018.00 D FILFILLIB 20A CONST
0019.00 D MBR 10A CONST
0020.00 D OPT 1A CONST
0021.00 D FILETYPE 10A CONST
0022.00 D EXT 10A CONST
0023.00 D APIERR LIKEDS(APIERR)
0024.00 D OPTIONS(*VARSIZE)
0025.00
0026.00 *( 作業変数 )
0027.00 D FILSCOPE S 160A
0028.00 D RECORD S 10A
0029.00 D POS S 10I 0 INZ(513)
0030.00 D SIZE S 10I 0 INZ(160)
0031.00 D N S 4S 0
0032.00 D ANS S 1A
0033.00 D FMTBUF DS 32767 QUALIFIED
0034.00 D RECNUM 15 16B 0
0035.00 D FMTLEN S 10I 0 INZ(32767)
0036.00 D RTNFILLIB DS QUALIFIED
0037.00 D FILE 1 10
0038.00 D FILLIB 11 20
0039.00
0040.00 D FILEDS DS QUALIFIED
0041.00 D FILE 1 10
0042.00 D FILLIB 11 20
0043.00
0044.00 C*-------------------------------------------------------------------------+
0045.00 C *ENTRY PLIST |
0046.00 C PARM FILE_ 10 | ファイル名
0047.00 C PARM FILLIB_ 10 | ライブラリー名
0048.00 C*-------------------------------------------------------------------------+
0049.00 /FREE
0050.00 QDBRTVFD(FMTBUF:FMTLEN:RTNFILLIB:'FILD0100':FILEDS:'*FIRST':'0':
0051.00 '*FILETYPE ': '*EXT': APIERR);
0052.00 IF APIERR.AVLBYT > 0;
0053.00 DSPLY (%TRIMR(FILEDS) + ' の誤りです。 ' ) '' ANS;
0054.00 ELSE;
0055.00 FOR N = 1 TO FMTBUF.RECNUM;
0056.00 FILSCOPE = %SUBST(FMTBUF:POS:160);
0057.00 RECORD = %SUBST(FILSCOPE:69:10); // 取得したレコード名
0058.00 POS = POS + SIZE;
0059.00 ENDFOR;
0060.00 ENDIF;
0061.00 *INLR = *ON;
0062.00 RETURN;
0063.00 /END-FREE
0064.00 ***********************************************************
0065.00 C *INZSR BEGSR * 初期値セット
0066.00 ***********************************************************
0067.00 /FREE
0068.00 FILEDS.FILE = FILE_;
0069.00 FILEDS.FILLIB = FILLIB_;
0070.00 /END-FREE
0071.00 C ENDSR
[コンパイル]
CRTBNDRPG PGM(OBJLIB/TESTDBF) SRCFILE(SRCLIB/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
[解説]
この簡単なRPGソースの処理の中心となるのは
0055.00 FOR N = 1 TO FMTBUF.RECNUM; 0056.00 FILSCOPE = %SUBST(FMTBUF:POS:160); 0057.00 RECORD = %SUBST(FILSCOPE:69:10); // 取得したレコード名 0058.00 POS = POS + SIZE; 0059.00 ENDFOR;
というたった5行の処理である。
0050.00 QDBRTVFD(FMTBUF:FMTLEN:RTNFILLIB:'FILD0100':FILEDS:'*FIRST':'0': 0051.00 '*FILETYPE ': '*EXT': APIERR);
によって取得した FMTBUFのどの位置から読み取ればよいかというのが
課題であるがC言語によるAPIの実行によって位置を調べてILE-RPGでも
結果的に同じ処理ができるように解析したものである。
API : QUSLRCD を使ってレコード名を調べるにはユーザー・スペースを
作成してそこに出力したレコード一覧のデータを再び解析するという
途方もない手間が必要になる。
昭和の時代ではそれでもよかったのかも知れないが平成を経て
令和の現代では無駄なくスマートに解決したいものである。
_
