最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

13.2.基本に戻ろうMONMSG編

[ Previous ] [ HOME ] [ Upper ] [ Next ]


ここでは、もう知っているから、と、見落としそうな情報を揚げてみます。技術者認定試験にも役立つかもしれませんよ。

MONMSGって、メッセージなら全部モニター出来るのかな?

CLPを作っていると必ずお世話になる、MONMSG。でも、何でもモニター出来るのかな?いいえ、違いました。まず、メッセージの種類のおさらいです。これは、SNDPGMMSGでMSGTYPEのところで、F1を押した部分のハードコピーです。

                        プログラム・メッセージ送信  (SNDPGMMSG)                 

                    メッセージ・タイプ  (MSGTYPE) −ヘルプ                    
                                                                              
   このメッセージがこのプログラムによって送られる時にどのメッセージ・タイプ   
   を割り当てるかを指定します。                                               
                                                                              
   注                                                                        
     1.  照会メッセージを送ることができるのは,外部待ち行列,または TOUSR     
           または TOMSGQ パラメーターで指定されている名前付きメッセージ待ち   
         行列だけです。                                                       
     2.  完了,診断,エスケープ,通知,および状況メッセージは,呼出しメッ     
         セージ待ち行列に対してだけ送ることができます。                       
     3.  エスケープ・メッセージを外部メッセージ待ち行列に送ることはできませ   
         ん。                                                                 
                                                                              
   表示される値は次の通りです。                                               
                                                                              
   *INFO                                                                      
       メッセージは通知メッセージとして送られます。                           
                                                                              
   *INQ                                                                       
       メッセージは照会メッセージとして送られます。                           
                                                                              
   *COMP                                                                      
       完了メッセージは呼出しメッセージ待ち行列に送られます。処理の状況を指   
       示する完了メッセージは正常に実行されました。                           
                                                                              
   *DIAG                                                                      
       診断メッセージは呼出しメッセージ待ち行列に送られます。このプログラム   
       によってエラー検出についての情報が診断メッセージに提供されます。エ     
       ラーは送り先,または実行中に要求した機能の間に起こったそれらのどちら   
       かです。エスケープまたは通知メッセージの受信プログラムまたは診断メッ   
       セージのプロシージャーをメッセージ待ち行列に送ります。                 
   *NOTIFY                                                                    
       通知例外メッセージは呼出しメッセージ待ち行列に送られます。通知メッ     
       セージの記述は訂正処置による条件について送り出しプログラムを実行させ   
       る前でなければなりません。応答メッセージは送信済みプログラムのうしろ   
       に送られます。後に訂正処置,実行中に再開される送信済みプログラム,お   
       よびメッセージ待ち行列から応答メッセージに受信されます。               
                                                                              
   *ESCAPE                                                                    
       エスケープ例外メッセージは呼出しメッセージ待ち行列に送られます。エス   
       ケープ・メッセージの記述は回復不能なエラー状態です。この送信されてい   
       るプログラムは実行に継続されません。                                   
                                                                              
   *RQS                                                                       
       要求メッセージは呼出しメッセージ待ち行列に送られます。要求メッセージ   
       に認可される装置ファイルから受信する要求データは別のプログラムまたは   
       プロシージャーにこのプログラムから渡されます。要求を送るためには,     
         MSG パラメーターによって指定された,即時メッセージを,使用しなけれ   
       ばなりません。                                                         
                                                                              
   *STATUS                                                                    
       状況例外メッセージは呼出しメッセージ待ち行列に送られます。状況メッ     
       セージは,送信元プログラムによって実行される作業の状況を説明します。   
         MSGDTA パラメーター中のメッセージデータの最初の 28 文字は,メッ      
       セージのモニター(メッセージ・モニター (MONMSG) コマンドによって確立   
       される)用の比較データとして使用されます。状況例外メッセージがモニ     
       ターされていない場合には,制御は送信元プログラムに戻されます。状況     
       メッセージが対話式ジョブの外部メッセージ待ち行列に送られた場合には,   
       そのメッセージは 24 行目に表示され,処理は続行されますが,応答は必要   
       ありません。                                                           
                                                                              
            注   メッセージ・テキストまたは   プロンプト( MSG パラメー      
           ター)が指定されている場合には,この値を指定することはできませ     
           ん。                                                                                        

全部で、8個のメッセージタイプが有りますね。

