RPG

528. DSPFのレコード名もRPGで簡単検索

先に「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によるフィールド高速変換は機会があればいずれまた
紹介する。