7.20.3 DEF_ARRAY Examples
These examples apply to the DEF_ARRAY command.
Example 1: The data dictionary contains 3 packed decimal fields of length 7 with 2 decimals called VAL01, VAL02 and VAL03.
Group them all into an array called #VAL that will be indexed by field #II:
DEF_ARRAY NAME(#VAL) INDEXES(#II) OF_FIELDS(#VAL01 #VAL02 #VAL03)
Example 2: Using array #VAL, request that the user inputs all 3 values, then check that they are all in the range 7 to 42:
DEF_ARRAY NAME(#VAL) INDEXES(#II) OF_FIELDS(#VAL01 #VAL02 #VAL03)
REQUEST FIELDS(#VAL01 #VAL02 #VAL03)
BEGINCHECK
BEGIN_LOOP FROM(1) TO(3) USING(#II)
RANGECHECK FIELD(#VAL#II) RANGE((7 42))
END_LOOP
ENDCHECK
The example demonstrates how the data validation commands VALUECHECK, RANGECHECK, FILECHECK, DATECHECK, CONDCHECK, CALLCHECK and SET_ERROR not only set an error for the array entry (#VAL#II) but also for the underlying field #VAL01, #VAL02 or #VAL03 (depending on the current value of #II).
Example 3: Using array #VAL, request the user inputs all 3 values, increment all values by 10 % and show the total to the user:
DEF_ARRAY NAME(#VAL) INDEXES(#II) OF_FIELDS(#VAL01 #VAL02 #VAL03)
REQUEST FIELDS(#VAL01 #VAL02 #VAL03)
CHANGE FIELD(#RESULT) TO(0)
BEGIN_LOOP FROM(1) TO(3) USING(#II)
CHANGE FIELD(#VAL#II) TO('#VAL#II * 1.10')
CHANGE FIELD(#RESULT) TO('#RESULT + #VAL#II')
END_LOOP
DISPLAY FIELDS(#RESULT)
Example 4: The data dictionary contains an alphanumeric field of length 50 called #LIBLST. It is actually an "array" of up to 5 library names stored in one long field.
Define an array so that individual library names within it can be easily referenced:
DEF_ARRAY NAME(#LIB) TYPE(*CHAR) TOT_ENTRY(5) ENTRY_LEN(10) INDEXES(#JJ) OVERLAYING(#LIBLST 1)
Example 5: Write a program so that field #LIBLST can be fetched from file USERDET, displayed on the screen as 5 separate fields, validated, and then updated back into the database:
DEF_ARRAY NAME(#LIB) TYPE(*CHAR) TOT_ENTRY(5) ENTRY_LEN(10) INDEXES(#JJ) OVERLAYING(#LIBLST 1)
DEFINE FIELD(#LIB01) TYPE(*CHAR) LENGTH(10) TO_OVERLAY(#LIBLST 1)
DEFINE FIELD(#LIB02) REFFLD(#LIB01) TO_OVERLAY(#LIBLST 11)
DEFINE FIELD(#LIB03) REFFLD(#LIB01) TO_OVERLAY(#LIBLST 21)
DEFINE FIELD(#LIB04) REFFLD(#LIB01) TO_OVERLAY(#LIBLST 31)
DEFINE FIELD(#LIB05) REFFLD(#LIB01) TO_OVERLAY(#LIBLST 41)
DEFINE FIELD(#LIBWRK) REFFLD(#LIB01)
FETCH FIELDS(#LIBLST) FROM_FILE(USERDET) WITH_KEY(*USER)
REQUEST FIELDS(#LIB01 #LIB02 #LIB03 #LIB04 #LIB05)
BEGINCHECK
BEGIN_LOOP FROM(1) TO(5) USING(#JJ)
IF COND('#LIB#JJ *NE *BLANKS')
CHANGE FIELD(#LIBWRK) TO(#LIB#JJ)
EXEC_OS400 COMMAND('CHKOBJ QSYS/#LIBWRK *LIB') IF_ERROR(L10)
GOTO L20
L10: SET_ERROR FOR_FIELD(#LIB#JJ)
L20: ENDIF
END_LOOP
ENDCHECK
UPDATE FIELDS(#LIBLST) IN_FILE(USERDET)
You can see from this example that there would have been less code in the program if field #LIBLST in file USERDET had actually been defined in the file as five fields called #LIB01 -> #LIB05.
You will also note that EXEC_OS400 is one of the very few commands that will not accept indexed field references, which is why the work field #LIBWRK is required.
Example 6: Write a program so that field #LIBLST can be fetched from file USERDET and then printed on a report as one column:
DEF_ARRAY NAME(#LIB) TYPE(*CHAR) TOT_ENTRY(5) ENTRY_LEN(10) INDEXES(#JJ) OVERLAYING(#LIBLST 1)
OVERRIDE FIELD(#LIB#JJ) COLHDG('Library' 'Names')
DEF_LINE NAME(#LINE01) FIELDS(#LIB#JJ)
FETCH FIELDS(#LIBLST) FROM_FILE(USERDET) WITH_KEY(*USER)
BEGIN_LOOP FROM(1) TO(5) USING(#JJ)
IF COND('#LIB#JJ *NE *BLANKS')
PRINT LINE(#LINE01)
ENDIF
END_LOOP
ENDPRINT
Example 7: A SALES file contains one field called SALDATA that consists of MONTHS (as a 12 * character (2) array), and then EXPECTED SALES and ACTUAL SALES (as two separate 12 * packed decimal (7,2) decimal arrays).
Define arrays that will allow indexed references to any component of the 3 arrays imbedded in this large field.
DEF_ARRAY NAME(#MTH) TYPE(*CHAR) TOT_ENTRY(12) ENTRY_LEN(2) INDEXES(#II) OVERLAYING(#SALDATA 1)
DEF_ARRAY NAME(#EXP) TYPE(*DEC) TOT_ENTRY(12) ENTRY_LEN(7) ENTRY_DEC(2) INDEXES(#II) OVERLAYING(#SALDATA 25)
DEF_ARRAY NAME(#ACT) TYPE(*DEC) TOT_ENTRY(12) ENTRY_LEN(7) ENTRY_DEC(2) INDEXES(#II) OVERLAYING(#SALDATA 73)
Example 8: Using the file from example 7, print all records from the file in columns and produce grand totals:
DEF_ARRAY NAME(#MTH) TYPE(*CHAR) TOT_ENTRY(12) ENTRY_LEN(2) INDEXES(#II) OVERLAYING(#SALDATA 1)
OVERRIDE FIELD(#MTH#II) COLHDG('Month')
DEF_ARRAY NAME(#EXP) TYPE(*DEC) TOT_ENTRY(12) ENTRY_LEN(7) ENTRY_DEC(2) INDEXES(#II) OVERLAYING(#SALDATA 25)
OVERRIDE FIELD(#EXP#II) COLHDG('Expected' 'Sales') EDIT_CODE(3)
DEF_ARRAY NAME(#ACT) TYPE(*DEC) TOT_ENTRY(12) ENTRY_LEN(7) ENTRY_DEC(2) INDEXES(#II) OVERLAYING(#SALDATA 73)
OVERRIDE FIELD(#ACT#II) COLHDG('Actual' 'Sales') EDIT_CODE(3)
DEF_LINE NAME(#SALES) FIELDS(#MTH#II #EXP#II #ACT#II)
DEFINE FIELD(#EXP_TOT) REFFLD(#EXP#II) LABEL('Total Expected')
DEFINE FIELD(#ACT_TOT) REFFLD(#ACT#II) LABEL('Total Actual')
DEF_BREAK NAME(#TOTAL) FIELDS(#EXP_TOT #ACT_TOT)
SELECT FIELDS(#SALDATA) FROM_FILE(SALES)
BEGIN_LOOP FROM(1) TO(12) USING(#II)
KEEP_TOTAL OF_FIELD(#EXP#II) IN_FIELD(#EXP_TOT)
KEEP_TOTAL OF_FIELD(#ACT#II) IN_FIELD(#ACT_TOT)
PRINT LINE(#SALES)
END_LOOP
ENDSELECT
ENDPRINT
* automatically prints grand total lines