7.88.3 MESSAGE の使用例

プレーン・テキスト・メッセージを発行する

異常終了中に複数のメッセージを発行する

動的に構築されるテキストを含むメッセージを発行する

*MTXT変数のテキストを含むメッセージを発行する

代替変数を含むメッセージを発行する

メッセージを使用してユーザーに指示と通知を行う

メッセージを使用してテキストの形式設定を行う

プレーン・テキスト・メッセージを発行する

以下の例は、ユーザーの画面に表示されるテキスト・メッセージを発行する方法を示しています。

 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変数のテキストを含むメッセージを発行する

多言語アプリケーションでは、*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 
 

メッセージ・ファイル内のメッセージの文言は、変更したり別の言語に翻訳したりすることが可能です。このとき、プログラムの変更や再コンパイルは必要ありません。