DOCUMENT # 777
===========================================================================
UPDATE IN AN EEP
===========================================================================
PRODUCT: R:BASE VERSION: 4.5+ or Higher
===========================================================================
CATALOG: Forms, Reports & Labels AREA : Forms
===========================================================================
Many users want to use an UPDATE command in an EEP to conditionally change
data. Often it is desired to change data on the same row the user is
editing. You may want to change data in fields that are not located on the
form based on data users enter into the form. This isn't a straightforward
operation.
R:BASE retrieves an entire row into memory when using a form. Even though
you UPDATE data that is not located on the form, when the row is saved to
the table, the entire row is written back, right over the top of the
updated data. There is a way to make this work, however. You need to not
only save the row before doing the UPDATE but you need to clear the
"changed" flag.
When editing data, R:BASE only rewrites the row to the table if a column
value has been changed. If a column value has been changed (i.e. a
located column has been typed into), R:BASE sets what is called the
"changed" flag. That indicates that the row data has changed. When the
"changed" flag is set, R:BASE re-evaluates expressions and saves the
changed data back to the table.
The EEP command, SAVEROW, does not reset the "changed" flag. It is sort
of like doing an incremental save with Edit. It is not the same as the
option Save changes on the Edit menu. Save changes on the Edit menu
actually does a Save and then a Next -- it saves the current row and
then it gets the next row. The next row action clears the "changed" flag.
To UPDATE the same row being edited, you need to do both a SAVEROW and a
NEXTROW in an EEP. This example EEP leaves you on the same row in the
form by doing a PREVROW after the NEXTROW.
Note that this procedure is for forms used with the Edit data option only.
*(CHANGEIT.EEP)
SET ERROR VAR verr
SET MESSAGE OFF
SAVEROW
SET VAR vnewtitle = 'newvalue'
SET VAR vsave_emp=.vempid
NEXTROW
IF VERR = 0 THEN
UPDATE employee SET emptitle = .vnewtitle +
WHERE empid = .vsave_emp
PREVROW
ELSE
UPDATE employee SET emptitle = .vnewtitle +
WHERE empid = .vsave_emp
ENDIF
SET MESSAGE ON
SET ERROR VAR OFF
The identifying row ID is passed to the EEP through a variables. You can
use a form expression, vempid = empid, to do this. The R:BASE error
variable is used to determine if you are on the last row. If you are on
the last row, the NEXTROW command returns an error. In that case, you
only do the UPDATE, not the PREVROW. Because the NEXTROW evaluates form
expressions again, the identifying row ID value is saved to a second
variable, vsave_emp. This second variable is actually used in the UPDATE
command.