「414.RPGでエラーのあった行№を表示するには」で
エラーが起こったソース行番号はコンパイル・オプションに
*SRCSTMT を指定するとソース行番号を取得することが
できることを説明した。

それでは*SRCSTMTを指定しないでコンパイルしたブログラムの
プログラム構造体には何が入るのかというと
コンパイル・リストのステートメント番号
が取得される。
従ってこれはこれで意味のあることでもある。
次のプログラムは*SRCSTMTが指定された場合と
指定さらなかった場合とでは結果の表示が異なるように
意図的に作成されたサンプルである。
[RPG: TESTERRM ]
ソースはこちらから
0001.00 H DFTNAME(TESTERRM) DFTACTGRP(*NO)
0002.00 H DEBUG(*YES)
0003.00 FJUCHU IF E K DISK
0004.00 FTOKMAS IF E K DISK
0005.00 * ex.
0006.00 * CALL TESTERRM ('AA' X'123F') -> success.
0007.00 * CALL TESTERRM ('AA' '123F') -> fail(Exception generating).
0008.00 *
0009.00 * Parameters for this program.
0010.00 D TESTERRM PR
0011.00 D P1 2
0012.00 D P2 3 0
0013.00 *
0014.00 D TESTERRM PI
0015.00 D P1 2
0016.00 D P2 3 0
0017.00 *
0018.00 * Parameters for Send Message.
0019.00 DSNDMSG pr
0020.00 D MSGTXTt 80 CONST
0021.00 *
0022.00 DMSG S 52 DIM(4) CTDATA PERRCD(1)
0023.00 DP2CHR S 3
0024.00 *
0025.00 * プログラム状況データ構造
0026.00 DExcpDs SDS
0027.00 D* ステートメント番号
0028.00 D* | CRTBNDRPG OPTION(*SRCSTMT) にするとソースと同じ行になる
0029.00 D STMT 21 28
0030.00 D* 例外タイプ (CPF または MCH)
0031.00 D excpType 40 42
0032.00 D* 例外番号 (CPF または MCH の下 4 桁の英数字 )
0033.00 D excpNum 43 46
0034.00 *
0035.00 /free
0036.00
0037.00 *INLR = *ON;
0038.00
0039.00 MONITOR;
0040.00 P2CHR = %CHAR(P2); // 数値を文字に
0041.00
0042.00 DSPLY P1;
0043.00 DSPLY P2CHR ;
0044.00
0045.00 DSPLY msg(1);
0046.00 //
0047.00 // Exception handling by Monitor.
0048.00 // エラー・コードは RPG 解説書を参照
0049.00 ON-ERROR;
0050.00
0051.00 SELECT;
0052.00 WHEN %STATUS = 222;
0053.00 DSPLY MSG(3);
0054.00 WHEN %STATUS = 907;
0055.00 DSPLY MSG(4);
0056.00 OTHER;
0057.00 DSPLY MSG(2);
0058.00 ENDSL;
0059.00
0060.00 CALLP SNDMSG('An error was ' +
0061.00 excpType +
0062.00 excpNum +
0063.00 '. Statement=' +
0064.00 stmt );
0065.00 ENDMON;
0066.00 RETURN;
0067.00 /END-FREE
0068.00
0069.00 *
0070.00 * メッセージ送信処理
0071.00 *
0072.00 PSNDMSG B
0073.00 DSNDMSG PI
0074.00 D INPTEXT 80 CONST
0075.00
0076.00 * Send message API parameters
0077.00 D MSGID s 7 INZ('CPF9898')
0078.00 D MSGFILLIB s 20 INZ('QCPFMSG *LIBL ')
0079.00 D MSGDATA s LIKE(INPTEXT)
0080.00 D MSGDATALEN s 10i 0 INZ(%SIZE(MSGDATA))
0081.00 D MSGTYPE s 10 INZ('*INFO')
0082.00 D MSGSTACKENT s 10 INZ('*')
0083.00 D MSGSTACKCNT s 10i 0 INZ(3)
0084.00 D MSGKEY s 4
0085.00 D MSGERRSTRUC s LIKE(ERRSTRUC)
0086.00
0087.00 * API error structure
0088.00 D ERRSTRUC DS INZ
0089.00 D ERRSSIZE 10i 0 INZ(%LEN(ERRSTRUC))
0090.00 D ERRSUSE 10i 0
0091.00 D ERRSMSGID 7
0092.00 D ERRSRESRV 1
0093.00 D ERRSDATA 80
0094.00
0095.00 C EVAL MSGData = INPTEXT
0096.00 C EVAL MSGERRSTRUC = ERRSTRUC
0097.00 *--------------------------------------------------------------
0098.00 C CALL 'QMHSNDPM'
0099.00 C PARM MSGID
0100.00 C PARM MSGFILLIB
0101.00 C PARM MSGDATA
0102.00 C PARM MSGDATALEN
0103.00 C PARM MSGTYPE
0104.00 C PARM MSGSTACKENT
0105.00 C PARM MSGSTACKCNT
0106.00 C PARM MSGKey
0107.00 C PARM MSGERRSTRUC
0108.00 *--------------------------------------------------------------
0109.00 C EVAL ERRSTRUC = MSGERRSTRUC
0110.00 P E
0111.00
0112.00 **
0113.00 状況 (00000): 正常終了。
0114.00 状況 (-----): 何らかのエラーあり。要デバッグ。
0115.00 状況 (00222): ポインターまたはパラメータのエラー
0116.00 状況 (00907): 10 進数エラーです。
[コンパイル]
CRTBNDRPG PGM(OBJLIB/TESTERRM) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
または
CRTBNDRPG PGM(TEST.COM/TESTERRM) SRCFILE(R610SRC/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) OPTION(*SRCSTMT) DBGVIEW(*SOURCE) AUT(*ALL)
として OPTION(*SRCSTMT) を指定する
[実行]
CALL PGM(TEST.COM/TESTERRM) PARM(‘AA’ X’123F’) で実行すると正常終了であるが
CALL PGM(TEST.COM/TESTERRM) PARM(‘AA’ ‘123F’) として実行すると
OPTION(*SRCSTMT) を指定しない場合は
CALL PGM(TEST.COM/TESTERRM) PARM('AA' '123F')
10 進数データ・エラー。
DSPLY 状況 (00907): 10 進数エラーです。
An error was MCH1202. Statement=00000076.
これはコンパイル・リストの
:
75 MONITOR;
76 P2CHR = %CHAR(P2); // 数値を文字に
77
78 DSPLY P1;
:
の
76 P2CHR = %CHAR(P2); // 数値を文字に
でエラーがあったことを示している。
OPTION(*SRCSTMT) を指定してコンパイルしてエラーを出力させると
CALL PGM(TEST.COM/TESTERRM) PARM('AA' '123F')
10 進数データ・エラー。
DSPLY 状況 (00907): 10 進数エラーです。
An error was MCH1202. Statement=00004000.
としてソース行番号 40.000 が表示される。

