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.