================================================================== A COLLECTION OF ENTRY/EXIT PROCEDURES ================================================================== PRODUCT : R:BASE VERSION : 3.1 AND UP CATEGORY: FORMS SUBCATEGORY: PROGRAMMING, EEPS ================================================================== EEPs (field entry/exit procedures) are an easy way to increase the power and capabilities of your forms. You simply write an R:BASE command file and then tell the form through the Field Settings screen to run that program when you enter or exit the field. R:BASE suspends operation of the form when an EEP is run, so the EEP doesn't know anything about data you have entered into columns on the form. For the EEP to know about data from the form, you need to put that data into variables in the form, either by locating the variables or by using expressions. The EEPs shown below, drawn from Microrim Technical Support files, demonstrate many different techniques you can use in your applications and illustrate the wide variety of features you can add to your forms. Conditional Multi-Column Pop-up Menu ==================================== Single-column popups are easy to do with the Field Settings menu you can make them automatic or use the Shift-F3 key to bring up the menu only when you want it. Chapter 11 of the R:BASE Users Manual has an example of how to use an EEP to do a multi-column popup. It's an entry procedure, which comes up automatically when you enter the field. What if you want a multi-column popup that comes up only when you press a key, a conditional popup like the single-column ones? You can leave a field in a form in three ways: TAB, ENTER, and F2. Typically, only ENTER or TAB are used to leave a field. F2, then, makes a perfect key for testing in an EEP to see whether the user wants to display the menu (remember, EEPs execute only as you enter or exit a field). Create the multi-column popup EEP , but make it an EXIT EEP instead of an ENTRY EEP. Then at the beginning of the EEP, use the LASTKEY function to trap the key used to exit the field. If that key is F2, display the popup; otherwise, return to the form to the next field. Include a help line in the Field Settings to tell the user to press F2 to display the menu. Locate a variable (VMODEL) on the form, assign the EXIT EEP to the variable field, and use a form expression to store the value to the table (MODEL=.VMODEL). Because a variable is located, the field retains its value from row to row unless you assign it a default value. This example uses a text variable and sets the default value in the Field Settings to _ (underscore). *( -- POPUP.EEP -- ) *( -- Exit procedure to do a conditional multi-column popup menu-- ) SET MESSAGES OFF SET ERROR MESSAGES OFF *( -- Check the key used to exit the field -- ) SET VAR vkey=(LASTKEY(0)),vmodel TEXT *( -- If the user left the field with Enter or Tab, don't display the menu, just return to the form -- ) IF vkey < > '[F2]' THEN RETURN ENDIF *( -- If user presses F2, display the menu -- ) CHOOSE vmodel FROM #VALUES FOR (LJS(model,8)+prodname+','+proddesc) + FROM product AT 10,5 *( -- If user doesn't choose anything from the menu, set variable to default value and return to the form -- ) IF vmodel = '[Esc]' THEN SET VAR vmodel = '_' ENDIF RECALC RETURN Zoom Box for Editing Text and Note Fields ========================================= Forms often don't have enough room on the page to fully locate a text or note field. You end up locating a few lines and then can scroll through the field, but that's not enough space in which to edit the data easily. This exit procedure allows you to press the F2 key and display a zoom box on the screen for editing just as you can do when editing through the Info screen. You'll need a help line on the field, "Press F2 for ZOOM edit". Then add these two form expressions if the field is text: VCALLNOTE = CALLNOTE CALLNOTE=(.VCALLNOTE) Add these two expressions if the field to zoom is a note field: VCALLNOTE=CALLNOTE IN formtable WHERE indexcol=indexcol CALLNOTE=(.VCALLNOTE) Locate the field VCALLNOTE on the form (be sure it wraps at least 2 lines) and assign the following as a exit procedure. *( -- CALLZOOM.EEP -- ) *( -- Exit procedure to display Zoom box for editing -- ) SET VAR vlastkey = (LASTKEY(0)) IF vlastkey < > '[F2]' THEN RETURN ENDIF *( -- Uses CLS to display a shadowed box on the screen -- ) CLS FROM 6,12 TO 21,72 BLACK CLS FROM 5,10 TO 20,70 CYAN CLS FROM 6,12 TO 19,12 GRAY WRITE 'Call Notes' AT 5 12 WHITE ON CYAN WRITE '[Esc] to abort' AT 5 54 LIGHT CYAN ON CYAN *( -- Uses scrolling FILLIN box to edit the data. The third number, 1000, indicates the maximum number of characters to edit. Make this the length of your text field, longer if a note field. -- ) FILLIN vcallnote=55,14,1000 AT 6 13 EDIT BLACK ON GRAY SET VAR vlastkey=(LASTKEY(0)) IF vlastkey = '[Esc]' THEN RETURN ENDIF RECALC RETURN Track Elapsed Time ================== As do many applications, on-line phone support systems need to track and record elapsed time. In the form you start the timer, enter information, and then stop the timer. To do this, use two entry EEPs: one to start the timer and one to stop it. In addition to the columns of information in the table, you need three columns to track the time: start_time TIME, stop_time TIME, and elapsed_ time = (stop_time - start_time) INTEGER. The entry procedures create playback files that return the times to the form. In a multi-user system, unique playback files for each individual are needed. Capture the user's initials into the variable vINIT before starting the form and use that as the extension on the files. Locate the Start_Time column first on the form and run the EEP as an entry procedure on this field. The user is prompted to press F2 to start the timer. Then locate the other information to be entered so that while the timer is running, the data can be looked up and entered. To display the current elapsed time and stop the timer, use the EEP called STOPTIME below.This is an entry procedure on the Stop_Time field. *( -- STARTIME.EEP -- ) *( -- Starts the timer for tracking elapsed time. It uses a temporary file called START.xxx where xxx is the user's initials (VINIT). -- ) SET VAR vfill TEXT, vreturn TEXT LABEL retry CLS FROM 25 1 TO 25 79 CYAN WRITE 'PRESS [F2] TO START TIMER' AT 25 24 BLACK ON CYAN WRITE '[F2]' AT 25 30 BLACK ON CYAN BLINK *( -- Traps the keystroke looking for [ESC] or [F2] -- ) FILLIN vfill=0 USING ' ' AT 25 50 CYAN SET VAR vstartit TIME = .#TIME *( -- Improper keystroke pressed -- ) IF vfill IS NULL OR (vfill NE '[ESC]' AND vfill + NE '[F2]') THEN GOTO retry ENDIF *( -- ESC leaves the form without adding a record -- ) IF vfill EQ '[ESC]' THEN SET VAR vreturn = (CHAR(0)+CHAR(92)+CHAR(0)+CHAR(18)+ + CHAR(13)+CHAR(0)+CHAR(95)) ENDIF *( -- F2 jumps to the next field starting the clock -- ) IF vfill EQ '[F2]' THEN SET VAR vreturn = (CHAR(0)+CHAR(92)+CTXT(.vSTARTIT)+CHAR(13)+ + CHAR(0)+CHAR(95)) ENDIF SET VAR vfile TEXT = ('START.' + .vinit) OUTPUT &vfile SHOW VAR vreturn OUTPUT SCREEN PLAYBACK &vfile RETURN *( -- STOPTIME.EEP -- ) *( -- Checks for any key presses and stops the timer when a key is pressed. Uses a temporary file called STOP.xxx where xxx is the user's initials (VINIT)˙ -- ) SET VAR vreturn TEXT CLS FROM 25 1 TO 25 79 CYAN WRITE 'PRESS [F2] TO STOP TIMER' AT 25 24 BLACK ON CYAN WRITE '[F2]' AT 25 30 BLACK ON CYAN BLINK *( -- Loops until a BREAK is encountered -- ) WHILE #PI IS NOT NULL THEN *( -- Checks to see if the buffer contains a keystroke -- ) SET VAR vcheck = (CHKKEY(0)) IF vcheck = 1 THEN *( -- If keystroke exists then grab the key -- ) SET VAR vkey = (GETKEY(0)) *( -- Stop timer if [F2] is pressed, otherwise, notify user of invalid key˙ -- ) IF vkey = '[F2]' THEN SET VAR vendit = .#TIME BREAK ELSE CLS FROM 25 1 TO 25 79 CYAN WRITE 'Invalid Key ..... Press [F2] to stop timer' AT 25 16 + RED ON CYAN PAUSE FOR 1 CLS FROM 25 1 TO 25 79 CYAN WRITE 'PRESS [F2] TO STOP TIMER' AT 25 24 BLACK ON CYAN WRITE '[F2]' AT 25 30 BLACK ON CYAN BLINK ENDIF ENDIF *( -- Calculates and displays elapsed time. Variable VSTARTIT was set in EEP STARTIME -- ) SET VAR vdiff INTEGER=(.#TIME - .vstartit) SET VAR vtdiff TIME=(RTIME(0,0,.vdiff)) WRITE 'ELAPSED TIME:',.vtdiff AT 24 10 WHITE ON BLUE ENDWHILE *( -- Returns the ending time to the form -- ) SET VAR vreturn = (CHAR(0)+CHAR(92)+CTXT(.vendit)+CHAR(13)+ CHAR(0)+CHAR(95)) CLEAR VAR vdiff, vtdiff SET VAR vfile = ('STOP.' + .vinit) OUTPUT &vfile SHOW VAR vreturn OUTPUT SCREEN PLAYBACK &vfile RETURN> Conditional Next Row in a Region ================================ When entering data in a region, pressing [Enter] on the last field in a row takes you to the next row in a region, not to the menu. To stop the form from automatically taking you to the next row in the region, locate a dummy variable as the last field and then assign an entry procedure to that field to prompt the user to add another row. This prevents null rows being accidentally loaded to the table. If the user answers negatively, the EEP automatically adds the current row. If the user answers affirmatively, the EEP moves down to the next row in the region. *( -- MOREDATA.EEP -- ) *( -- Prompts to enter another row in a region. Uses a temporary file called DUMMY.xxx where xxx represents user's initials VINT -- SET VAR vfill TEXT DIALOG 'Add Another Row? (ESC to return)' vfill,vend,YES AT 5 *( -- if vEND equals ESC then return to the form -- ) IF vend = '[ESC]' THEN *( -- Returns to the previous field on the form -- ) SKIP -1 RETURN ENDIF IF vfill = 'YES' THEN *( -- Goes to next row in the region that adds the current row -- ) SET VAR vreturn = (CHAR(0)+CHAR(92)+'Y'+CHAR(13)+CHAR(0)+CHAR(95)) ELSE *( -- Goes to add menu and executes first option --) SET VAR vreturn = (CHAR(0)+CHAR(92)+'N'+CHAR(0)+CHAR(30)++ CHAR(13)+CHAR(0)+CHAR(95)) ENDIF SET VAR vfile TEXT = ('DUMMY.' + .vinit) OUTPUT &vfile SHOW VAR vreturn OUTPUT SCREEN PLAYBACK &vfile RETURN Extra Help in a Form ==================== This EEP uses a variable location to place extra help text on your form. You can use this to automatically display help for a field as soon as the user moves onto that field. Locate the help varible on the form immediately before the field you want to display help for. The variable location (VEEPNOTE) must be wide enough to hold the displayed message. The Field Settings must say YES to the question "Can the user change the data displayed in the field?" even though the cursor will not seem to land on the field. This is an entry procedure on the variable VEEPNOTE. *( -- XHELP.EEP -- ) *( -- Displays extra help for fields in a form -- ) SET VAR vlkey = (LASTKEY(0)) *( -- The keys UP, LEFT, Shift-TAB mean that the user is moving backwards through the form and the message will not be displayed -- ) IF vlkey CONT 'u' OR vlkey CONT 'l' OR vlkey CONT 's' THEN SET VAR veepnote TEXT = ' ' RECALC *( -- Moves the cursor off the field in the direction the user is going -- ) SKIP -1 ELSE *( -- Displays the help message -- ) SET VAR veepnote TEXT = 'This is the message' RECALC SKIP 1 ENDIF RETURN Conditional Default Value ========================= This EEP sets a default value for a field, depending on the value entered into a previous field. For example, a default freight charge is displayed if the user answers "Y" to a "Charge Freight? [Y/N]" question. The procedure is an entry procedure on the next field (vFREIGHT). It sets a fixed default value or can look up the default freight charge for the customer. Additionally, the EEP will not change the freight when entered into by an up- or left-arrow or a Shift-Tab. In other words, the user must be moving down through the form and not backward. You need a form expression to store the freight amount back into the table: FREIGHT = .VFREIGHT *( -- DEFAULT.EEP -- ) *( -- Assigns a default value to a field based on data entered in a previous field on the form -- ) SET VAR vlastkey = (LASTKEY(0)) IF vlastkey = '[UP]' OR vlastkey='[SHIFT][TAB]' OR + vlastkey='[LEFT]' THEN SKIP TO vfreight ENDIF *( -- If a default value is stored for each customer, use the following command to retrieve it. The variable vcustid is set to equal the custid in a form expression. -- ) SELECT freight INTO vfreight IND vi1 FROM customer WHERE custid = + .vcustid *( -- If a fixed default value is desired, use the following instead. -- ) SET VAR vfreight = 10.00 *( -- The freight value appears in the field, vfreight, and can be overwritten by the user. -- ) RECALC RETURN Print from an EEP ================= REPRINT.EEP is an exit procedure that allows printing reports from inside a form. It uses the LASTKEY function to check a specific keystroke (Alt-R in this case) to see whether the user wants to print reports. If the user presses Alt-R, he or she is prompted to verify that he or she wants to print a report. If the answer is YES, the user is given a list of reports to print. Once a report is chosen, another menu appears to give a choice of output devices. The EEP can be placed on either a column or a variable. NOTE: This EEP requires the menu file PRNOUT.MNU. *( -- REPRINT.EEP -- ) *( -- Prompts the user for report to print while using a form. Requires the file prnout.mnu˙ -- ) SET VAR vkey = (LASTKEY(0)) *( -- If [ALT]R was not pressed, return to the form -- ) IF vkey << >> '[ALT]R' THEN RETURN ENDIF *( -- Brings up menus of reports to print and verifies that the user really wants to print something -- ) DIALOG 'Would you like this information printed ? ' vanswer vend + yes AT 8 *( -- If the user does not want to print, returns to form -- ) IF vend = '[Esc]' OR vanswer = 'no' THEN RETURN ENDIF *( -- Pick a report to print from the menu of reports -- ) CHOOSE vrept FROM #REPORTS AT 4,40 *( -- If don't choose a report then return to the form -- ) IF vrept = '[Esc]' THEN RETURN ENDIF CHOOSE voutput FROM prnout.mnu AT 4,55 IF voutput = '[Esc]' THEN RETURN ENDIF IF voutput = 'FILE...' THEN SET VAR voutput = ' ' DIALOG 'Enter filename:' voutput vresp 1 IF vresp = '[Esc]' THEN RETURN ENDIF ELSE SET VAR voutput = 'LPT1' ENDIF CLS OUTPUT &voutput PRINT .vrept OUTPUT SCREEN WRITE ' Print completed. + ' at 24,1 gray on red PAUSE 1 CLE VAR voutput, vrept RETURN File: PRNOUT.MNU $MENU PRNOUT POPUP|| |Printer| |File...| ENDC Add A Sixth Table to the Form ============================= Forms are limited to five tables, but by using an EEP you can prompt the user to enter data to be loaded into a sixth table. Assign the EEP as an exit procedure on the last field of a table. Then the user will be prompted to enter the values for the sixth table upon leaving that field. *( -- NEWTBL.EEP -- ) *( -- Adds extra tables to a form for data entry -- ) SET ERROR MESS OFF SET MESSAGES OFF SET VAR v1 TEXT CLS *( -- Places an entry box on the screen and displays field prompts. Alternatively, you can DISPLAY a file that has the prompts in it -- ) CLS FROM 5 7 TO 20 75 BLACK CLS FROM 4 5 TO 19 75 RED WRITE '[Esc] to abort.' at 5 50 black on cyan WRITE 'First Name: ' AT 7 6 black ON red WRITE 'MI:' AT 7 32 black ON red WRITE '.' AT 7 37 black ON red WRITE 'Last name: ' At 7 40 black ON red WRITE 'Address: ' AT 8 6 black ON red WRITE 'Address: ' AT 9 6 black ON red WRITE 'Apt#: ' At 9 53 black ON red+ WRITE 'Customer ID: ' AT 15 6 yellow ON + <_>black WRITE 'Phone: ' AT 15 26 yellow ON black WRITE '( )' AT 15 33 yellow ON black WRITE '-' At 15 43 yellow ON black SET VAR vlast = (LASTKEY(0)) IF vlast = '[ESC]' then RETURN ENDIF FILLIN vfname=13 USING ' ' AT 7 18 black ON red FILLIN vmi=1 USING ' ' AT 7 36 black ON red FILLIN vlname=15 USING ' ' AT 7 51 black ON red FILLIN vaddr1=35 USING ' ' At 8 15 black ON red FILLIN vaddr2=35 USING ' ' AT 9 15 black ON red FILLIN vapt#=5 USING ' ' AT 9 59 black ON red FILLIN vcustid=5 USING ' ' AT 15 19 yellow ON black FILLIN varea=3 USING ' ' AT 15 34 yellow ON black FILLIN vprefix=3 USING ' ' AT 15 40 yellow ON black FILLIN vsuffix=4 USING ' ' AT 15 44 yellow ON black INSERT INTO customer + (fname,mi,lname,addr1,addr2,apt#,custid,+ area, prefix,suffix) + VALUES (.vfname,.vmi,.vlname,.vaddr1,.vaddr2,.vapt#,.vcustid,+ .varea, . vprefix,.vsuffix) RETURN