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 への入出力の部分を EXFMT や WRITE (レコード名) + 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
では DSPDTA01 と DSPDTA02 は表示されることはない。
出力した表示レコードに対応する 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 マニュアルにはその部分の解説がないのでここに紹介した次第である。

