DSPF の表示レコードを自動的に連続して表示したい場合がある。
デモや説明画面を一定の時間間隔で表示を連続して繰り返す場合や
最下部のオーバーレイで進行メッセージを表示したい場合など用途は様々である。
これを 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解説書」や「適用業務表示装置の手引き」は十分な説明がないからである。
その実現の方法を紹介しよう。
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
の機能が有効になるわけではない。
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
に相当する。
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 マニュアルにはその部分の解説がないのでここに紹介した次第である。