では、今度はMONMSGのMSGIDでF1を押してみましょう。

                             メッセージ・モニター  (MONMSG)                     
 
                    メッセージ識別コード  (MSGID) −ヘルプ                    
                                                                              
   このコマンドによりモニターする1つまたは複数のエスケープ・メッセージ通   
   知メッセージ,または状況メッセージのメッセージ識別コードを指定します。1   
   つのコマンドで,特定のメッセージ識別コードまたは総称メッセージ識別コード   
   を最大50個まで指定することができます。                                   
                                                                              
        注   多くの CL コマンドが多くの異なったエラー条件に対して1つのエ    
       スケープ・メッセージを出します。エラーまたは障害に関する詳細は,エス   
       ケープ・メッセージの前にある診断メッセージ中に指定されます。診断メッ   
       セージをモニターすることはできませんが,エスケープ・メッセージは,     
       ユーザーのメッセージ・モニターが活動化された後に,ジョブの外部メッ     
       セージ待ち行列からこれを受信することができます。                       
                                                                              
   メッセージ識別コードの最初の3文字は,1つの英字とそれに続く2つの英数字   
   (英字または数字)で構成されるコードでなければなりません。最後の4文字に   
   は, 10 進数字 0-9 および英字 A-F を使用することができます。               
        注   MCH コード (MCHNNNN) を使用するメッセージ識別コードでは,最後   
       の4桁に 0-9 の数値だけを使用します。                                  
                                                                              
   左端の2桁または4桁すべてにゼロを指定した( PPMM00 など)場合には,総称   
   メッセージ識別コードが指定されます。たとえば, CPF0000 が指定された場合    
   には,すべての CPF メッセージがモニターされます。                          
                                                                              
   メッセージがこのプログラムのメッセージ待ち行列に到着した時にモニターされ   
   る 1 - 50 のメッセージのメッセージ識別コードを指定します。 CL コマンドに   
   よって送信されるエスケープ,通知,および状況メッセージの識別コードは,     
     PROGRAMMING REFERENCE SUMMARY (SX41-5720) の資料に示されています。 CL    
     変数を使用してメッセージ識別コードを指定することはできません。           
                                                                              
   これは必須パラメーターです。                                               
   このパラメーターには複数個の値を入力することができます。入力画面を使用し   
   ていて,これらの複数個の値を入力するために追加の入力フィールドが必要であ   
   る場合には, " 続く場合には+ " の句の反対側の入力フィールドにプラス符号   
     (+) を入力して,実行キーを押してください。                               
                          

どうでしょう、たった3つのメッセージタイプだけしか監視出来ないのですね。

メッセージタイプ

MONMSG可能か否か

*INFO 通知メッセージ 又は 情報メッセージ 不可能
*INQ 照会メッセージ 不可能
*COMP 完了メッセージ 不可能
*DIAG 診断メッセージ 不可能
*NOTIFY 通知例外メッセージ 可能
*ESCAPE エスケープ例外メッセージ 可能
*RQS 要求メッセージ 不可能
*STATUS 状況例外メッセージ 可能

MONMSGの積極的な活用

たとえば、外サブを作ったときに、エラーを見付けたら、SNDPGMMSGで*ESCAPEで送ると、その外サブを呼び出したプログラムで、MONMSG出来るので、手軽なプログラム間の通信が出来ます。

  桁 . . . . . :    1  71            編集                        
 SEU==>                                                                PSE010CL 
0029.07                                                                         
0029.08 IF (&XFLC='*YES') DO                                                    
0029.09  CALL PSE100CL (&DTID &PGVR &ERR)                                       
0029.10   IF (&ERR='E') DO                                                      
0029.11       CHGVAR &MSGDTA (&DTID||&PGVR)                                     
0029.12       CALL #SRPOSMSGC ('B' 'POS9812' &MSGDTA)                           
0029.13            SNDPGMMSG  MSGID(POS9812) MSGF(QUSERMSG) +                   
0029.14                         MSGDTA(&DTID||&PGVR) MSGTYPE(*ESCAPE)           
0029.15       GOTO \END                                                         
0029.16   ENDDO                                                                 
0029.17 ENDDO                                                                   
0029.18                                                                         
0030.00                                                                         
0031.00 /* 変換元、変換先のファイル名 */                                        
0032.00                                                                         
0033.00   CHGVAR &FROMFILE  %SST(&FROM   1  10)                                 
0034.00   CHGVAR &FROMLIB   %SST(&FROM  11  10)                                 
0035.00   CHGVAR &TOFILE    %SST(&TO     1  10)                                 
0036.00   CHGVAR &TOLIB     %SST(&TO    11  10)                                 
0037.00                                                                         
0038.00   IF (&TOLIB='*LIBL')   RTVOBJD *LIBL/&TOFILE *FILE RTNLIB(&TOLIB)      
                                                                                                    

このプログラムはユーザー定義コマンドRTVMIDのCPPとすると、以下のように、このコマンドからのエラーメッセージをモニター出来るわけです。勿論、このプログラムを直接CALLしても同じようにエラーメッセージをモニター出来ます。エラーに応じて、様々なメッセージIDを準備すれば、MONMSGで様々な対応が可能となりますよね。

  桁 . . . . . :    1  71            編集                        
 SEU==>                                                                PSRA20CL 
