先に「527.RPGで簡単にレコード名検索API」で示したように
API: QUSLRCD ではなくファイル専用のAPIを利用すれば
ユーザー・スペースを事前に作成する必要もなく
レコード名を検索することができる。
_
DSPF の構造を調べるAPI : QDFRTVFD が用意されているが
このAPIも データ・ベース以上に莫大な構造を持っていて
現在APIのマニュアルは英文のみの公開であるところからも
解析には相当の時間と労力を必要とする。
QDFRTVFD のIBMマニュアルはここから。
そこでILE-RPGでも超簡単にDSPFのレコード名を調べることが
できるサンブルを作成したのでここに公開する。
[ TESTDSP ]
ソースはこちらから
0001.00 H DFTNAME(TESTDSP) DATEDIT(*YMD/) BNDDIR('QC2LE') DFTACTGRP(*NO)
0002.00 F********** DSPF のレコード検索 **********************************
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*( QDFRTVFD のプロトタイプ宣言 )
0013.00 D QDFRTVFD PR EXTPGM('QSYS/QDFRTVFD')
0014.00 D FMTBUF 32727A CONST
0015.00 D FMTLEN 10I 0 CONST
0016.00 D FOTMAT 8A CONST
0017.00 D FILFILLIB 20A CONST
0018.00 D APIERR LIKEDS(APIERR)
0019.00 D OPTIONS(*VARSIZE)
0020.00
0021.00 *( 作業変数 )
0022.00 D FMTLEN S 10I 0 INZ(32767)
0023.00 D RECORD S 10A
0024.00 D POS S 10I 0 INZ(217)
0025.00 D SIZE S 10I 0 INZ(16)
0026.00 D N S 4S 0
0027.00 D ANS S 1A
0028.00 *( FMTBUF FOR DSPF )
0029.00 D FMTDSP DS 32767 QUALIFIED
0030.00 D RECNUM 11 12B 0
0031.00
0032.00 D FILEDS DS QUALIFIED
0033.00 D FILE 1 10
0034.00 D FILLIB 11 20
0035.00
0036.00 C*-------------------------------------------------------------------------+
0037.00 C *ENTRY PLIST |
0038.00 C PARM FILE_ 10 | ファイル名
0039.00 C PARM FILLIB_ 10 | ライブラリー名
0040.00 C*-------------------------------------------------------------------------+
0041.00 /FREE
0042.00 QDFRTVFD(FMTDSP:FMTLEN:'DSPF0100':FILEDS:APIERR);
0043.00 IF APIERR.AVLBYT > 0;
0044.00 DSPLY (%TRIMR(FILEDS) + ' の誤りです。 ' ) '' ANS;
0045.00 ELSE;
0046.00 POS = 217;
0047.00 FOR N = 1 TO FMTDSP.RECNUM;
0048.00 RECORD = %SUBST(FMTDSP:POS:10); //DSPF レコード様式名
0049.00 POS = POS + 16;
0050.00 ENDFOR;
0051.00 ENDIF;
0052.00 *INLR = *ON;
0053.00 RETURN;
0054.00 /END-FREE
0055.00 ***********************************************************
0056.00 C *INZSR BEGSR * 初期値セット
0057.00 ***********************************************************
0058.00 /FREE
0059.00 FILEDS.FILE = FILE_;
0060.00 FILEDS.FILLIB = FILLIB_;
0061.00 /END-FREE
0062.00 C ENDSR
[コンパイル]
CRTBNDRPG PGM(OBJLIB/TESTDSP) SRCFILE(SRCLIB/QRPGLESRC) DFTACTGRP(*NO
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
[解説]
この処理はさらに簡単で0046.00 POS = 217; 0047.00 FOR N = 1 TO FMTDSP.RECNUM; 0048.00 RECORD = %SUBST(FMTDSP:POS:10); //DSPF レコード様式名 0049.00 POS = POS + 16; 0050.00 ENDFOR;
の処理だけがコアとなる部分である。
API : QDFRTVFD で受け取ったバッファー: FMTDSP のどこにレコード名が
記録されているかわかれば処理をこんなにもやさしくなる。
API : QDFRTVFD は莫大な処理構造を持っており容易に理解することは
できない。
AutoWebでは API: QDFRTVFDを駆使してオープンされているDSPFの
構造をフィールドに至るまでC言語で即時に読み取っているので
パフォーマンス良くGUIコントロールを表示することに成功している。
高度な技術があってこそ高い品質の製品を生み出すことができる。
_
今回のILE-RPGによるDSPFのレコード名の検索も次期製品の
サービス・プログラムの一部として利用されている。
またこの方法でQUSLFLDを使うのではなくRPGで高速でフィールド一覧も
検索することができる。
弊社ではC言語でフィールド一覧を高速で検索している。
ILE-RPGによるフィールド高速変換は機会があればいずれまた
紹介する。
