DOCUMENT #769
     ==========================================================================
=
     LOOKUP AND EDIT DATA FROM A FORM
     ==========================================================================
=
     PRODUCT:  R:BASE                           VERSION:  4.5+ or Higher
     ==========================================================================
=
     CATALOG:  Forms, Reports & Labels          AREA   :  FORMS
     ==========================================================================
=
     
     It is easy to let users to lookup rows of data to edit from within a form.
 
     Previous versions of R:BASE required a command file that took you in and out 
     of the edit form. Using a form-in-a-form lets your users stay in a field in 
     a form and enter different values for which the row or rows immediately 
     appear for editing. Edit the data, save changes and the cursor returns to 
 
     the same field on the form ready for entry of the next data value to lookup 
     and edit. You can easily modify your existing edit forms to do this.
 
     It make it even easier for your users, add a pop-up menu to the field. Users 
     select the correct customer from a menu displaying the company name. Another 
     option is to provide users a search menu, letting them select from different 
     query options to find the row. 
 
     Create the form
 
     1. Make a copy of the edit form. This copy is used as a "template". 
 
     2. Modify the copy. Remove all the field locations from the form. Remove 
     all tables except for the first table (automatically removes the field 
     locations for those tables). Remove all pages except the first page 
     (automatically removed when all field locations are removed.
 
     3. On the Form settings screen, indicate this form can only be used with 
     Edit.
 
     4. You now have a "template", a form that looks like the first page of the
 
     original form, but with no fields located and no user-defined menu. the 
     form is a page of text only. The actual editing of data is done on the 
     original form which will be called from this template form.
 
     5. Locate a variable in the same position as the field that is used as the
 
     unique identifier for a row. For example, if you edit customer records and
 
     identify customers by the Cust_Id column, locate a variable, VCust_Id, in 
 
     the same location on the form where the Cust_Id column is located on the 
     original form. This is the only field located on the form.
 
     6. Customize the Field settings for the variable to make sure the user can
 
     change the data in the field. 
 
     7. Add an On exit from field EEP, search.eep. The EEP can be created from 
 
     Forms create/modify by pressing Shift-F4 from the EEP name on the Field 
     settings screen.
 
 
     *(SEARCH.EEP)
     SET VAR vlast = (LASTKEY(0))
     IF vlast = '[Esc]' THEN
       RETURN
     ENDIF
     EDIT USING orig_frm WHERE Cust_Id = .VCust_Id
     SET VARIABLE VCust_Id = NULL
     RETURN
 
     The EEP executes unless the user presses [Esc] from the template form. If 
 
     the user presses [Esc] the EEP does not execute and the user exits the 
     template form. The EDIT USING command brings up the original form using a 
 
     WHERE clause with the VCust_Id variable identifying the specified customer
. 
     After the data is edited and the original form exited, the variable 
     VCust_Id is reset to NULL so it will be blank on return to the template 
     form.
 
     8. The command EDIT USING template brings up the template form. The origin
al 
     form is called by the EEP and displays the selected data for editing. 
 
     Add a pop-up menu
 
     Use the new pop-up menu features of 4.5 Plus! to present a menu of company
 
     names for the user to select from. The menu comes up automatically and 
     automatically executes the EEP.
 
     1. Locate a second variable on the form. It is a variable for the purpose 
 
     of giving the cursor a place to land when exiting the template form. 
     Locate the variable, vdummy, as a single character text variable 
     immediately to the left of the VCust_ID variable. There should be no space
 
     between them. The field order is vempid first, vdummy second.
 
     2. Customize the Field settings for the variable VCust_ID. Add a pop-up 
     menu definition selecting the table and columns as desired. Make sure to 
     specify Yes to have it come up automatically and Yes to skip to the next 
     field. The same EEP, search.eep, runs On exit from field but needs to be 
     edited. 
 
     3. Edit the EEP code to add SKIP TO commands. So long as the user keeps 
     requesting new records, they stay in the VCust_ID field and the menu is 
     always displayed. When they press Esc to exit the template form, the 
     cursor is placed in the vdummy field.
 
 
     *(SEARCH.EEP)
     SET VAR vlast = (LASTKEY(0))
     IF vlast = '[Esc]' THEN
       SKIP TO vdummy
       RETURN
     ENDIF
     EDIT USING orig_frm WHERE Cust_Id = .VCust_Id
     SET VARIABLE VCust_Id = NULL
     SKIP TO VCust_Id
     RETURN
 
     3. Customize the field settings for the vdummy field to add an EEP On entry 
     into field. The EEP automatically exits the user from the template form. It 
     uses the value of vlast as determined by search.eep.
 
     *(LEAVE.EEP)
     IF vlast = '[Esc]' THEN
       PLAYBACK esc.pla
     ENDIF
     RETURN
 
     4. Create the playback file, esc.pla, using RBEdit. Select New playback 
     file from the main RBEdit menu and enter the following:
 
     [Esc][Enter]
 
     Save the file and Exit. When executed from the EEP, the playback file 
     executes the keystrokes and automatically exits the template form.
 
     Add a search routine
 
     Instead of a pop-up menu, the EEP on exit from the VCust_ID can call a 
     search routine letting the user select from different search options. 
     Once the record is selected, the original form is called by the EEP and 
     displays the selected data for editing. 
 
     1. Create an ASCII menu file with the available search options for the user 
     to choose from. For example, 
 
     CustFind.MNU
     POPUP
     |Company Name|
     |Last Name|
     |Soundex Last Name|
     |Customer I.D.#|
     ENDC
 
     2. Add code similar to the following to the beginning of the EEP called by
 
     the VCust_ID field. This EEP is changed to execute On entry into field. In
 
     addition, the LASTKEY function is moved to check if the user presses Esc at 
     the search pop-up menu. The SKIP TO command is changed to skip to the 
     vdummy field.
 
     Depending on the selection from the search menu, the record to edit is 
     found using different criteria. Additional menus may be displayed if more 
 
     than one record matches the initial condition. The table data is retrieved
 
     from must have the appropriate indexed columns for searching. In this 
     example, there is a computed column defined that uses the internal R:BASE 
 
     UDF, _SOUNDEX, to store the Soundex code. All the columns used for 
     retrieving data are indexed.
 
     *(  CustFind.CMD
     *   Customer cover routine
     *
     *   Copyright (c) MicroRim, Inc. 1992.  All rights reserved.
     )
 
     -- the WHILE loop code is the search routine
 
     WHILE #PI > 0 THEN
 
       SET V VCLstNm = NULL, VCCompany = NULL, VChoice TEXT = NULL, +
         VCust_Id = NULL
 
       CHOOSE VQueryMethod FROM CustFind.MNU AT CENTER CENTER
 
       IF VQueryMethod = '[ESC]' THEN
         SET VAR vlast = (LASTKEY(0))
         SKIP TO vdummy
         RETURN
       ENDIF
 
       IF VQueryMethod = 'Soundex Last Name' THEN
         DIALOG 'Enter customer''s last name' VCLstNm VEndKey 1
           IF VEndKey = '[ESC]' OR VCLstNm IS NULL  THEN
                    GOTO ExitROut
           ENDIF
           SET VAR VSCLstNm = (UDF('_SOUNDEX',.VCLstNm))
     -- a menu displays of all customer's with the specified last name
           CHOOSE VChoice FROM #VALUES FOR +
             ((LJS(CDispFrstNm,10)) & (LJS(CDispLstNm,16)) & +
              (LJS(CDispCompany,30)) & (LJS(CState,2)) & +
              (CTXT(CustId))), CustId +
           FROM Customer +
           WHERE SCLstNm = .VSCLstNm +
           ORDER BY CLstNm, CFrstNm AT CENTER CENTER
          ENDIF
          IF VQueryMethod = 'Last Name' THEN
            DIALOG 'Enter customer''s last name' VCLstNm VEndKey 1
            IF VEndKey = '[ESC]' OR VCLstNm IS NULL THEN
              GOTO ExitROut
            ENDIF
            CHOOSE VChoice FROM #VALUES FOR DISTINCT +
              ((LJS(CDispFrstNm,10)) & (LJS(CDispLstNm,16)) & +
               (LJS(CDispCompany,30)) & (LJS(CState,2)) & +
               (CTXT(CustId))), CustId +
            FROM Customer +
            WHERE CLstNm LIKE .VCLstNm +
            ORDER BY CLstNm, CFrstNm AT CENTER CENTER
          ENDIF
 
          IF VQueryMethod = 'Company Name' THEN
            DIALOG 'Enter customer''s company name' VCCompany VEndKey 1
            IF VEndKey = '[ESC]' OR VCCompany IS NULL THEN
              GOTO ExitROut
            ENDI
            CHOOSE VChoice FROM #VALUES FOR +
              ((LJS(CDispFrstNm,10)) & (LJS(CDispLstNm,16)) & +
                (LJS(CDispCompany,30)) & (LJS(CState,2)) & +
                (CTXT(CustId))), CustId +
               FROM Customer +
                WHERE CCompany LIKE .VCCompany +
               ORDER BY CCompany, CLstNm AT CENTER CENTER
          ENDIF
           IF VQueryMethod = 'Customer I.D.#' THEN
            SET VAR VCust_Id TEXT
            DIALOG 'Enter customer''s I.D.#' VCustId VEndKey 1
            SET VAR VCust_Id INT
            IF VEndKey = '[ESC]' OR VCust_Id IS NULL THEN
              GOTO ExitROut
            ENDIF
            SELECT CustId INTO VCust_Id ICustId FROM Customer +
            WHERE CustId = .VCust_Id
          ENDIF
 
          IF VChoice IS NOT NULL THEN
            SET VAR VCust_Id TEXT = .VChoice
            SET VAR VCust_Id INT
            BREAK
          ELSE
            SET VAR VCust_Id = NULL
          ENDI
 
     ENDWHI
 
     EDIT USING orig_frm WHERE Cust_Id = .VCust_Id
 
     LABEL ExitROut
     SKIP TO vdummy
     RETURN
 
     The entry EEP on the vdummy field is also modified. It is now used to reset 
     the variable VCust_Id to NULL and to skip back to the VCust_Id field. This
 
     is needed because we changed the EEP on VCust_Id to an entry EEP.
 
     *(LEAVE.EEP)
     IF vlast = '[Esc]' THEN
       PLAYBACK esc.pla
     ELSE
       SET VARIABLE VCust_Id = NULL
       SKIP TO VCust_Id
     ENDIF
     RETURN