RPG

416. 超高速で読み取る外部記述ファイルRPG

先に「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千件のレコードがあるが
読取りは一瞬で終わってしまう。
つまり外部記述での超高速処理が実現できたことになる。