RPG

488. SFLPGMQ の使い方

SFLMSGQ とはメッセージ・サブファイルと呼ばれるエラー・メッセージの
出力方法である。
通常のERRMSGやSFLMSGの出力はひとつのエラー・メッセージしか表示することが
できないが SFLPGMQ によるエラー・メッセージの出力であれば
一度に複数個のエラー・メッセージを出力することができる。

一般にエラー・メッセージは DSPFの ERRMSGキーワードかまたは
SFLMSGや SFLMSGIDキーワードでエラー・メッセージを出力するのが
IBM iの標準の方法であるが中には24行目に独自のエラー・メッセージとしての
フィールドを出力していて「これをうちではエラー・メッセージと呼んでいます」
というソフトウェア会社もいたがこれは論外である。
  _

それは別としてメッセージ・サブファイル(SFLPGMQ)の出力方法の解説ほど
探しても見つからないし正しいサンプル・ソースもない。
IBM公開のサンプル・ソースであっても正しく動作しないものが多い。
それはSFLMGMQの動作に必要なことをすべて記述していないからである。

中には個人の記事ではマニュァルの一部を写しただけのものもある。
つまり実際にSFLPGMQを動作させたという実例はほとんど
見当たらない。
そこでここではSFLPGMQを動作させるたるのすべての
条件を記述するようにした。

[SFLPGMQのDSPFサンプル・ソース]

 A          R ERRMSG                    SFL            
 A                                      SFLMSGRCD(24)  
 A            MSGKEY                    SFLMSGKEY      
 A            MSGQ                      SFLPGMQ(10)    
 A          R ERRCTL                    SFLCTL(ERRMSG) 
   :
 A                                      SFLSIZ(0020) 
 A                                      SFLPAG(0001) 
 A  30                                  SFLDSPCTL    
 A  28                                  SFLDSP       
 A  27                                  SFLCLR       
 A  31                                  SFLINZ       
 A  29                                  SFLDLT       
 A  32                                  LOCK         
 A  34                                  SFLEND       
 A            MSGQ                      SFLPGMQ(10)  
      :

[解説]

このDSPFソースはDFUが生成したDSPFソースの一部である。
エラー・メッセージを表示するSFLコントロールは ERRCTLという名前で
エラー・メッセージは ERRMSG という名前のSFLレコードとして出力される。
_

[SFLPGMQを出力するRPGプログラムのサンプル]

0001.00 H DFTNAME(@SHOHIN#) DATEDIT(*YMD/) BNDDIR('QC2LE')                      
0002.00 F********** 商品マスターの登録 **************************************** 
0003.00 F@SHOHIN#  CF   E             WORKSTN                                   
0004.00 F                                     SFILE(B100000:RRN1)               
0005.00 F                                     SFILE(ERRMSG:ERRN)                
  :
0108.00 D CPFMSG          C                   CONST('QCPFMSG   *LIBL     ')
0109.00 D DFUMSG          C                   CONST('QDFUMSG   *LIBL     ')
0111.00  *( QMHSNDPM : プログラム・メッセージの送信 )                   
0112.00 D QMHSNDPM        PR                  EXTPGM('QMHSNDPM')        
0113.00 D  MSGID                         7A   CONST                     
0114.00 D  MSGFILE                      20A   CONST                     
0115.00 D  MSGDATA                     256A   CONST OPTIONS(*VARSIZE)   
0116.00 D  MSGDATALEN                   10I 0 CONST                     
0117.00 D  MSGTYPE                      10A   CONST                     
0118.00 D  CALLSTACKE                   10A   CONST                     
0119.00 D  CALLSTACKC                   10I 0 CONST                     
0120.00 D  RTNMSGKEY                     4A                             
0121.00 D  APIERR                             LIKEDS(QUSEC)             
0122.00 D                                     OPTIONS(*VARSIZE)         
0123.00  *                                                              
  :
0198.00 C*-------------------------------------------------------------------------+
0199.00 C     DSPLY         TAG                                                    |
  :
0206.00 C   99              SETON                                        31        | SFLINZ
0207.00 C   99              WRITE     ERRCTL                                       |
0208.00 C                   SETOFF                                       31        | 
0209.00 C                   EXFMT     C100000                                      |
0210.00 C                   SETOFF                                       3028      |
0211.00 C*-------------------------------------------------------------------------+
  :
0466.00 C******************************************************   
0467.00 C     SNDMSG        BEGSR                                 
0468.00 C******************************************************   
0469.00  /FREE                                                    
0470.00    QMHSNDPM(MSGID: MSGFILLIB: MSGDTA : MSGDTALEN: '*COMP':
0471.00              '*': 0:MSGKEY:APIERR);         
0471.01    MSGQ = '*';                                            
0472.00  /END-FREE                                                
0472.01 C                   WRITE     ERRMSG                      
0473.00 C                   ENDSR                                 

-

[解説]
SFLPGMQ も SFLであるのでファイル仕様書では

0005.00 F                                     SFILE(ERRMSG:ERRN) 

のようにRRN= ERRN と結びつける記述が必須である

次に大事なことは

0470.00    QMHSNDPM(MSGID: MSGFILLIB: MSGDTA : MSGDTALEN: '*COMP':
0471.00              '*': 0:MSGKEY:APIERR); 

という送信スタックを ‘*’: 0: として記述することである。
‘*PGMBDY’; PGMSTKCNT では正しく動作しない

さらに大事なことは

0471.01    MSGQ = '*'; 

として MSGQを ‘*’ と指定するようにIBMマニュアルに書かれていて
これも遵守しないと実行エラーになって動作しない。

最後に SFLPGMQ を活動化させるために標識31をONにセットして
SFLINZ を実行することも重要である。
これも確かにIBMのマニュアルに書かれているが SFLPGMQ の使用のインターネットでの
SFLINZを有効化しないとSFLPGMQは正しく動作しない。

_

※ DFUが生成するDSPFのSFLPGMQはこのような SFLPGMQを使っているので
  これを動作させた方法であり確実に正しく動作する方法である。