7.70.3 MESSAGEの使用例
以下の例は、ユーザーの画面に表示されるテキスト・メッセージを発行する方法を示しています。
MESSAGE MSGTXT('Welcome to the LANSA system')
以下の例は、異常終了シーケンス中に複数のメッセージを発行する方法を示しています。
MESSAGE MSGTXT('=============================================')
MESSAGE MSGTXT('== EMPLOYEE DETAILS NOT FOUND IN PSLMST ==')
MESSAGE MSGTXT('=============================================')
MESSAGE MSGTXT('== FATAL ERROR - CONTACT YOUR SUPERVISOR ==')
ABORT MSGTXT('=============================================')
以下のサブルーチンは、関連する詳細がすべて含まれるメッセージを、メッセージの発行が必要になった時点で動的に構築する方法を示しています。
SUBROUTINE NAME(MESSAGE) PARMS((#MSGTXT1 *RECEIVED) (#MSGTXT2 *RECEIVED) (#MSGTXT3 *RECEIVED))
DEFINE FIELD(#MSGTXT1) TYPE(*CHAR) LENGTH(40) DECIMALS(0)
DEFINE FIELD(#MSGTXT2) REFFLD(#MSGTXT1)
DEFINE FIELD(#MSGTXT3) REFFLD(#MSGTXT1)
DEFINE FIELD(#MSGDTA) TYPE(*CHAR) LENGTH(132) DECIMALS(0)
USE BUILTIN(BCONCAT) WITH_ARGS(#MSGTXT1 #MSGTXT2 #MSGTXT3) TO_GET(#MSGDTA)
ABORT MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
ENDROUTINE
その後、以下のようにサブルーチンを使用してメッセージを発行できます。
EXECUTE SUBROUTINE(MESSAGE) WITH_PARMS('Details for employee' #EMPNO 'saved to file')
または、以下のようにメッセージを発行することもできます。
EXECUTE SUBROUTINE(MESSAGE) WITH_PARMS(#DEPTMENT ' department has been created' *BLANKS)
多言語アプリケーションでは、*MTXT変数をメッセージ・テキストとして含むエラー・メッセージを発行することが必要になる場合があります。以下のサブルーチンは、これを行う1つの方法です。
SUBROUTINE NAME(MTXTMESSGE) PARMS((#MSGDTA *RECEIVED))
DEFINE FIELD(#MSGDTA) TYPE(*CHAR) LENGTH(132) DECIMALS(0)
MESSAGE MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
ENDROUTINE
その後、以下のようにサブルーチンを使用してメッセージを送信できます。
EXECUTE SUBROUTINE(MTXTMESSGE) WITH_PARMS(*MTXTDEMEMPLO05501)
以下の例は、メッセージの文言をメッセージ・ファイルで定義し、必要な詳細をメッセージの発行時に変数として置換する方法を示しています。メッセージが以下のように定義されているとします。
メッセージ・ファイル: |
MYMSGF |
||||
メッセージID: |
MSG0002 |
||||
メッセージ・テキスト: |
'The salary for &1 &2 &3 is &4.' |
||||
変数 |
|||||
ラベル |
タイプ |
長さ |
小数点以下桁数 |
想定される内容 |
|
&1 |
*CHAR |
5 |
|
#EMPNO (従業員番号) |
|
&2 |
*CHAR |
20 |
|
#GIVENAME |
|
&3 |
*CHAR |
20 |
|
#SURNAME |
|
&4 |
*DEC |
11 |
2 |
#SALARY |
この場合、メッセージを以下のように発行します。
GROUP_BY NAME(#XG_EMPLOY) FIELDS(#EMPNO #GIVENAME #SURNAME #SALARY)
REQUEST FIELDS(#EMPNO)
FETCH FIELDS(#XG_EMPLOY) FROM_FILE(PSLMST) WITH_KEY(#EMPNO)
IF_STATUS IS(*OKAY)
MESSAGE MSGID(MSG0002) MSGF(MYMSGF) MSGDTA(#XG_EMPLOY)
ELSE
MESSAGE MSGTXT('Details for employee can not be found')
ENDIF
以下の例は、メッセージを使用して、ユーザーに対して次に行うべき操作を指示し、プログラムが実行中の処理をユーザーに通知する方法を示しています。この例では、いくつかの入力指示を行ってから入力要求サイクルを開始し、さまざまな処理ステップを実行しながらそれをユーザーに通知して、最後に次の入力を要求する前に処理が完了したことをユーザーに通知します。
MESSAGE MSGTXT('Input instructions appear here. Press Enter')
BEGIN_LOOP
REQUEST FIELDS(#STD_TEXT)
MESSAGE MSGTXT('Processing Step 1. Please wait.') TYPE(*STATUS)
EXECUTE SUBROUTINE(WAIT)
MESSAGE MSGTXT('Processing Step 2. Please wait.') TYPE(*STATUS)
EXECUTE SUBROUTINE(WAIT)
MESSAGE MSGTXT('Processing Step 3. Please wait.') TYPE(*STATUS)
EXECUTE SUBROUTINE(WAIT)
MESSAGE MSGTXT('Processing has completed. Please input next')
END_LOOP
SUBROUTINE NAME(WAIT)
BEGIN_LOOP TO(20000000)
END_LOOP
ENDROUTINE
*STATUSメッセージのTYPEパラメータを*INFOに変更した場合、処理が完了し、次のREQUESTコマンドが実行されるまでメッセージは表示されません。その後、メッセージは、次のREQUESTコマンドが実行されるまで表示されたままになります。
以下の例は、メッセージを使用して、変数とテキストを連結テキストに形式設定する方法を示しています。データ・タイプを変換したり、文字列を連結する必要はありません。以下のようにメッセージ定義が作成されています。
メッセージ・ファイル: |
MYMSGF |
|||||
メッセージID: |
MSG0004 |
|||||
メッセージ・テキスト: |
'The name of employee &1 is &2 &3.' |
|||||
変数 |
||||||
ラベル |
タイプ |
長さ |
小数点以下桁数 |
想定される内容 |
||
&1 |
*CHAR |
5 |
|
#EMPNO (従業員番号) |
||
&2 |
*CHAR |
20 |
|
#GIVENAME |
||
&3 |
*CHAR |
20 |
|
#SURNAME |
メッセージ・ファイル: |
MYMSGF |
|||||
メッセージID: |
MSG0005 |
|||||
メッセージ・テキスト: |
'The department and section of employee &1 is &2 &3.' |
|||||
変数 |
||||||
ラベル |
タイプ |
長さ |
小数点以下桁数 |
想定される内容 |
||
&1 |
*CHAR |
5 |
|
#EMPNO (従業員番号) |
||
&2 |
*CHAR |
20 |
|
#DEPTMENT |
||
&3 |
*CHAR |
20 |
|
#SECTION |
メッセージ・ファイル: |
MYMSGF |
|||||
メッセージID: |
MSG0006 |
|||||
メッセージ・テキスト: |
'The salary of employee &1 is &2.' |
|||||
変数 |
||||||
ラベル |
タイプ |
長さ |
小数点以下桁数 |
想定される内容 |
||
&1 |
*CHAR |
5 |
|
#EMPNO (従業員番号) |
||
&2 |
*DEC |
11 |
2 |
#SALARY |
この場合、これらのメッセージは適切な変数を使用して発行されます。サブルーチン内では、画面に表示されるブラウズ・リストにメッセージをコピーするため、またユーザーが希望した場合には印刷用のレポート行にコピーするために、GET_MESSAGES BIFが使用されています。
DEFINE FIELD(#PRINT) TYPE(*CHAR) LENGTH(1) LABEL('PRINT?') DEFAULT(N)
DEFINE FIELD(#EMPTXT) TYPE(*CHAR) LENGTH(78)
DEFINE FIELD(#RETCODE) TYPE(*CHAR) LENGTH(2)
DEF_LIST NAME(#EMPBROWSE) FIELDS(#EMPTXT)
DEF_LINE NAME(#EMPLOYEE) FIELDS(#EMPTXT)
REQUEST FIELDS(#PRINT)
CLR_LIST NAMED(#EMPBROWSE)
SELECT FIELDS(*ALL) FROM_FILE(PSLMST1)
MESSAGE MSGID(MSG0004) MSGF(MYMSGF) MSGDTA(#EMPNO #GIVENAME #SURNAME)
MESSAGE MSGID(MSG0005) MSGF(MYMSGF) MSGDTA(#EMPNO #DEPTMENT #SECTION)
MESSAGE MSGID(MSG0006) MSGF(MYMSGF) MSGDTA(#EMPNO #SALARY)
IF COND('#TERMDATE *NE 0')
MESSAGE MSGID(MSG0003) MSGF(MYMSGF) MSGDTA(#EMPNO #GIVENAME #SURNAME)
ENDIF
ENDSELECT
EXECUTE SUBROUTINE(SHOWMSGS)
DISPLAY BROWSELIST(#EMPBROWSE)
SUBROUTINE NAME(SHOWMSGS)
USE BUILTIN(GET_MESSAGE) TO_GET(#RETCODE #EMPTXT)
DOWHILE COND('#RETCODE = OK')
ADD_ENTRY TO_LIST(#EMPBROWSE)
IF COND('#PRINT *NE N')
PRINT LINE(#EMPLOYEE)
ENDIF
USE BUILTIN(GET_MESSAGE) TO_GET(#RETCODE #EMPTXT)
ENDWHILE
ENDROUTINE
メッセージ・ファイル内のメッセージの文言は、変更したり別の言語に翻訳したりすることが可能です。このとき、プログラムの変更や再コンパイルは必要ありません。