「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 が表示される。