自己学習メモインデックス
概要
CLプログラム開発の勉強を進めていて、コンパイルをしたときや、CLプログラムの実行時にエラーが発生することは多々ありました。
エラーが発生したときに、どうやって対処するのがいいのか、いまいち分からず、参考としたプログラムとソースコードを比較して間違いを確認し、再度コンパイルして実行する。というようなことをしていました。
ただ、本来はちゃんとエラーメッセージを確認し、そのメッセージから原因を推察して対処するのがよろしいのかと。。。
ちゃんとエラーに対処する方法について、自分なりにまとめてみます。
コンパイルエラー編
コンパイルエラーとなるサンプル
このプログラム、どこがエラーの原因になるかわかりますか?
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プログラムオブジェクトが生成できなかったということのようだ。
原因の確認方法
Program CLPGM15 not created.
というメッセージだけでは何が原因なのかいまいちよくわかりません。
こんな場合どうするかというと
メッセージにカーソルを合わせてF1キーを押下する
ということをすると、エラーメッセージの詳細が確認できます。
エラーメッセージの全文は以下の通り
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.
なので、以下のコマンドを実行してスプールを表示します。
wrkoutq yamaguchi
エラーとなったCLプログラムの名前と同じスプールファイルがあるので、OPTに5を指定してスプールの内容を確認します。
スプールに出力されているメッセージ全文は以下の通り
*...+....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 **
重要なエラーのポイントは以下の箇所
400- DCL VAR(&AMOUNT) TYPE(*INT) LEN(10)
* CPD0306 40 Length specified not valid for integer variable.
どうやらINT型では、Lengthを指定してはいけないようです。
この場合は、LEN(10)の部分を削除してコンパイルすることで正常にプログラムが動作するようになります。
wrksplfコマンドでもエラーのスプール情報を確認することができます。
実行時エラー編
実行時エラーとなるサンプル
QTEMP/SAMPLEファイルから、1レコードずつデータを読み込んで、4行のデータをコンソールに出力するというもの。
プログラム自体に誤りはなく、問題なくコンパイルできます。
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)
原因の確認方法
ここでも同じように、エラーメッセージにカーソルを合わせてF1キーを押下します。
エラーメッセージの全文は以下の通り
原因は、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プログラムの1行ずつのプログラム実行が、どこまで正常に行えて、どこでエラーとなっているのかがわかりやすい。
このことからも、QTEMP/SAMPLEには3件しかデータがなく、4件目のデータを読み込もうとする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.