IBM i (旧AS400）の自己学習メモ０６　CLプログラム（Control Language） Part6　コンパイルエラー／実行時エラーの対処方法

# 自己学習メモインデックス

[IBM i (旧AS400）の自己学習メモ　インデックス](https://qiita.com/You_name_is_YU/items/3964849e7803c8eaf767)

# 概要

CLプログラム開発の勉強を進めていて、コンパイルをしたときや、CLプログラムの実行時にエラーが発生することは多々ありました。
エラーが発生したときに、どうやって対処するのがいいのか、いまいち分からず、参考としたプログラムとソースコードを比較して間違いを確認し、再度コンパイルして実行する。というようなことをしていました。
ただ、本来はちゃんとエラーメッセージを確認し、そのメッセージから原因を推察して対処するのがよろしいのかと。。。

ちゃんとエラーに対処する方法について、自分なりにまとめてみます。

# コンパイルエラー編

## コンパイルエラーとなるサンプル

このプログラム、どこがエラーの原因になるかわかりますか？

```shell
 FMT **  ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 0
        *************** Beginning of data ******************************************************************
0001.00              PGM                                                                                    
0002.00              DCL        VAR(&PRICE) TYPE(*DEC) LEN(10 0) VALUE(158)                                 
0003.00              DCL        VAR(&TAX) TYPE(*DEC) LEN(3 2) VALUE(0.10)                                   
0004.00              DCL        VAR(&AMOUNT) TYPE(*INT) LEN(10)                                             
0005.00 START:                                                                                              
0006.00              CHGVAR     VAR(&AMOUNT) VALUE(&PRICE + &PRICE * &TAX)                                  
0007.00              SNDPGMMSG  MSG('The calculation result is' *BCAT +                                     
0008.00                           %CHAR(&AMOUNT))                                                           
0009.00              RETURN                                                                                 
0010.00 END:                                                                                                
0011.00              ENDPGM                                                                                 
        ****************** End of data *********************************************************************
```

## コンパイルすると

14のコンパイルを実行すると、画面下部に`Program CLPGM15 not created.`というメッセージが。
コンパイルに失敗してCLPGM15のCLプログラムオブジェクトが生成できなかったということのようだ。

<img width="974" alt="スクリーンショット 2020-04-09 7.41.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/13435159-0a95-ad4b-0c6e-e9aa03f283af.png">

## 原因の確認方法

`Program CLPGM15 not created. `というメッセージだけでは何が原因なのかいまいちよくわかりません。
こんな場合どうするかというと
**メッセージにカーソルを合わせてF1キーを押下する**
ということをすると、エラーメッセージの詳細が確認できます。
![AS400-16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/e1c92ee2-3729-0019-0619-68bacfa34fc7.gif)

エラーメッセージの全文は以下の通り

```shell-session:エラーメッセージ
                        Additional Message Information                        
                                                                              
Message ID . . . . . . :   CPF0820       Severity . . . . . . . :   40        
Message type . . . . . :   Information                                        
Date sent  . . . . . . :   20-04-08      Time sent  . . . . . . :   22:36:47  
                                                                              
Message . . . . :   Program CLPGM15 not created.                              
Cause . . . . . :   Program CLPGM15 was not created in library YAMAGUCHI1     
  because of errors in compiling.  See messages in the computer printout of   
  the control language (CL) compiler and any previously listed messages.      
Recovery  . . . :   Correct the errors, then try the CRTBNDCL command again.  
  If your program uses the CALLPRC command to call another ILE procedure, you 
  may have to use the Create CL Module (CRTCLMOD) command instead of CRTBNDCL.
   Then use the Create Program (CRTPGM) command to create a program using the 
  module you created and the module containing the procedure that you want to 
  call.                                                                       
Technical description . . . . . . . . :   The Create Bound CL Program         
  (CRTBNDCL) command allows you to create with a single command an ILE CL     
                                                                              
  program which does not call any other ILE procedures. Using the Create CL   
  Module (CRTCLMOD) command followed by the Create Program (CRTPGM) command   
  will give you the same results. You must use CRTCLMOD and CRTPGM instead of 
  CRTBNDCL if you want to bind other ILE procedures with the CL module you are
  creating.                                                                   
```

ポイントは以下の部分（だと思われる）
スプールに出力（printout）されたCLコンパイラから出力されたメッセージを確認した方がいいよ。ということなのだと思います。

```
See messages in the computer printout of the control language (CL) compiler and any previously listed messages.
```

なので、以下のコマンドを実行してスプールを表示します。

```shell
wrkoutq yamaguchi
```

エラーとなったCLプログラムの名前と同じスプールファイルがあるので、OPTに5を指定してスプールの内容を確認します。
![AS400-17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/b0ebcc29-900b-08e2-3e40-4f2389e5c9df.gif)

スプールに出力されているメッセージ全文は以下の通り

```shell-session
*...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+....3
 5770SS1 V7R4M0  190621                  Control Language         YAMAGUCHI1/CLPGM15    PUB400 20-04-08 22:36:47         Page    1
 Program . . . . . . . . . . . . . . . . . . . :   CLPGM15                                                                        
   Library . . . . . . . . . . . . . . . . . . :     YAMAGUCHI1                                                                   
 Source file . . . . . . . . . . . . . . . . . :   QCLSRC                                                                         
   Library . . . . . . . . . . . . . . . . . . :     YAMAGUCHI1                                                                   
 Source member name  . . . . . . . . . . . . . :   CLPGM15   20-04-08 22:36:46                                                    
 Source printing options . . . . . . . . . . . :   *XREF  *NOSECLVL  *NOEVENTF  *NODOSLTLVL                                       
 User profile  . . . . . . . . . . . . . . . . :   *USER                                                                          
 Program logging . . . . . . . . . . . . . . . :   *JOB                                                                           
 Allow RTVCLSRC command  . . . . . . . . . . . :   *YES                                                                           
 Default activation group  . . . . . . . . . . :   *YES                                                                           
 Activation group  . . . . . . . . . . . . . . :                                                                                  
 Replace program . . . . . . . . . . . . . . . :   *NO                                                                            
 Target release  . . . . . . . . . . . . . . . :   V7R4M0                                                                         
 Authority . . . . . . . . . . . . . . . . . . :   *LIBCRTAUT                                                                     
 Sort sequence . . . . . . . . . . . . . . . . :   *HEX                                                                           
 Language identifier . . . . . . . . . . . . . :   *JOBRUN                                                                        
 Text  . . . . . . . . . . . . . . . . . . . . :   sample cl program07 int calc                                                   
 Optimization  . . . . . . . . . . . . . . . . :   *NONE                                                                          
 Debugging view  . . . . . . . . . . . . . . . :   *STMT                                                              
 Debug encryption key  . . . . . . . . . . . . :   *NONE                                                              
 Enable performance collection . . . . . . . . :   *PEP                                                               
 Storage model . . . . . . . . . . . . . . . . :   *SNGLVL                                                            
 Compiler  . . . . . . . . . . . . . . . . . . :   IBM Control Language Compiler                                      
                                      Control Language Source                                                         
 SEQNBR  *...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+.  DATE       
    100-              PGM                                                                                 20-04-05    
    200-              DCL        VAR(&PRICE) TYPE(*DEC) LEN(10 0) VALUE(158)                              20-04-05    
    300-              DCL        VAR(&TAX) TYPE(*DEC) LEN(3 2) VALUE(0.10)                                20-04-05    
    400-              DCL        VAR(&AMOUNT) TYPE(*INT) LEN(10)                                          20-04-08    
* CPD0306 40  Length specified not valid for integer variable.                                                        
    500- START:                                                                                           20-04-05    
    600-              CHGVAR     VAR(&AMOUNT) VALUE(&PRICE + &PRICE * &TAX)                               20-04-05    
* CPD0727 40  Variable &AMOUNT is referred to but not declared.                                                       
    700-              SNDPGMMSG  MSG('The calculation result is' *BCAT +                                  20-04-05    
    800                            %CHAR(&AMOUNT))                                                        20-04-05    
* CPD0727 40  Variable &AMOUNT is referred to but not declared.                                                       
    900-              RETURN                                                                              20-04-05    
   1000- END:                                                                                             20-04-05                
   1100-              ENDPGM                                                                              20-04-05                
                               * * * * *   E N D   O F   S O U R C E   * * * * *                                                  
                                                   ** WWW.PUB400.COM **                                                           
 5770SS1 V7R4M0  190621                  Control Language         YAMAGUCHI1/CLPGM15    PUB400 20-04-08 22:36:47         Page    2
                                          Cross Reference                                                                         
 Declared Variables                                                                                                               
 Name                        Defined     Type            Length      References                                                   
 &PRICE                         200      *DEC               10 0         600    600                                               
 &TAX                           300      *DEC                3 2         600                                                      
 Defined Labels                                                                                                                   
 Label            Defined     References                                                                                          
 END                1000                                                                                                          
 START               500                                                                                                          
                     * * * * *   E N D   O F   C R O S S   R E F E R E N C E   * * * * *                                          
                                                   ** WWW.PUB400.COM **                                                           
 5770SS1 V7R4M0  190621                  Control Language         YAMAGUCHI1/CLPGM15    PUB400 20-04-08 22:36:47         Page    3
                                          Message Summary                                                                         
               Severity                                                                                                           
 Total         0-9  10-19  20-29  30-39  40-49  50-59  60-69  70-79  80-89  90-99                        
      3          0      0      0      0      3      0      0      0      0      0                        
 Program CLPGM15 not created in library YAMAGUCHI1. Maximum error severity 40.                           
                               * * * * *   E N D   O F   M E S S A G E   S U M M A R Y   * * * * *       
                                 * * * * *   E N D   O F   C O M P I L A T I O N   * * * * *             
                                                   ** WWW.PUB400.COM **                                  
```

重要なエラーのポイントは以下の箇所

```shell-session
     400-              DCL        VAR(&AMOUNT) TYPE(*INT) LEN(10)   
 * CPD0306 40  Length specified not valid for integer variable.     
```

どうやらINT型では、Lengthを指定してはいけないようです。
この場合は、LEN(10)の部分を削除してコンパイルすることで正常にプログラムが動作するようになります。

**wrksplfコマンドでもエラーのスプール情報を確認することができます。**

# 実行時エラー編

## 実行時エラーとなるサンプル

QTEMP/SAMPLEファイルから、１レコードずつデータを読み込んで、４行のデータをコンソールに出力するというもの。
プログラム自体に誤りはなく、問題なくコンパイルできます。

```shell
 FMT **  ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 0
        *************** Beginning of data ******************************************************************
0001.00              PGM                                                                                    
0002.00              DCLF       FILE(QTEMP/SAMPLE)                                                          
0003.00              RCVF                                                                                   
0004.00              SNDPGMMSG  MSG(&SAMPLE)                                                                
0005.00              RCVF                                                                                   
0006.00              SNDPGMMSG  MSG(&SAMPLE)                                                                
0007.00              RCVF                                                                                   
0008.00              SNDPGMMSG  MSG(&SAMPLE)                                                                
0009.00              RCVF                                                                                   
0010.00              SNDPGMMSG  MSG(&SAMPLE)                                                                
0011.00              ENDPGM                                                                                 
        ****************** End of data *********************************************************************
```

## コンパイルして実行すると

実行するとエラーが発生するようにしてあったため、以下のようなメッセージが出力されます。

```
CPF0864 received by procedure CLPGM14. (C D I R) 
```

<img width="1088" alt="スクリーンショット 2020-04-09 8.02.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/533edae5-faf8-fce4-dce7-a26df2251ac8.png">

## 原因の確認方法

ここでも同じように、エラーメッセージにカーソルを合わせてF1キーを押下します。
![AS400-18.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/e7b47c38-58ad-1cf7-496d-aceffe25af91.gif)

エラーメッセージの全文は以下の通り
原因は、Causeに記載されている。

```
Message ID . . . . . . :   CPA0702       Severity . . . . . . . :   99        
Message type . . . . . :   Inquiry                                            
Date sent  . . . . . . :   20-04-08      Time sent  . . . . . . :   23:00:23  
                                                                              
Message . . . . :   CPF0864 received by procedure CLPGM14. (C D I R)          
Cause . . . . . :   ILE Control language (CL) procedure CLPGM14 in module     
  CLPGM14 in program CLPGM14 in library YAMAGUCHI1 detected an error at       
  statement number 0000000900.  Message text for CPF0864 is: End of file      
  detected for file SAMPLE in QTEMP.  Use F10 (if available) or the Display   
  Job Log (DSPJOBLOG) command to see the messages in the job log for a more   
  complete description of what caused the error.  If you still are unable to  
  solve the problem, please contact your technical support person.            
Recovery  . . . :   This inquiry message can be avoided by changing the       
  procedure. Monitor for the error (MONMSG command) and perform error recovery
  within the procedure.  To continue, choose a reply value.                   
Possible choices for replying to message . . . . . . . . . . . . . . . :      
                                                                    
  C -- Cancel the CL procedure.                                     
  D -- Dump the CL procedure variables and cancel the procedure.    
  I -- Ignore the failing command.                                  
  R -- Try the failing command again.                               
```

0009.00行目のソースコードでエラーが発生しているよ。というCause

```
detected an error at statement number 0000000900.
```

CPF0864のエラーコードは、QTEMP/SAMPLEファイルの終わりを検出したことを意味する。

```
CPF0864 is: End of file detected for file SAMPLE in QTEMP.
```

F10を押してDSPJOBLOGのメッセージを確認しなさいと言われる。

```
 Use F10 (if available) or the Display Job Log (DSPJOBLOG) command to see the messages in the job log 
```

F10キーを押下すると、次のようなメッセージが確認できる。
このメッセージを見ると、CLプログラムの１行ずつのプログラム実行が、どこまで正常に行えて、どこでエラーとなっているのかがわかりやすい。
このことからも、QTEMP/SAMPLEには３件しかデータがなく、４件目のデータを読み込もうとするRCVFコマンドの実行でエラーが発生しているということが分かる。

```
                             Display All Messages                             
                                                            System:   PUB400  
Job . . :   MAC_YAMA      User . . :   YAMAGUCHI     Number . . . :   942034  
                                                                              
5>> call clpgm14                                                              
       300 - RCVF DEV(*FILE) RCDFMT(*FILE) WAIT(*YES) OPNID(*NONE)          /*
      File name is QTEMP/SAMPLE. */                                           
       400 - SNDPGMMSG MSG('sample data 1')                                   
    sample data 1                                                             
       500 - RCVF DEV(*FILE) RCDFMT(*FILE) WAIT(*YES) OPNID(*NONE)          /*
      File name is QTEMP/SAMPLE. */                                           
       600 - SNDPGMMSG MSG('sample data 2')                                   
    sample data 2                                                             
       700 - RCVF DEV(*FILE) RCDFMT(*FILE) WAIT(*YES) OPNID(*NONE)          /*
      File name is QTEMP/SAMPLE. */                                           
       800 - SNDPGMMSG MSG('sample data 3')                                   
    sample data 3                                                             
       900 - RCVF DEV(*FILE) RCDFMT(*FILE) WAIT(*YES) OPNID(*NONE)          /*
      File name is QTEMP/SAMPLE. */                                        
    End of file detected for file SAMPLE in QTEMP.                         
    Function check. CPF0864 unmonitored by CLPGM14 at statement 0000000900,
      instruction X'0000'.                                                 
    CPF0864 received by procedure CLPGM14. (C D I R)                       
    CPF0864 received by procedure CLPGM14. (C D I R)                       
    Job 942034/YAMAGUCHI/MAC_YAMA changed by JOBMANAGER.                   
    Job 942034/YAMAGUCHI/MAC_YAMA changed by JOBMANAGER.                   
    Job 942034/YAMAGUCHI/MAC_YAMA changed by JOBMANAGER.                   
    Job 942034/YAMAGUCHI/MAC_YAMA changed by JOBMANAGER.                   
    Job 942034/YAMAGUCHI/MAC_YAMA changed by JOBMANAGER.                   
    Job 942034/YAMAGUCHI/MAC_YAMA changed by JOBMANAGER.                   
    Job 942034/YAMAGUCHI/MAC_YAMA changed by JOBMANAGER.                   
    Job 942034/YAMAGUCHI/MAC_YAMA changed by JOBMANAGER.                   
```