Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi/400】IBMiのメッセージファイルを利用する

ライブラリQSYSにあるオブジェクト(タイプが*MSGF)のメッセージファイルから、
IDを指定してメッセージをDelphi側で受け取ることができます。

Delphi/400のTCmd400コンポーネントは、
IBM i(AS/400)のコマンドを実行してその戻り値を受け取ることができます。
またコマンドRTVMSGはメッセージIDを指定すると、戻り値としてメッセージを返します。

実行する場合のロジックは次のようになります。
設計画面ではTCmd400コンポーネントのParamsプロパティで
メッセージ受取用に文字のパラメータ(文字132桁)を1つ用意します。
またTCmd400コンポーネントのAS400プロパティには、接続時のTAS400を指定して下さい。

//(ファイルQCPFMSGから、ID:CAE0002のメッセージをEditに表示する例)
AS4001.Connect;
Cmd4001.CommandLine.Text :=
    'RTVMSG MSGID(CAE0002) MSGF(QSYS/QCPFMSG) MSG(&P.1)';
Cmd4001.Execute;
Edit1.Text := Cmd4001.Value[0];

 
ここまでご紹介してきたロジックでは、
メッセージ内容は取得できますが、以下の課題や追加要望が出てくるかと思います。

  • メインのメッセージ内容(第1レベル・メッセージ・テキスト)以外にも情報を取得したい。
  • この方法だと置換変数(メッセージ内のパラメータ)が空で返るため、その部分も知りたい。
  • 目的のメッセージがどのメッセージファイル内に存在するか予め調べる手間がかかる。

 

新しいIBM i では「MESSAGE_FILE_DATA」というビューが追加されており、
ここからメッセージを参照することができます。
(V7R4以降、またはV7R3では「SF99703 Level 15」以降のPTF適用で対応)

ライブラリQSYS2に存在するMESSAGE_FILE_DATA(または省略名MSGF_DATA)を
SQLで参照することで、簡単にメッセージを参照することができ、上記の課題も解決できます。

MESSAGE_FILE_DATAからデータを参照する際は、
以下のようにSQLを記述します。

※使用しないフィールドはSELECT対象から除いても問題ありません。
※一部の文字フィールドはDelphi/400でそのまま取得できないため、CHARでキャストします。
※メッセージデータは、各パラメータや置換変数の型や桁数などの情報を保持しています。

SELECT
MSGF_LIB,                  /*メッセージファイルのライブラリ(MESSAGE_FILE_LIBRARY)*/
MSGF,                      /*メッセージファイル名(MESSAGE_FILE)*/
MSGID,                     /*メッセージID(MESSAGE_ID)*/
SEVERITY,                  /*重大度(SEVERITY)*/
CHAR(MSG_TEXT) AS MSGTXT,  /*第1レベル・メッセージ・テキスト(MESSAGE_TEXT)*/
CHAR(SECLVL) AS MSGSLT,    /*第2レベル・メッセージ・テキスト(MESSAGE_SECOND_LEVEL_TEXT)*/
MSGDATACNT,                /*メッセージデータの数(MESSAGE_DATA_COUNT)*/
CHAR(MSGDATA) AS MSGDTA    /*メッセージデータ情報(MESSAGE_DATA)*/

FROM QSYS2/MSGF_DATA
WHERE MSGF_LIB = 'QSYS'    /*ライブラリで絞り込み*/
AND MSGID = 'SQL0913'      /*メッセージIDで絞り込み*/

 

 

(ミガロ.情報マガジン「MIGARO News!!」Vol.123 2011年2月号より、SQL関連部分は新規加筆)