So here’s a really simple little program that puts the first five characters of a ten character field into a five character field. So why doesn’t it work?
**Free
// Fun with variable length fields
ctl-opt dftactgrp(*no) actgrp(*new)
main(Main);
dcl-proc Main;
dcl-pi *n end-pi;
dcl-s LongString varchar(10) inz('123');
dcl-s ShortString char(5) inz;
shortstring = %subst(longstring: 1: 5);
dsply shortstring;
return;
end-proc;
If you compile and run this program, it will return an RNX0100 error: “Length or start position is out of range for the string operation”.
The reason, of course, is that LongString is a varying length field. The ten character length in the field definition defines the maximum size but, because the field is initialised with a three character value, the length of the field when the program starts is only three characters. And using the %subst bif to find the first five characters of a three character field will, of course, return an error.
The above program is so simple that the problem probably leapt out at you but when you are dealing with a bunch of externally defined fields, gotchas like this are less immediately apparent. So take this as a reminder to be wary of documentation and to familiarise yourself with the DSPFFD command.
