A good way to enable user to undo last changes , I found it by Mr. GERD blog.
,,
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:
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:
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. ,,
No comments:
Post a Comment