2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

V7R5新命令(SND-MSG

Last updated at Posted at 2023-12-19

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 の 実行結果

2023-12-07_191413.png

2023-12-07_195828.png

サブルーチン等の制作の際に、エラー等のハンドリングを RPG で直接出来るのは、わざわざ CL を介さなくて良いので、場面場面では良いシーンも有りそう。特に RPG でストアドプロシージャにしたのに、ジョブログだけ CL とかなっていた場面では良い感じ。
但し、処理が複雑なケースでは、単純にジョブログ・メッセージ以外のコマンド系・例外処理も他にあったりするので、何でもかんでも SDN-MSG を多用すると、RPG で行っているメッセージ処理と CL で行っている例外処理とが分断され、返って例外処理の見通しが悪くなる。
どんな事でもそうだが、道具は沢山あった方が便利だが、使い方が重要だと言うことだと思う。道具は上手に使いましょう。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?