Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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.