=========================================================================== USING EEPS =========================================================================== PRODUCT: R:BASE VERSION: 4.5+ or Higher =========================================================================== CATALOG: Forms, Reports & Labels AREA : Forms =========================================================================== Many of the new form capabilities of 4.5 Plus! are centered around new Entry/Exit procedure (EEP) commands and using EEPs to accomplish tasks not available through form functions or expressions. Using EEPs often means making separate edit and entry forms, particularly when using the EEP only commands. Don't consider this a drawback, simply copy the form and make the necessary changes, they are often very small. The application will use one form or the other. It is often much easier and quicker to separate the forms instead of trying to combine all possible actions and situations into a single form. Two simple rules you need to know when using EEPs: Data is passed from the form to the EEP and vice versa through variables. The data can be placed in variables through locating variables instead of columns on the form. The data is then saved to the table by using a form expression of the type colname = .varname. Alternatively, the column is located on the form and data placed in a variable through the use of a form expression of the type varname = colname. Which method you use depends on whether you are using the form with the Enter command (Add data) or the Edit command (Edit data) as well as what you need to accomplish with the EEP. Variables can be placed on any table in the form. They do not need to be placed for the same table the EEP is on. For example, you can place linking column values into variables in expressions on table1. Table1 sets up these values and they are the same for every table in the form. Also, a variable defined to pass or return a value from an EEP does not need to be located on the form. When editing data you will find it easier to place the columns on the form and use form expressions to place the row data into variables for EEPs. This lets the column values be directly editable by the user. When the EEP is calculating a value to be returned to the form and loaded into the table, locate the variable on the form and use RECALC or RECALC VAR in the EEP. You will see many examples in the other articles in this Exchange of variables used to pass data to and from EEPs. An EEP always executes. Wherever you place an EEP, at the field level or at the table level, the code will be processed when the specified event happens. When you place an EEP on exit from a field, for example, it will execute when you leave the field going forwards and when you leave the field going backwards. When you place an EEP on exit from a row, it executes whenever you leave the row with any keystroke -- going to another row, to another table, to the menu -- all leave the row. A key element of placing EEPs in forms is to make they execute when you want them to, and keep them from executing at the wrong times. Sometimes that means placing an EEP in the not quite logical place. For example, an EEP placed After leaving section executes when you leave that table - to change tables or to leave the form. But if you leave the table by leaving the form (Exit on the form menu), the EEP code executes after you press Enter on the Exit option. It's difficult to trap for the [Enter] keystroke in an EEP because in so many places it is a valid keystroke you want to be used to execute the EEP. Instead of placing the EEP After leaving section, it may be placed On exit from a row or After saving row. Because an EEP always executes, EEPs frequently use the LASTKEY function to check how the user caused the EEP to execute. This lets the developer make the EEP execution conditional. All the code in the EEP does not always execute; if certain keys are pressed, such as Esc, control is immediately returned to the form. Examples of using the LASTKEY function to control EEP execution are used in many of the other articles in this issue. Table level vs. field level EEPs Where you place an EEP determines when it executes. Some experimentation may be needed to get an EEP in the right place and trap for the right keystrokes. There are no rules regarding placing an EEP at the table or at the field level. Some seem to logically work better in one place or the other. A form-in-a-form, for example, is usually called from a field EEP. Summing rows or printing works well at the table level, After saving row. A table level or row EEP is used when you want to perform actions after all the data has been entered for a row, i.e. the row information is complete. A field level EEP executes as data is entered in a single field. Field level EEPs are more easily conditional than table level EEPs. Often, an EEP can be run from either the field level or table level with only small changes in the code. Field level EEPs execute when you enter or exit a specific field. Since users can move wherever they want on a form (using a mouse you don't need to go through field by field) a field level EEP is not always executed. A table level EEP is always executed. No matter where you place it at the table level, that action will happen at least once when using a form. When trapping keystrokes in a table level EEP, put the EEP On exit from a row instead of After saving row. After saving row executes after you select from the menu. On exit from a row executes before you get to the menu. After you select from the menu, the last keystroke is [Enter], not the key the user pressed to get to the menu.