RPG

228. RPG の実行中に完了メッセージを表示するには

CLP や C/400の実行中にステータス・メッセージや完了メッセージを表示することは
簡単にできるが RPG の実行中に完了メッセージやステータス・メッセージを表示するためには
ちょっとした注意が必要となる。

ここでのRPGサンプル・ソースは実行キーを押す都度にメッセージが次々と表示されるものである。

【 TESTMSG: サンプル・ソース 】
0001.00 H DFTNAME(TESTMSG) DATEDIT(*YMD/)                                       
0002.00 F**********  完了メッセージの表示 ********************************      
0003.00 FTESTMSGFM CF   E             WORKSTN                                   
0004.00 F*****************************************************************      
0005.00 D MSR             S             80    DIM(3) CTDATA PERRCD(1)           
0006.00 D MS              S              4S 0                                   
0007.00 D SNDPGMMSG       C                   CONST('QSYS/QMHSNDPM')            
0008.00 D QCPFMSG         C                   CONST('QCPFMSG   QSYS      ')     
0009.00 D MSGDTALEN       S             10I 0 INZ(40)                           
0010.00 D PGMSTKCNT       S             10I 0 INZ(0)                            
0011.00                                                                         
0012.00 D APIERR          DS                                                    
0013.00 D  GETBYT                 1      4B 0 INZ(160)                          
0014.00 D  AVLBYT                 5      8B 0 INZ(0)                            
0015.00 D  MSGID                  9     15                                      
0016.00 D  MSGDTA                17    160                                      
0017.00                                                                         
0018.00 C*( 初期画面 )                                                          
0019.00 C*----------------------------------------------------+                 
0020.00 C     START         TAG                                                 
0021.00 C                   EXFMT     DSPHEAD                                   
0022.00 C*----------------------------------------------------+                 
0023.00 C                   SETOFF                                       99     
0024.00 C*( CF03 )- 終了                                                        
0025.00 C     *IN03         IFEQ      *ON                                       
0026.00 C                   SETON                                        LR     
0027.00 C                   RETURN                                              
0028.00 C                   END                                                 
0029.00 C*( 実行キー )                                                          
0030.00 C                   ADD       1             MS                          
0031.00 C     MS            IFGE      4                                         
0032.00 C                   Z-ADD     1             MS                          
0033.00 C                   ENDIF                                               
0034.00 C                   EXSR      SNDMSG                                    
0035.00 C                   GOTO      START                                     
0036.00 C******************************************************                 
0037.00 C     *INZSR        BEGSR                                               
0038.00 C******************************************************                 
0039.00 C                   Z-ADD     0             MS                          
0040.00 C                   ENDSR                                               
0041.00 C******************************************************                 
0042.00 C     SNDMSG        BEGSR                                            
0043.00 C******************************************************              
0044.00 C                   MOVEL     QCPFMSG       MSGFILLIB                
0045.00 C                   MOVEL     MSR(MS)       MSGDTA                   
0046.00 C*----------------------------------------------------+              
0047.00 C                   CALL      SNDPGMMSG                              
0048.00 C                   PARM      'CPF9897'     MSGID             7      
0049.00 C                   PARM                    MSGFILLIB        20      
0050.00 C                   PARM                    MSGDTA                   
0051.00 C                   PARM                    MSGDTALEN                
0052.00 C                   PARM      '*STATUS   '  MSGTYPE          10      
0053.00 C                   PARM      '*EXT      '  PGMQUE           10      
0054.00 C                   PARM                    PGMSTKCNT                
0055.00 C                   PARM                    MSGKEY            4      
0056.00 C                   PARM                    APIERR                   
0057.00 C*----------------------------------------------------+              
0058.00 C                   ENDSR                                            
0059.00 ** MSR                      
0060.00 1 レコードが追加されました。
0061.00 1 レコードが変更されました。
0062.00 1 レコードが削除されました。
【解説】

サブ・ルーチン : SNDMSG の中で API : QMHSNDPM を使ってステータス・メッセージ( *STATUS )を出力している。
これは CLP で記述すると

    SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +
             TOPGMQ(*EXT) MSGTYPE(*STATUS)               

を実行しているのと同じである。
*STATUS メッセージを出力するには MSGFMSGID を指定しなければならない。
CPF9897 は本文が512バイトの変数のみから成るメッセージであるので、これを利用すると
メッセージ・データとして任意の文字列を *STATUS メッセージとして出力することができる。

【 TESTMSGFM :サンプル・ソース 】
0001.00      A*%%TS  SD  20070731  210529  QTR         REL-V5R4M0  5722-WDS     
0002.00      A*-----------------------------------------------*                 
0003.00      A*  SFLENT :  サブ・ファイル入力                                   
0004.00      A*                                                                 
0005.00      A*        受注の入力                                               
0006.00      A*                                                                 
0007.00      A*-----------------------------------------------*                 
0008.00      A*%%EC                                                             
0009.00      A                                      DSPSIZ(24 80 *DS3)          
0010.00      A*                                     MSGLOC(24)                  
0011.00      A                                      PRINT                       
0012.00      A                                      HELP                        
0013.00      A                                      ALTHELP(CA01)               
0014.00      A                                      HLPPNLGRP(PGM201H QTROBJ/PG 
0015.00      A                                      HLPTITLE(' 受注の入力 ')    
0016.00      A          R DSPHEAD                   OVERLAY                     
0017.00      A*%%TS  SD  20070713  162403  QTR         REL-V5R4M0  5722-WDS     
0018.00      A                                      TEXT(' 初期画面 ')          
0019.00      A                                      CF03(03 ' 終了 ')           
0020.00      A                                      SETOF(99)                   
0021.00      A                                      BLINK                       
0022.00      A          H                           HLPARA(2 12 2 17)           
0023.00      A                                      HLPPNLGRP('PGM201/JUCNO' -  
0024.00      A                                      QTROBJ/PGM201H)             
0025.00      A                                  1 27' 受注の入力 '              
0026.00      A                                      DSPATR(HI)                  
0027.00      A                                  2  2' 受注 '                  
0028.00      A            JUCNO          5Y 0B  2 12TEXT(' 受注 ')            
0029.00      A                                      CHECK(RZ)                   
0030.00      A                                      CHECK(ER)                   
0031.00      A                                 11 15' 必要な項目を打鍵して実行  
0032.00      A                                       して下さい。 '             
0033.00      A                                 23  2'F3= 終了 '                 
0034.00      A                                      COLOR(BLU)                  
【解説】

表示画面(DSPF) でメッセージの出力に必要な記述は

 0016.00      A          R DSPHEAD                   OVERLAY

に記述されている OVERLAY キー・ワードである。
同時に出力される画面レコードには必ず OVERLAY を指定しておかないと
表示されたメッセージは一瞬のうちに消えてしまう。

【実行結果の画面】