CL

117. 不要なメッセージを削除するには?

API などを呼び出して使用していると不要なメッセージが
送出されている場合がある。
例えば 「xxxxを印刷出力しました」「XXXXが見つからない」「などのような
メッセージである。
「印刷しました」とのメッセージが残ったままではこの適用業務は何か
印刷出力しているのかとエンド・ユーザーに思われてしまうし
「xxxxが見つからない」ではこれは障害ではないですかとの
質問を受けかねない。
そこでこのようなメッセージは残らないように削除したいところだが
メッセージを送出しているプログラムが終了していたのでは
(ほとんどの場合が終了している)
プログラムのスタックが消滅しているのでスタックを指定して
メッセージを受取ることができない。従って削除することもできない、
という難問に出くわしてしまう。

*ALLINACT(活動中のすべてのメッセージ)を削除すると確かに
そのメッセージは消えるのだが必要なメッセージさえも消えてしまう。
やはりその特定のメッセージだけを消去すべきなのである。

特定のメッセージを受取るにはRCVMSGによってメッセージの種類や
前後関係(*FIRST, *LASTなど)を指定して受け取る方法以外に
メッセージ・キー(MSGKEY)を指定して受け取る方法がある。

メッセージ・キー(MSGKEY)とはメッセージが送出される都度、
OSによって割り振られる4桁の順序番号である。
しかもメッセージ・キー(MSGKEY)は必ず +1ずつ順番に発生していく。
このことを利用して不要なメッセージのメッセージ・キー(MSGKEY)を
特定することができる。

どのようにするかというとまずダミーでメッセージを発生させて
そのメッセージ・キー(MSGKEY)を取得しておく。
次に不要なメッセージを送出しているプログラムを実行させて
不要なメッセージを発生させる。
この不要なメッセージのメッセージ・キー(MSGKEY)は
先ほど発生させたメッセージ・キー(MSGKEY)の +1した値になっているはずであるので
そのメッセージ・キー(MSGKEY)を指定してメッセージを削除するという
少し手の込んだ方法であるがこの方法で確実に不要なメッセージを
削除することができる。

[不要なメッセージを削除するCLPサンプル]

  :
0068.00  /*( 不要なメッセージ削除のための変数 )*/               
0069.00              DCL        VAR(&LOWKEY) TYPE(*CHAR) LEN(4) 
0070.00              DCL        VAR(&HIKEY) TYPE(*CHAR) LEN(4)  
   :
   :
0101.00 /*( 不要なメッセージの削除 -- その 1 )*/                         
0102.00              SNDPGMMSG  MSG(DMY) TOPGMQ(*SAME) KEYVAR(&LOWKEY)   
0103.00              RMVMSG     PGMQ(*SAME) MSGKEY(&LOWKEY)              
   :
0113.00 /*( ヘルプの印刷 )*/                                              
0114.00              CALL       PGM(QUHPRTH) PARM(&HLPMOD &HLPSU &TITLE + 
0115.00                           &APIERR)                                
   :
0127.00 /*( 不要なメッセージの削除 -- その 2 )*/                                
0128.00              SNDPGMMSG  MSG(DMY) TOPGMQ(*SAME) KEYVAR(&HIKEY)           
0129.00              RMVMSG     PGMQ(*SAME) MSGKEY(&HIKEY)                      
0130.00              CHGVAR     VAR(%BIN(&MSGKEY)) VALUE(%BIN(&LOWKEY) + 1)     
0131.00 RMVMSG:                                                                 
0132.00              RCVMSG     PGMQ(*SAME (*)) MSGKEY(&MSGKEY) RMV(*YES) +     
0133.00                           MSG(&MSG)                                     
0134.00              MONMSG CPF2410 EXEC(DO)                                    
0135.00              RCVMSG     MSGTYPE(*EXCP) RMV(*YES)                        
0136.00              GOTO       NXTMSG                                          
0137.00              ENDDO                                                      
0138.00 NXTMSG:                                                                 
0139.00              CHGVAR     VAR(%BIN(&MSGKEY)) VALUE(%BIN(&MSGKEY) + 1)     
0140.00              IF (&MSGKEY *LT &HIKEY) GOTO RMVMSG                        
0141.00 /*( 不要なメッセージの削除 -- ここまで )*/                              

[解説]

これはあるCLPの一部であるが

0113.00 /*( ヘルプの印刷 )*/                                              
0114.00              CALL       PGM(QUHPRTH) PARM(&HLPMOD &HLPSU &TITLE + 
0115.00                           &APIERR) 

 

を実行するとAPI:QUHPRTH が「ヘルプを印刷しました」との余計なメッセージを
送出する。
印刷スプールを CPYSPLF で加工しているなどの不細工な処置をユーザーには
知られたくないのでこの「ヘルプを印刷しました」とのメッセージを
削除したい。
しかし RCVMSG では API:QUHPRTHが終了してしまっているので実行スタックは
消滅していて RCVMSG ではメッセージを受取ることがでできない。

そこでAPI:QUHPRTHを実行する直前に

0101.00 /*( 不要なメッセージの削除 -- その 1 )*/                         
0102.00              SNDPGMMSG  MSG(DMY) TOPGMQ(*SAME) KEYVAR(&LOWKEY)   
0103.00              RMVMSG     PGMQ(*SAME) MSGKEY(&LOWKEY) 

 によってメッセージ・キー &LOWKEY を入手しておく。

0130.00              CHGVAR     VAR(%BIN(&MSGKEY)) VALUE(%BIN(&LOWKEY) + 1) 

によって +1したメッセージ・キー &MSGKEY によって

0131.00 RMVMSG:                                                                 
0132.00              RCVMSG     PGMQ(*SAME (*)) MSGKEY(&MSGKEY) RMV(*YES) +     
0133.00                           MSG(&MSG)                               

 によって目指す不要なメッセージを削除することができるというわけである。

 不要なメッセージを自由に削除できるようになると不細工な処理であっても
ユーザーにさとられることなく不要なメッセージを削除することができ
見た目に洗練された適用業務に完成させることができるようになる。
弊社では残存するメッセージまで気にするようにしている。
後で不用意な質問を受けることを避けるためである。
製品となればこのような配慮まで必要である。