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を使っているので
これを動作させた方法であり確実に正しく動作する方法である。