フィールド記述のオプションで 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 を定義するとこのような構成になることを理解しておけばよい。
