V7R5での変更点 に掲載されいている、新命令 SND-MSG(%MSG,%TARGET) を紹介。(※但しこの機能は下位バージョンでもPTFを導入する事により利用可能な場合があり)
概略
新命令 SND-MSG
で何が出来るのか?
簡単に言うと「RPGプログラムの内部から直接、ジョブログへ通知、例外メッセージを送信する事が出来る」 様になった。
これまでは、RPG からCLに何ら頭のパラメータを返して、CLにジョブログ・メッセージのハンドリングをさせる形だったが、それを 直接RPGが行う事が出来る ようになったと思えば良いだろう。
- 従来:RPG → CL → メッセージ送信
- 新:RPG → メッセージ送信
の形にプログラムを出来る。
使い方
使い方は、以下の①~④の項目からなる
① 命令:SND-MSG
② メッセージタイプ: *INFO(省略)
or *ESCAPE
③ メッセージ: 固定メッセージ値
or %MSG('メッセージID' ,'メッセージ ファイル' ,'メッセージ データ' ,...)
④ 送信対象:未指定=直前の呼出元
or %TARGET(*SELF|*CALLER:n|etc...)
③の %MSG
IBMi 任意のメッセージ・ファイルよりメッセージを設定する事が出来る、組込み関数となり、④の %TARGET
はメッセージ送信対象を指定する事が出来る。
サンプルコードでは *SELF
で実行プログラム自身へメッセージを送信し、例外メッセージを自身で MONITOR
しキャッチしている。もちろん例外メッセージの内容はジョブログに残っている。
また %MSG
でメッセージIDが存在しない場合は、エラーコード 126
で監視することも出来る。
コードサンプル抜粋
//情報メッセージ(*INFO
W#CNT1 += 1 ;
W#MSG1 = '(' + %EDITC(W#CNT1:'X') + ')'
+ 'メッセージ*INFO(暗黙的'
;
SND-MSG W#MSG1 ;
~~~
//%MSG…MSGFの取得
W#CNT1 += 1 ;
W#MSG1 = '(' + %EDITC(W#CNT1:'X') + ')'
+ 'メッセージ*ESCAPE(%MSG'
;
MONITOR ;
W#MID = 'CPF9897' ;
//W#MID = 'XXXXXXX' ;
SND-MSG *ESCAPE
%MSG(W#MID : '*LIBL/QCPFMSG' :W#MSG1 )
%TARGET(*SELF) ;
ON-ERROR 126 ;
W#MSG2 = 'そんなMSGIDはないぜよ' ;
DSPLY W#MSG2 ;
ON-ERROR 9999 ;
W#MSG2 = W#MSG1 ;
DSPLY W#MSG2 ;
ENDMON ;
結果、感想
以下が CALL Q231220R1
の 実行結果
サブルーチン等の制作の際に、エラー等のハンドリングを RPG で直接出来るのは、わざわざ CL を介さなくて良いので、場面場面では良いシーンも有りそう。特に RPG でストアドプロシージャにしたのに、ジョブログだけ CL とかなっていた場面では良い感じ。
但し、処理が複雑なケースでは、単純にジョブログ・メッセージ以外のコマンド系・例外処理も他にあったりするので、何でもかんでも SDN-MSG
を多用すると、RPG で行っているメッセージ処理と CL で行っている例外処理とが分断され、返って例外処理の見通しが悪くなる。
どんな事でもそうだが、道具は沢山あった方が便利だが、使い方が重要だと言うことだと思う。道具は上手に使いましょう。