Creating the Function
The main module, cust_stub.4gl calls the library function
display_custarr, which uses a cursor with a FOREACH
statement to load rows from the customer table into a program array. The DISPLAY
ARRAY statement displays the records in the program array to the screen array
defined in the form specification file.
Program Arrays
A program array is an ordered set of elements all of the same data type. You can create one-, two-, or three-dimensional arrays. The elements of the array can be simple types or they can be records.
Arrays can be:
-
static - defined with an explicit size for all dimensions.
-
dynamic - has a variable size. Dynamic arrays have no theoretical size limit.
All elements of static arrays are initialized even if the array is not used. Therefore, defining huge static arrays may use a lot of memory. The elements of dynamic arrays are allocated automatically by the runtime system, as needed.
Example of a dynamic array of records definition:
01 DEFINE cust_arr DYNAMIC ARRAY OF RECORD
02 store_num LIKE customer.store_num,
03 city LIKE customer.city
04 END RECORD
This array variable is named cust_arr; each element of the array contains the
members store_num and city. The size of the array will
be determined by the runtime system, based on the program logic that is written to fill
the array. The first element of any array is indexed with subscript 1. You would access
the store_num member of the 10th element of the array by writing
cust_arr[10].store_num.
Loading the Array: the FOREACH Statement
The FOREACH statement is equivalent to using the
OPEN, FETCH and CLOSE statements to
retrieve and process all the rows selected by a query, and is especially useful when loading
arrays.
DECLARE
the cursor before the FOREACH statement can retrieve the rows.
01 DECLARE custlist_curs CURSOR FOR
02 SELECT store_num, city FROM customer
03 CALL cust_arr.clear()
04 FOREACH custlist_curs INTO cust_rec.*
05 CALL cust_arr.appendElement()
06 LET cust_arr[cust_arr.getLength()].* = cust_rec.*
07 END FOREACHThe FOREACH statement shown:
- Opens the
custlist_curscursor. - Clears the
cust_arrarray. - Fetches a row into the record
cust_rec. This record must be defined as having the same structure as a single element of thecust_arrarray (store_num,city). - Appends an empty element to the
cust_arrarray. - Copies the
cust_recrecord into the arraycust_arrusing thegetLengthmethod to determine the index of the element that was newly appended to the array. - Repeats steps 3, 4 and 5 until no more rows are retrieved from the database table (automatically
checks for the
NOTFOUNDcondition). - Closes the cursor and exits from the
FOREACHloop.