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