CL

66. ファイルの可変長フィールドを扱うには ?

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)

のように修正すればコンパイル・エラーは解消することができる。