ファンクションを打ち切って動的に構築されるテキストを表示する
ファンクションを打ち切って変数を置換したメッセージを表示する
以下のコマンドは、ファンクションを打ち切ってエラー・メッセージを表示します。
ABORT MSGTXT('Unable to locate system definition record')
ファンクションを打ち切って動的に構築されるテキストを表示する
以下のサブルーチンは、ABORT コマンドによって表示されるエラー・メッセージを動的に構築します。
SUBROUTINE NAME(ABORT) 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(ABORT) WITH_PARMS('Employee' #EMPNO 'not found')
または、以下のような状況でも使用できます。
EXECUTE SUBROUTINE(ABORT) WITH_PARMS(#DEPTMENT 'is invalid' *BLANKS)
ファンクションを打ち切って変数を置換したメッセージを表示する
打ち切りメッセージの文言をメッセージ・ファイルで定義し、詳細を致命的エラーの発生時に変数として置換することもできます。例えば、MYMSGF というメッセージ・ファイルが作成され、ID が MSG0001 のメッセージ定義がこのファイルに追加されているとします。一次レベルのメッセージ・テキストは、'社員 &1 &2 &3 の給与額 &4 が高すぎるため、この税額計算操作に該当しません。'です。また、メッセージ・データ・フィールド形式は以下のように定義されています。
この場合、abort は以下のようになります。
DEFINE FIELD(#SALRY_CAP) REFFLD(#SALARY) EDIT_CODE(3) DEFAULT(0)
REQUEST FIELDS(#SALRY_CAP)
SELECT FIELDS(#EMPNO #GIVENAME #SURNAME #SALARY) FROM_FILE(PSLMST)
IF COND('#SALARY > #SALRY_CAP')
ABORT MSGID(MSG0001) MSGF(MYMSGF) MSGDTA(#EMPNO #GIVENAME #SURNAME #SALARY)
ENDIF
ENDSELECT
MESSAGE MSGTXT('All Employees are OK') TYPE(*WINDOW) LOCATE(*MIDDLE)
多言語アプリケーションでは、メッセージ・テキストに *MTXT 変数を含む致命的エラー・メッセージを発行することが必要になる場合があります。以下のサブルーチンは、その方法を示しています。
SUBROUTINE NAME(ABORT) PARMS((#MSGDTA *RECEIVED))
DEFINE FIELD(#MSGDTA) TYPE(*CHAR) LENGTH(132) DECIMALS(0)
ABORT MSGID(DCM9899) MSGF(DC@M01) MSGDTA(#MSGDTA)
ENDROUTINE
これは、以下のような致命的エラー状況で使用できます。
EXECUTE SUBROUTINE(ABORT) WITH_PARMS(*MTXTABORT_MESSAGE_1)
または、以下のようになります。
EXECUTE SUBROUTINE(ABORT) WITH_PARMS(*MTXTABORT_EMPTY_FILE)
呼び出されたファンクションでの ABORT コマンドの実行は、以下のように呼び出しファンクションで検出してトラップできます。
CALL PROCESS(*DIRECT) FUNCTION(MYFUNC) IF_ERROR(ERR)
RETURN
ERR: MESSAGE MSGTXT('MYFUNC has ended with in error') TYPE(*WINDOW)
RETURN
ファンクションMYFUNCが失敗した場合、制御は ERR ラベルに渡されます (ABORT コマンド以外にも、IF_ERROR パラメータ・ロジックをトリガーする理由は多数あります)。