Page History
...
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.
...
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 embedded 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