RPG

112. エラー・メッセージ表示のテクニック (1)

DSPF上でのエラー・メッセージの表示の方法についていくつか紹介する。
意外と多くの開発者が、ユーザー独自の通常のフィールドをメッセージ用に割り当てて
エラー・メッセージとして表示していることに驚く。
DSPFには非常に便利なメッセージの表示機能が提供されているのでこれを使わない手はない。
DSPF には ERRMSG, ERRMSGID, SFLMSG および SFLMSGID キーワードの4つが
用意されている。
SFLMSGKEY もあるが CLP などによる外部呼出しが必要となるので
使用はあまりお奨めできない。
DSPF のこれらのキーワードを使用する理由は、

ことが挙げられる。

まず最初にこれらのキーワードの基本的な使用方法を紹介して、
次に少し変わったメッセージの利用方法を次の章で紹介しよう。

【 ERRMSG の使い方 】

SFLMSG は 基本的には ERRMSGキーワードと同じ使用方法であるが
SFLMSGSFLCTLレコードにのみ定義する。

     A                                      MSGLOC(24)
     A          R DSPHEAD 
                   :
     A            JUDATE         6Y 0B  3 73TEXT(' 受注日 ')         
     A  64                                  ERRMSG(' 受注日の誤りです。' 64)

この例では標識 64*ON になって表示されるとエラー・メツセージは 24行目に表示されて
DSPF は入力禁止となる。
操作員がリセット・キーを押すと、

ERRMSG(' 受注日の誤りです。' 64) 

に標識 64 が記述されているので 標識 64 は、このリセット操作と同時に *OFF に設定される。
RPG で標識 64*OFF にする記述は必要でない。

【 ERRMSGID の使い方 】

SFLMSGID は 基本的には ERRMSGIDキーワードと同じ使用方法であるが
SFLMSGIDSFLCTLレコードにのみ定義する。

     A            JUDATE         6Y 0B  3 73TEXT(' 受注日 ')         
     A  64                                  ERRMSGID(MSG0007 MYLIB/MYMSGF 64)

この記述はライブラリー MYLIB のメッセージ・ファイル MYMSGF のメッセージ識別 MSG0007
エラー・メッセージとして出力することを意味している。
メッセージ・ファイルは CRTMSGF コマンドで作成して、WRKMSGD コマンドによって簡単に保守
することができる。
言語によっては OVRMSGF を使用すると日本語用のメッセージ・ファイルの使用と
英語のメッセージ・ファイルの使用を実行時に簡単に切り替えることができる。

メッセージ・ファイルの利点はまだある。
どうせなら「入力した xxxxx は正しくありません。」のように操作員の入力した値も
合わせて動的なメッセージとして表示すれば、よりわかりやすいものとなるであろう。
データ・ベースのフィールド値を表示してもよい。

     A            JUDATE         6Y 0B  3 73TEXT(' 受注日 ')         
     A  64                                  ERRMSGID(MSG0007 MYLIB/MYMSGF 64 &MSGDTA)
        :
     A            MSGDTA         6A  P

とすれば &MSGDTA をメッセージの中に埋め込むことができる。
メッセージは

     '入力した &N は正しくありません。' 

のように定義しておけばよい。

【 サブ・ファイル・レコードへのメッセージ 】

SFL に対するメッセージは SFLCTL レコード上に SFLMSG または SFLMSGID で定義
するとともにエラー行のフィールドを下記のように示す必要がある。

      A          R SFREC01                   SFL
                    :
      A            SHSCOD         4A  B  8 58TEXT(' 品種 コード')
      A  63                                  DSPATR(PC RI)     
                    :
      A          R SFCTL01                   SFLCTL(SFREC01)            
      A                                      TEXT(' SFLコントロール ')
                     :
      A  63                                  SFLMSG(' 品種 コード の誤りです。' 63)