Page History
A further improvement can be made by using "demand" subroutines that exactly emulate the FETCH commands. This could be done like this:
GROUP_BY NAME(#TRANS)
...
FIELDS(#TRANNUM #TRANDATE #TRANTIME
#TRANTYPE #TRANDESC #TRANUSER #TRANSTATE #STATDESC)
SELECT FIELDS(#TRANS)
...
FROM_FILE(TRANS)
EXECUTE SUBROUTINE(GET_STATE)
...
WITH_PARMS(#TRANSTATE)
EXECUTE SUBROUTINE(GET_TYPE) WITH_PARMS(#TRANTYPE)
UPRINT FIELDS(#TRANS)
ENDSELECT
...
SUBROUTINE NAME(GET_STATE)
...
PARMS((
...
#GETSTATE *RECEIVED))
DEFINE FIELD(#GETSTATE)
...
REFFLD(#STATCODE)
DEF_LIST NAME(#STATES)
...
FIELDS(#STATCODE #STATDESC)
TYPE(*WORKING)
...
ENTRYS(10)
LOC_ENTRY IN_LIST(#STATES)
...
WHERE('
...
#STATCODE =
...
#GETSTATE')
IF_STATUS IS_NOT(*OKAY)
FETCH FIELDS(#STATES)
...
FROM_FILE(STATES)
...
WITH_KEY(#GETSTATE)
ADD_ENTRY TO_LIST(#STATES)
ENDIF
ENDROUTINE
...
SUBROUTINE NAME(GET_TYPE)
...
PARMS((
...
#GETTYPE *RECEIVED))
DEFINE FIELD(#GETTYPE)
...
REFFLD(#TRANTYPE)
DEF_LIST NAME(#TRNTYP)
...
FIELDS(#TRANTYPE #TRANDESC)
TYPE(*WORKING)
...
ENTRYS(50)
LOC_ENTRY IN_LIST(#TRNTYP)
...
WHERE('
...
#TRANTYPE =
...
#GETTYPE')
IF_STATUS IS_NOT(*OKAY)
FETCH FIELDS(#TRNTYP)
...
FROM_FILE(TRNTYP)
...
WITH_KEY(#GETTYPE)
ADD_ENTRY TO_LIST(#TRNTYP)
ENDIF
ENDROUTINE
...
Since these subroutines are "demand" driven the number of I/Os done depends upon the number of different state and type codes found in the TRANS files.
If the TRANS file contained 3 different state codes and 5 different transaction types then in the case where 10,000 TRANS records were processed the RDML program would do (10,000 + 3 + 5) = 10,008 database accesses. This is a net saving of 19,992 I/Os. This version of the program would probably run in about 1/3 of the time of the original version.