FLENGTH( ) example
The following routine is used to read the data in a generated text file into the corresponding fields of a table. Character fields in the text file are the same length as in the table. Dates are formatted in six characters as MMDDYY (which matches the current SET DATE format). Numbers are always twelve characters and represent currency stored in cents, so it needs to be divided by 100.
function decodeLine( cLine, aDest )
#define YEAR_LEN 2
#define NUM_LEN 12
local nPtr, nFld, cFld, nLen
nPtr = 1 && Pointer into string
for nFld = 1 to fldcount( )
cFld = field( nFld ) && Store name of field in string variable for reuse
do case
case type( cFld ) == "C"
aDest[ nFld ] = substr( cLine, nPtr, flength( nFld ))
nPtr += flength( nFld )
case type( cFld ) == "D"
aDest[ nFld ] = ctod( substr( cLine, nPtr, 2 ) + "/" + ;
substr( cLine, nPtr + 2, 2 ) + "/" + ;
substr( cLine, nPtr + 4, YEAR_LEN ) )
nPtr += 2 + 2 + YEAR_LEN
case type( cFld ) == "N"
aDest[ nFld ] = val( substr( cLine, nPtr, NUM_LEN )) / 100
nPtr += NUM_LEN
endcase
endfor
An array is passed to the routine along with the line to read. The field values are stored in the array, which is appended to the table with APPEND FROM ARRAY in the calling routine (not shown here). The function defines some manifest constants for the size of a numeric field and whether the year is two or four digits in case this changes in the future. A FOR loop goes through each field in the table. The name of each field is stored in a variable for convenience; it’s used repeatedly in the DO CASE structure.