RPG

422. 可変長フィールド VARYING とは

フィールド記述のオプションで VARYNG というオプションを
定義できるようになっているのをご存知だろうか?

例えば

 D FLD_VRY         S             26A   VARYING 

のような具合である。
VARYINGを指定するとこのフィールドは可変長フィールドとなる。

 D FLD_VRY         S          32767A   VARYING

というように定義可能な最大長 32767 バイト(最大ヒープ・メモリー・サイズ)
を定義しても実際に記憶域が占有されるのは指定された長さだけである。

[サンプルRPG : TESTVARY ]

ソースはこちらから

0001.00 H DFTNAME(TESTVARY) DATEDIT(*YMD/) BNDDIR('QC2LE')                      
0002.00 F********** TESTVARY: VARYING のテスト ******************************** 
0003.00 F*                                                                      
0004.00 F********************************************************************** 
0005.00                                                                         
0006.00  * CRTRPGMOD  OBJ(QTEMP/TESTVARY)   SRCFILE(R610SRC/QRPGLESRC)          
0007.00  * DBGVIEW(*SOURCE) AUT(*ALL)                                           
0008.00  * CRTPGM PGM(ASNET.COM/TESTVARY) MODULE(QTEMP/TESTVARY) ACTGRP(*NEW)   
0009.00  *        AUT(*ALL)                                                     
0010.00                                                                         
0011.00  *-------------------------------------------------------------------*  
0012.00  *  2021/05/01 : 作成                                                   
0013.00  *-------------------------------------------------------------------*  
0014.00  *( 作業変数 )                                                          
0015.00 D FLD             S             26A                                     
0016.00 D FLD_VRY         S             26A   VARYING                           
0017.00 D RES_1           S             32A                                     
0018.00 D RES_2           S             32A                                     
0019.00                                                                         
0020.00  /FREE                                                                  
0021.00    FLD      = 'TEST ABC';                                               
0022.00    FLD_VRY  = 'TEST ABC';                                               
0023.00    RES_1    = FLD;                                                      
0024.00    RES_2    = FLD_VRY;                                              
0025.00  /END-FREE                                                          
0026.00 C                   SETON                                        LR 
0027.00 C                   RETURN      


                                    

[コンパイル]

CRTBNDRPG PGM(OBJLIB/TESTVARY) SRCFILE(MYSRCLIB/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)

[解説]

デバッグしてステートメント 26.00 で停止して
EVAL で中身を確認すると
どちらも「TEST ABC」の値が入っていて同じである。
しかし HEX で確認すると
次のように異なることがわかる。

> EVAL FLD:X                                                            
     00000     E3C5E2E3 40C1C2C3 40404040 40404040   - TEST ABC         
     00010     40404040 40404040 ........ ........   -         ........ 
> EVAL FLD_VRY:X                                                        
     00000     0008E3C5 E2E340C1 C2C30000 00000000   - ..TEST ABC...... 
     00010     00000000 00000000 00000000 ........   - ................ 

ご覧のように FLD_VRY の戦闘2バイトには X’0008′ と2バイトのデータがある。
これはフィールドの長さを示している。
CLPに詳しい人ならよく理解できるはずであるが
CLPでよく使われているフィールド長を示す2バイトが先頭にあって
その後に実データの26バイトが続いていて合わせて28バイトの構成になっているみとが
わかる。
VARYING を定義するとこのような構成になることを理解しておけばよい。