7.1.2 ABORTの使用例
ファンクションを打ち切って動的に構築されるテキストを表示する
ファンクションを打ち切って変数を置換したメッセージを表示する
以下のコマンドは、ファンクションを打ち切ってエラー・メッセージを表示します。
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が高すぎるため、この税額計算操作に該当しません。'です。また、メッセージ・データ・フィールド形式は以下のように定義されています。
· *CHAR 長さ5
· *CHAR 長さ20
· *CHAR 長さ20
· *DEC 長さ11 小数点以下桁数2
この場合、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パラメータ・ロジックをトリガーする理由は多数あります)。