RPG

430. コンパイルで *SRCSTMT を指定しない場合は

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