RPG

227. DSPF の表示レコードを連続して表示するには

DSPF の表示レコードを自動的に連続して表示したい場合がある。
デモや説明画面を一定の時間間隔で表示を連続して繰り返す場合や
最下部のオーバーレイで進行メッセージを表示したい場合など用途は様々である。

これを CLP で実現するには比較的簡単であり

【 サンプル・ソース CLPでの連続表示 】
 0001.00              PGM                                      
 0002.00              DCLF       FILE(TEST.COM/ANS103FM)       
 0003.00                                                       
 0004.00              SNDF       RCDFMT(DSPDTA01)              
 0005.00              RCVF       RCDFMT(DSPDTA01) WAIT(*NO)    
 0006.00              DLYJOB     DLY(1)                        
 0007.00              SNDF       RCDFMT(DSPDTA02)              
 0008.00              RCVF       RCDFMT(DSPDTA02) WAIT(*NO)    
 0009.00              DLYJOB     DLY(1)                        
 0010.00              SNDF       RCDFMT(DSPDTA03)              
 0011.00              RCVF       RCDFMT(DSPDTA03) WAIT(*NO)    
 0012.00              DLYJOB     DLY(10)                       
 0013.00              ENDPGM                                   

のようにして RCVF WAIT(*NO) DLYJOB で待ち時間を制御することができる。

しかし、同じことを RPG で実行するには、そうそう簡単ではない。
IBM 「ILE-RPG解説書」や「適用業務表示装置の手引き」は十分な説明がないからである。
その実現の方法を紹介しよう。

1. DSPF に INVITE を定義する

 0001.00      A*%%TS  SD  20070808  145526  QTR         REL-V5R4M0  5722-WDS 
 0002.00      A*            11:59:33    QSECOFR     REL-R06M00  5714-UT1     
 0003.00      A*%%EC                                                         
 0004.00      A                                      DSPSIZ(24 80 *DS3)      
 0005.00      A  *DS3                                MSGLOC(24)              
 0006.00      A                                      PRINT                   
 0007.00      A                                      INVITE                  
 0008.00      A          R DSPDTA01                  ALWROL OVERLAY          
 0009.00      A*%%TS  SD  20070808  145526  QTR         REL-V5R4M0  5722-WDS 
 0010.00      A                                      TEXT(' 明細画面 01')    
 0011.00      A                                      CF03(03 ' 終了 ')       
                           :
                           :
【解説】

上記のようにファイル・レベルのキー・ワードとして INVITE (送信勧誘)を定義する。
INVITE とは英語本来の意味は「招待する」(INVITATION) であるが、ここでは
「送信勧誘」として入力が終わるのを待つことなく READ 命令を実行する、という意味である。
ファイル・レベルに INVITE を定義していても、すべての表示レコードに対して
直ちに INVITE の機能が有効になるわけではない。

2. DSPF を WAITRCD を指定して作成する

CRTDSPF FILE(QTROBJ/ANS103FM) SRCFILE(QTRSRC/QDSPSRC) WAITRCD(*IMMED) LVLCHK(*NO) AUT(*ALL)

または

CRTDSPF FILE(QTROBJ/ANS103FM) SRCFILE(QTRSRC/QDSPSRC) WAITRCD(3) LVLCHK(*NO) AUT(*ALL)

のようにして待ち時間を指定して作成する。ここでは 3秒間の表示を指定している。

この待ち時間が CLP での DLYJOB に相当する。

3. RPG ソースを READ 画面ファイルに変更する

DSPF への入出力の部分を EXFMTWRITE (レコード名) + READ(レコード名) ではなく
READ (部面ファイル名) に次のように変更する。


    C                   WRITE     DSPDTA01                                
    C                   READ      ANS103FM                             99 
    C                   WRITE     DSPDTA02                                
    C                   READ      ANS103FM                             99 
    C                   EXFMT     DSPDTA03                                
【解説】

まず最初に WRITE命令の連続的な実行では各明細画面は表示されない。


              WRITE    DSPDTA01
              WRITE    DSPDTA02
              WRITE    DSPDTA03

では DSPDTA01DSPDTA02 は表示されることはない。
出力した表示レコードに対応する READ 命令が実行されて初めて表示レコードが表示されるのである。
従って 対応する READ 命令がない場合は WRITE 命令だけでは画面レコードは表示されない。

次に、


              WRITE    DSPDTA01
              READ     DSPDTA01
              WRITE    DSPDTA02
              READ     DSPDTA02
              WRITE    DSPDTA03
              READ     DSPDTA03

とする方法も駄目である。なぜダメであるとかいうと INVITE キー・ワードが効力を発揮しない。
INVITE (送信勧誘) は READ (画面レコード名)ではなく
READ (画面ファイル名) のように記述して初めて機能を発揮するからである。
READ (画面レコード)の記述では画面レコードは表示はされるものの永続的に待機して
次の画面レコードの表示へ進むことはできない。
( 今回の例で INVITE がファイル・レベルで定義されていることとは無関係である。
たとえレコード・レベルに INVITE を定義しても READ (画面レコード名) では
INVITE の機能は有効に発揮されない。)

IBM マニュアルには INVITE (送信勧誘)を特別にページをさいて解説されているが
READ (画面ファイル名) とすべきであることの注意点はどこにもない。
INVITE は入力パフォーマンスの改善にも有効な機能であるので
正しい解説が望まれるとしころである。
参考までに大量のデータ入力を必要とする業務において INVITE を使えばパフォーマンス良く
連続した大量の入力が可能となる。

さて上記の例では正しくは


             WRITE    DSPDTA01
             READ     ANS103FM                 99
             WRITE    DSPDTA02              
             READ     ANS103FM                 99
             WRITE    DSPDTA03
             READ     ANS103FM                 99

とすべきである。
これによって INVITE 機能が有効に働いて DSPDTA01 → DSPDTA02 → DSPDTA03 との連続した表示が
可能となる。

なおこの RPG のほかの EXFMT などによる入出力記述があったとしても、正しく待ち時間は有効となり
この部分のように 3秒の表示の後に直ちに画面表示が変わることはない。
INVITE キー・ワードをファイル・レベルで定義していたとしても READ (画面ファイル名) としない限りは
INVITE 機能は有効とはならないからである。
また READ 命令のエラー・コード 99 は必ず定義しておかないとタイムアウトがモニターできずに
エラーとなってしまうので注意すること。

このように INVITE 機能の説明には READ (画面ファイル名)の解説も必須であるべきであるが
IBM マニュアルにはその部分の解説がないのでここに紹介した次第である。