Files Involved
Physical file DEMNAME (demonstration name and address file) keyed by DEMNAC and an associated logical view called DEMNAMEN (keyed by DEMNAM).
|
RDML Program / Subroutine
The following program is intended to act as a "search" subroutine for any caller program.
It is not intended that it be invoked directly by a user. Any caller program that asks the user to specify a name and address "code" can call this subroutine to allow the user to search through the name and address file by customer name and select the one required.
The selected customer "code" and name are then exchanged back into the caller program's fields for subsequent processing.
The particularly useful thing about this program is that not only can it roll forwards a "page at a time", it can roll backwards a "page at a time" (even past the original starting point), and it allows the user to "jump around" anywhere in the file at any time.
********** Define work variables and constants
DEFINE #PAGESIZE REFFLD(#LISTCOUNT) DEFAULT(14)
DEFINE #LISTSIZE REFFLD(#LISTCOUNT)
DEFINE #WORKSIZE REFFLD(#LISTCOUNT)
DEFINE FIELD(#SEARCHNAM) REFFLD(#DEMNAM)
LABEL('Search for')
DEFINE FIELD(#TOPPAGNAM) REFFLD(#DEMNAM) DEFAULT(X'FF')
DEFINE FIELD(#BOTPAGNAM) REFFLD(#DEMNAM) DEFAULT(*BLANKS)
********** Define identical list to display and list to work with
DEF_LIST NAME(#LIST01) FIELDS((#SELECTOR
*SELECT)(#DEMNAC)(#DEMNAM)(#DEMAD1)(#DEMPCD))
COUNTER(#LISTSIZE)
DEF_LIST NAME(#WORK01)
FIELDS((#DEMNAC)(#DEMNAM)(#DEMAD1)(#DEMPCD))
COUNTER(#WORKSIZE) TYPE(*WORKING) ENTRYS(14)
********** Define a permanent exchange list and file open options
EXCHANGE FIELDS(#DEMNAC #DEMNAM) OPTION(*ALWAYS)
OPEN FILE(DEMNAMEN) USE_OPTION(*ONDEMAND)
********** Process search requests until a name is selected or
********** function key 24 is used to end the program
BEGIN_LOOP
REQUEST FIELDS((#SEARCHNAM)) BROWSELIST(#LIST01)
EXIT_KEY(*NO) MENU_KEY(*NO) USER_KEYS((*ROLLUP
'Up')(*ROLLDOWN 'Down') (24 'End'))
CASE OF_FIELD(#IO$KEY)
WHEN ('= UP') /* Roll up key */
EXECUTE ROLL (UP #BOTPAGNAM)
WHEN ('= DN') /* Roll down key */
EXECUTE ROLL (DOWN #TOPPAGNAM)
WHEN ('= ''24''') /* Fnc key 24 */
CHANGE FIELD(#DEMNAC) TO('''?''')
CHANGE FIELD(#DEMNAM) TO(*BLANKS)
RETURN
OTHERWISE /* Enter key */
SELECTLIST #LIST01 GET_ENTRYS(*SELECT)
RETURN
ENDSELECT
EXECUTE ROLL (UP #SEARCHNAM)
ENDCASE
END_LOOP
********** ROLL : Roll page backwards/forwards
********** DIRECTION : Direction to roll (UP/DN)
********** STARTNAM : Name at which to start roll
SUBROUTINE ROLL PARMS((#DIRECTION *RECEIVED)
(#STARTNAM *RECEIVED))
DEFINE FIELD(#DIRECTION) TYPE(*CHAR) LENGTH(4)
DEFINE FIELD(#STARTNAM) REFFLD(#DEMNAM)
CLR_LIST NAMED(#WORK01)
********* Handle a roll up request
IF COND('#DIRECTION = UP')
SELECT FIELDS((#WORK01)) FROM_FILE(DEMNAMEN)
WHERE('#WORKSIZE *LT #PAGESIZE')
WITH_KEY(#STARTNAM) OPTIONS(*STARTKEY
*ENDWHERE)
ADD_ENTRY TO_LIST(#WORK01)
ENDSELECT
********* Handle a roll down request
ELSE
SELECT FIELDS((#WORK01)) FROM_FILE(DEMNAMEN)
WHERE('#WORKSIZE *LT #PAGESIZE')
WITH_KEY(#STARTNAM)
OPTIONS(*STARTKEY *ENDWHERE *BACKWARDS)
ADD_ENTRY TO_LIST(#WORK01)
ENDSELECT
SORT_LIST NAMED(#WORK01) BY_FIELDS((#DEMNAM)) /* Important */
ENDIF
********* Map work list to browse list for display
CLR_LIST NAMED(#LIST01)
SELECTLIST NAMED(#WORK01)
ADD_ENTRY TO_LIST(#LIST01)
ENDSELECT
********* Set/save pointers to top and bottom of displayed page
IF COND('#WORKSIZE = 0')
CHANGE FIELD(#TOPPAGNAM) TO(X'FF')
CHANGE FIELD(#BOTPAGNAM) TO(*BLANKS)
MESSAGE MSGTXT('Search request is beyond start or end of names
file')
ELSE
GET_ENTRY NUMBER(1) FROM_LIST(#WORK01)
CHANGE FIELD(#TOPPAGNAM) TO(#DEMNAM)
GET_ENTRY NUMBER(#WORKSIZE) FROM_LIST(#WORK01)
CHANGE FIELD(#BOTPAGNAM) TO(#DEMNAM)
ENDIF
ENDROUTINE
The type of RDML program that calls this program would probably include code like this:
********* Ask user to input a customer name code
REQUEST FIELDS((#DEMNAC) .... etc, etc)
********* Validate name code (with optional search allowed)
BEGINCHECK
IF COND('#DEMNAC = ''?''')
CALL PROCESS(XXXXXXXXXX) FUNCTION(YYYYYYY)
ENDIF
FILECHECK FIELD(#DEMNAC) WITH_FILE(DEMNAME)
MSGTXT('No customer with name & address
code exists')
ENDCHECK
If the user enters a name and address code, it is immediately validated against file DEMNAME. If it is valid, the program continues. If it is not, control is returned to the REQUEST command and the error message appears.
If however, the user enters a "?" as the name and address code the previously described function is called. It allows the user to search the name and address file.
If the user selects a name the associated DEMNAC value is returned into this program, thus the FILECHECK will work.
If the user does not select a name (i.e.: uses function key 24 to end the search) the DEMNAC value returned into this program is a "?", which will cause the FILECHECK command to fail to find a record, thus triggering a validation error.