Page History
7.1.2 ABORT の使用例
ファンクションを打ち切って動的に構築されるテキストを表示する
ファンクションを打ち切って変数を置換したメッセージを表示する
...
| Anchor |
|---|
...
|
以下のコマンドは、ファンクションを打ち切ってエラー・メッセージを表示します。ABORT MSGTXT('Unable to locate system definition record')
ABORT MSGTXT('Unable to locate system definition record')| Anchor | ||||
|---|---|---|---|---|
|
以下のサブルーチンは、ABORT コマンドによって表示されるエラー・メッセージを動的に構築します。SUBROUTINE NAME
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
EXECUTE SUBROUTINE(ABORT)
...
WITH_PARMS('Employee'
...
#EMPNO 'not found')
...
または、以下のような状況でも使用できます。EXECUTE SUBROUTINE
EXECUTE SUBROUTINE(ABORT)
...
WITH_PARMS(
...
#DEPTMENT 'is invalid' *BLANKS)
...
| Anchor | ||||
|---|---|---|---|---|
|
打ち切りメッセージの文言をメッセージ・ファイルで定義し、詳細を致命的エラーの発生時に変数として置換することもできます。例えば、MYMSGF というメッセージ・ファイルが作成され、ID が MSG0001 のメッセージ定義がこのファイルに追加されているとします。一次レベルのメッセージ・テキストは、'社員 &1 &2 &3 の給与額 &4 が高すぎるため、この税額計算操作に該当しません。'です。また、メッセージ・データ・フィールド形式は以下のように定義されています。
- *CHAR 長さ 5
- *CHAR 長さ 20
- *CHAR 長さ 20
- *DEC 長さ 11 小数点以下桁数 2
この場合、abort は以下のようになります。DEFINE FIELD
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)
...
| Anchor | ||||
|---|---|---|---|---|
|
多言語アプリケーションでは、メッセージ・テキストに *MTXT 変数を含む致命的エラー・メッセージを発行することが必要になる場合があります。以下のサブルーチンは、その方法を示しています。SUBROUTINE NAME
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
EXECUTE SUBROUTINE(ABORT)
...
WITH_PARMS(*MTXTABORT_MESSAGE_1)
...
または、以下のようになります。EXECUTE SUBROUTINE
EXECUTE SUBROUTINE(ABORT)
...
WITH_PARMS(*MTXTABORT_EMPTY_FILE)
...
| Anchor | ||||
|---|---|---|---|---|
|
呼び出されたファンクションでの ABORT コマンドの実行は、以下のように呼び出しファンクションで検出してトラップできます。CALL PROCESS
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 パラメータ・ロジックをトリガーする理由は多数あります)。
[ |../../index.htm#lansa/abort_e.htm]