Retrieving data from the database and changing the data is really easy. But what, if the user changes data and want to do an UNDO?
Doing a new query is the easiest way. The limitations are:
- in a multi-record-block you have to position in the correct record after the query
- if the query was executed via ENTER-QUERY mode you can't jump to the old record because the query-result has changed.
So you have to use a new technique.
The solution is this function. All database-items get their old values back:
- in a multi-record-block you have to position in the correct record after the query
- if the query was executed via ENTER-QUERY mode you can't jump to the old record because the query-result has changed.
So you have to use a new technique.
The solution is this function. All database-items get their old values back:
PROCEDURE Undo IS V_Block VARCHAR2 (30) := :SYSTEM.CURSOR_BLOCK; V_Field VARCHAR2 (61); V_Item VARCHAR2 (61); BEGIN Validate (Item_Scope); IF :SYSTEM.RECORD_STATUS = 'CHANGED' THEN V_Field := Get_Block_Property (V_Block, FIRST_ITEM); V_Item := V_Block || '.' || V_Field; WHILE V_Field IS NOT NULL LOOP IF Get_Item_Property (V_Item, ITEM_TYPE) IN ('DISPLAY ITEM', 'CHECKBOX', 'LIST', 'RADIO GROUP', 'TEXT ITEM') AND Get_Item_Property (V_Item, BASE_TABLE) = 'TRUE' THEN COPY (Get_Item_Property (V_Item, DATABASE_VALUE), V_Item); END IF; V_Field := Get_Item_Property (V_Item, NextItem); V_Item := V_Block || '.' || V_Field; END LOOP; END IF; END;
Best practice is to start this undo-procedure from a menu (e.g. EDIT - UNDO) or handle it through a shortcut.