i5/OS で提供されるファイルを扱っていると、たまに可変長フィールドが定義されている。
例えば、次の例はジョブログをファイルとして QTEMP に出力して、そのファイルの中から
「受信プロシージャー名」を CLP の変数 &PROC に入れるものである。
ソースコード
-------------------------------------------------------------------------------- 0001.00 PGM 0002.00 /*---------------------------------------------------------*/ 0003.00 /* TESTVAR : 可変長フィールドの DCLF */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0006.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0007.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0008.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0011.00 DCL VAR(&PROC) TYPE(*CHAR) LEN(256) 0012.00 DCLF FILE(QTEMP/JOBLOG) 0013.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0014.00 0015.00 DSPJOBLOG JOB(*) OUTPUT(*OUTFILE) + 0016.00 OUTFILE(QTEMP/JOBLOG) OUTMBR(*FIRST *REPLACE) 0017.00 READ: RCVF RCDFMT(QMHPFT) 0018.00 MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(REDEND)) 0019.00 CHGVAR VAR(&PROC) VALUE(&QMHSPR) 0020.00 GOTO READ 0021.00 REDEND: 0022.00 0023.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 024.00 MSGDTA(&MSGDTA) MSGF(&MSGF) MSGFLIB(&MSGFLIB) 025.00 SNDMSG: 026.00 IF COND(&TYPE *EQ '0') THEN(DO) 027.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP) 028.00 ENDDO 029.00 ELSE CMD(DO) 030.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 031.00 MSGDTA(&MSGDTA) TOPGMQ(*PRV) + 032.00 TOMSGQ(*TOPGMQ) MSGTYPE(*ESCAPE) 033.00 ENDDO 034.00 ENDPGM ---------------------------------------------------------------------------------
ところが、この CLP をコンパイルしてみると
「* CPI0300 10 文字 CL 変数が可変長フィールド &QMHSPR として宣言されている。」
との警告メッセージとともに
「* CPD085A 40 変数 &QMHSPR に可変長フィールドを使用することはできない。」
との意味不明なエラー・メッセージが出力されてコンパイルは失敗する。
一体、このエラー・メッセージの原因は何であろうか ?
またどのようにして回避すればよいのだろうか ?
それは DCL で可変長フィールドの使用を宣言していないからである。
のようにして DCLF 文を
DCLF FILE(QTEMP/JOBLOG) ALWVARLEN(*YES)
のように修正すればコンパイル・エラーは解消することができる。