先に「415.超高速データ・ベースの読取りRPG」を紹介した。
なるほど高速での読取りが可能になったが
この例は内部記述ファイルの処理と同じで
DDS外部記述ファイルでは使えない。
つまりサンプルとしては動作できても実用的な
DDS外部記述の処理には使えないと思うかも知れないが
実は方法がある。
RPGに比べてC言語は高速で速く実行されると思いがとであるが
実はデータ・ベースの処理はRPGに優れていて
C言語でも外部記述処理ができ先に紹介した方法でも
外部記述として読み込方法があるのだが
その方法を使うと返って処理速度が低下してしまう。
先の例のようにバッファーのままの読取りであると
高速読取りが実現されるのである。
そこで高速を維持しつつ外部記述として処理できる
C言語とRPGの良さを両方取り持つハイブリッドな
方法を紹介しよう。
[ 超高速DDS読取りRPG : TESTREAD2 ]
ソースはこちらから
0001.00 H DFTNAME(TESTREAD2) DATEDIT(*YMD/) 0002.00 F********** 高速外部記述による読取り ********************************** 0003.00 F* 0004.00 F********************************************************************** 0005.00 0006.00 * CRTBNDRPG OBJ(OBJLIB/TESTREAD2) SRCFILE(MYSRCLIB/QRPGLESRC) 0007.00 * DFTACTRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL) 0008.00 0009.00 *-------------------------------------------------------------------* 0010.00 * 2021/11/27 : 作成 0011.00 *-------------------------------------------------------------------* 0012.00 *( 作業変数 ) 0013.00 D TRUE# S 4B 0 INZ(0) 0014.00 D FALSE# S 4B 0 INZ(-1) 0015.00 D EOF# S 4B 0 INZ(-1) 0016.00 D DFT C CONST(X'0B000100') 0017.00 D OE# C CONST(X'0E') 0018.00 D OF# C CONST(X'0F') 0019.00 0020.00 D*( _Ropen のプロトタイプ宣言 ) 0021.00 *[ 例 ] 0022.00 * RFILE = _Ropen("ASNET.USR/USRLIBL", "rr") 0023.00 D Ropen PR * ExtProc('_Ropen') 0024.00 D RFILE * VALUE OPTIONS(*STRING:*TRIM) 0025.00 D OPTION * Value OPTIONS(*STRING:*TRIM) 0026.00 0027.00 D*( _Rreadn のプロトタイプ宣言 ) 0028.00 * _RIOFB_T*_Rreadn(_RFILE *, void *, size_t, int); 0029.00 *[ 例 ] 0030.00 D Rreadn PR * ExtProc('_Rreadn') 0031.00 D RFILE * Value 0032.00 D RECORD * Value 0033.00 D RCD_LEN 10I 0 Value 0034.00 D OPT 10I 0 Value 0035.00 0036.00 D*( _Rclose のプロトタイプ宣言 ) 0037.00 D Rclose PR 10I 0 ExtProc('_Rclose') 0038.00 D RFILE * Value 0039.00 0040.00 D IOFB_P S * 0041.00 D RIOFB DS 64 QUALIFIED 0042.00 D BASED(IOFB_P) 0043.00 D KEY * 0044.00 D SYSPRM * 0045.00 D RRN 10I 0 0046.00 D NUM_BYTE 10I 0 0047.00 0048.00 D RFILE DS 336 QUALIFIED 0049.00 D BASED(RFILE_P) 0050.00 D BUF_LENGTH 193 196I 0 0051.00 0052.00 D DATA E DS 5000 EXTNAME(CODEMST) 0053.00 D RCD_LEN S 10I 0 0054.00 D RFILE_P S * 0055.00 D BYTES S 10I 0 0056.00 D HIVAL S 1N INZ(*ON) 0057.00 0058.00 /FREE 0059.00 RFILE_P = Ropen('QTRFIL/CODEMST': 'rr'); 0060.00 RCD_LEN = RFILE.BUF_LENGTH; 0061.00 DOW HIVAL; 0062.00 IOFB_P = Rreadn(RFILE_P: %ADDR(DATA): RCD_LEN: DFT); 0063.00 IF (RIOFB.NUM_BYTE = EOF#); 0064.00 LEAVE; 0065.00 ENDIF; 0066.00 EXSR CHECK; 0067.00 /END-FREE 0068.00 C******************************** 0069.00 C* レコードの処理はここから * 0070.00 C******************************** 0071.00 C EXSR PRINT 0072.00 C******************************** 0073.00 C* レコードの処理はここまで * 0074.00 C******************************** 0075.00 /FREE 0076.00 ENDDO; 0077.00 Rclose(RFILE_P); 0078.00 /END-FREE 0079.00 C SETON LR 0080.00 C RETURN 0081.00 C****************************************************** 0082.00 C CHECK BEGSR 0083.00 C****************************************************** 0084.00 C ENDSR 0085.00 C****************************************************** 0086.00 C PRINT BEGSR 0087.00 C****************************************************** 0088.00 C ENDSR
[コンパイル]
CRTBNDRPG PGM(TEST.COM/TESTREAD2) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
[解説]
プログラム: TESTREAD2 は先の TESTREAD と同じように
0062.00 IOFB_P = Rreadn(RFILE_P: %ADDR(DATA): RCD_LEN: DFT);
としてバッファー: DATA 単位で読み取っているのでやはり高速で処理される。
ところが
0052.00 D DATA E DS 5000 EXTNAME(CODEMST)
として DATA は ファイル: CODEMST とデータ構造で定義されているので
DATAにデータが読み止れれば即時に CODEMSTの全てのフィールドにも
値が更新されるという仕組みであり CODEMST の通常のフィールドで
演算することができる。
デバッグしてフィールドの値を調べてみればより確信することができる。
これはデータ・ベース CODEMST を読んでするのと同じことである。
この例のCODEMSTは約1万7千件のレコードがあるが
読取りは一瞬で終わってしまう。
つまり外部記述での超高速処理が実現できたことになる。