0048.00              RTVMID     DATAID(RA) RTVVER(&PIPGVR) JCLMBR(&JCLMBR) +    
0049.00                           WRKFILE1(&WRKFILE1) WRKFILE2(&WRKFILE2) +     
0050.00                           OUTFILE(&OUTFILE) TFRFILE(&TFRFILE) +         
0051.00                           CTLNO(&CTLNO) PGM1(&PGM1) PGM2(&PGM2) +       
0052.00                           TEXT(&TEXT) FLG3(&Z1FLG3)                     
0053.00                                                                         
0054.00        MONMSG POS9800 *N  DO                                            
0055.00             CHGVAR &MSGDTA ('RA_'||&PIPGVR)                             
0056.00             CALL #SRPOSMSGC ('S' 'POS0014' &MSGDTA)                     
0057.00             CHGVAR &POSTS 'E'                                           
0058.00             GOTO \END                                                   
0059.00       ENDDO                                                   
0060.00                                                                         
0061.00   CHGVAR &MSGDTA &TEXT                                                  
0062.00   CALL #SRPOSMSGC ('S' 'POS0002' &MSGDTA)                               
0063.00                                                                         
                    

閑話休題

今回、このメッセージをオンラインのヘルプテキストから持ってきたのには、訳があります。日本語マニュアルの不備によるものなのです。

AS/400 アドバンスト・シリーズ CL(制御言語)プログラミング バージョン 3 資料番号 SC88-5498-00 より

8.2 CL プログラムからのメッセージの送信

CL プロシージャーまたは CL プログラムからのメッセージの送信には、プログラム・メッセージ送信 (SNDPGMMSG) コマンドまたはユーザー・メッセージ送信(SNDUSRMSG) コマンドを使用します。

SNDPGMMSG コマンドを使用すれば、以下のタイプのメッセージを送ることができます。

    通知
    照会
    完了
    診断
    要求
    エスケープ
    状況
    通知

同マニュアルより

8.3 CL プログラムまたは CL プロシージャーによるメッセージの監視

ユーザーの CL プロシージャーまたは CL プログラムの呼出しメッセージ待ち行列に送られてくるエスケープ、通知、および状況の各メッセージを、別のプロシージャーまたはプログラムのコマンドによって監視することができます。メッセージ監視 (MONMSG) コマンドは、そのコマンドに指定されている条件に応じて、呼出しメッセージ待ち行列に送られてくるメッセージを監視するためのものです。該当する条件が存在すれば、MONMSG コマンドで指定した CL コマンドが実行されます。MONMSG コマンドによる論理は以下のとおりです。

エスケープ・メッセージ: エスケープ・メッセージは、送信側の処置を打ち切らせるような状態が生じたことを、ユーザーのプロシージャーまたはプログラムに知らせるために送られます。エスケープ・メッセージを監視して、修正処置または終結処置を行った上で、プロシージャーまたはプログラムを終了させることができます。

状況メッセージと通知メッセージ: 状況メッセージおよび通知メッセージは、送り出し側の処置を打ち切らなければならないほど重大ではない異常事態を、ユーザーのプロシージャーまたはプログラムに知らせるために送られます。状況メッセージまたは通知メッセージを監視して、ユーザーのプロシージャーまたはプログラムがこのような状態を検出して機能の続行を中止するようにできます。

さあて、この「通知メッセージ」は、*INFOか*NOTYFYどちらでしょう?

英語版の同じ部分を見ると分かります。

8.2 Sending Messages from a CL Program

Use the Send Program Message (SNDPGMMSG) command or the Send User Message(SNDUSRMSG) command to send a message from a CL procedure or program.

Using the SNDPGMMSG command, you can send the following types of messages:

 Informational
 Inquiry
 Completion
 Diagnostic
 Request
 Escape
 Status
 Notify

ちゃんと、InformationalとNotifyに分かれていますね。

8.3 Monitoring for Messages in a CL Program or Procedure

You can monitor for escape, notify, and status messages that are sent to your CL procedure's or program's call message queue by the commands in your procedure or program or by commands in another procedure or program.
The Monitor Message (MONMSG) command monitors the messages sent to the call message queue for the conditions specified in the command. If the condition exists, the CL command specified on the MONMSG command is run.
The logic involved with the MONMSG command is as follows:

Escape Messages: Escape messages are sent to tell your procedure or program of an error condition that forced the sender to end. By monitoring for escape messages, you can take corrective actions or clean up and end your procedure or program.

Status or Notify Messages: Status and notify messages are sent to tell your procedure or program of an abnormal condition that is not serious enough for the sender to end. By monitoring for status or notify messages, your procedure or program can detect this condition and not allow the function to continue.

そうです。通知メッセージとは、この場合、Notifyの事でした。オンラインヘルプでは、「通知例外メッセージ」と訳しているようです。「*INFO」を「情報メッセージ」と言わないのは何ででしょう?確か、DSPMSGで出てきた、メッセージタイプは「情報」ではなかったかなぁ?後、どうもマニュアルの訳の中でも、「情報メッセージ」と言ったりする部分もあり、統一されていません。これは日本だけのことですね。変なの...

1999/8/28


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送