* Define the CUST file with file type U for UPDATE
* (update means that you can read and re-write data)
* and with record address type K for Keyed.
* (Keyed means the data can be directly read using the key field)
FCUST UF E K DISK
* Next, define the display file. It must already exist.
* The C indicates combined input and output. WORKSTN is
* always used to indicate a display file.
FTUTD010 CF E WORKSTN
*----------------------------------------------------------------
D* This next few statements define constants that will be used
D* as error messages.
D ERR1 C CONST('You must enter A, C,-
D or D')
D ERR2 C CONST('Customer # is not fo-
D und')
D ERR3 C CONST('Name cannot be blank')
D ERR4 C CONST('Addr cannot be blank')
D ERR5 C CONST('City cannot be blank')
D ERR6 C CONST('State cannot be blan-
D k')
D ERR7 C CONST('Zip is invalid')
*----------------------------------------------------------------
C* This is the main loop.
C* It will continue to show the first screen until F3 is pressed.
C* When F3 is pressed, *IN03 will be truned *ON
C DoW *in03 = *off
C* The next statement, executes the format (EXFMT) for SCRN1
C* EXFMT displays the SCRN1 and waits until the user presses
C* ENTER or F3. Then, it continues to the next statement.
C ExFmt SCRN1
C* If F3 was pressed, *IN03 will be *ON so the IF will go to
C* ENDIF and the DO will go to ENDDO.
C If *in03 = *off
C* EXSR is Execute Subroutine. It will process the subroutine
C* named MAIN.
C ExSr Main
C EndIf
C EndDo
C* The next 2 statments end the program.
C Eval *inlr = *on
C Return
C*----------------------------------------------------------------
C* Subroutines begin with BEGSR and end with ENDSR.
C*
C Main BegSr
C* Use the CHAIN instruction to look for the Cust# entered in
C* the field DSPCST.
C* This statements says to use the value in DSPACT to look up
C* the value in CUST and to turn *IN90 to *ON if it is NOT found.
C DSPCST Chain CUST 95
C*
C Eval DSPMSG = *blanks
C Eval *in90 = *off
C*
C* Because this will eventually test for Add, Chg, Delete
C* use the SELECT instead of IF.
C Select
C When DSPACT = 'C'
C* If user wants to Change the record but it was not found,
C* show error message. Otherwise Execute Subroutine to change it.
C If *in95 = *on
C Eval DSPMSG = ERR2
C Eval *in90 = *on
C Else
C ExSr ChangeRecord
C EndIf
C*
C Other
C Eval DSPMSG = ERR1
C* Setting *IN90 to *ON will cause the error message to be
C* displayed in reverse image (see the DDS for DSPMSG).
C Eval *in90 = *on
C EndSl
C*
C EndSr
C*----------------------------------------------------------------
C ChangeRecord BegSr
C*
C*
C* Show SCRN2. The values will be loaded from the CHAIN.
C* Continue showing SCRN2 until either F12 is pressed or
C* the data entered is OK. The subroutine EDITVALUES will put
C* a message in DSPMSG if there is an error. If DSPMSG is
C* still blank after EDITVALUES, then data is OK.
C*
C* This starts a DO loop that will continue to loop
C* Until DSPMSG is not blank OR *IN12 is *ON.
C DoU DSPMSG = *BLANKS or
C *in12 = *on
C ExFmt SCRN2
C* If the user hits F12 do not process,
C* otherwise, Edit the values to see if they are OK.
C If *in12 = *off
C ExSr EditValues
C* If there are no errors, update the record. The UPDATE
C* uses the record name for the CUST file.
C If DSPMSG = *blanks
C* UPDATE rewrites the record in the database file. Since the
C* field names in the display file are the same as in the
C* database file, RPG synchronizes the values.
C Update CSREC
C* LEAVE will go to the ENDDO.
C Leave
C EndIf
C EndIf
C*
C EndDo
C*
C EndSr
C*----------------------------------------------------------------
C EditValues BegSr
C* Make sure the values on the screen are OK.
C If CSNAME = *BLANKS
C Eval DSPMSG = ERR3
C Eval *in90 = *on
C EndIf
C*
C If CSADR1 = *BLANKS
C Eval DSPMSG = ERR4
C Eval *in90 = *on
C EndIf
C*
C If CSCTY = *BLANKS
C Eval DSPMSG = ERR5
C Eval *in90 = *on
C EndIf
C*
C If CSSTE = *BLANKS
C Eval DSPMSG = ERR6
C Eval *in90 = *on
C EndIf
C*
C If CSZIP < 10000000
C Eval DSPMSG = ERR7
C Eval *in90 = *on
C EndIf
C*
C EndSr