Einfach eine neue Abfrage starten ist der einfachste Weg. Beachtet werden muss:
- in einem Multi-Record-Block muss man sich nach der Abfrage wieder auf dem aktuellen Datensatz positionieren
- wenn die Abfrage durch eine ENTER-QUERY-Selektion geschah kann man nicht zu dem Datensatz springen, da die Abfragemenge unterschiedlich gross ist.
Man muss also eine andere Technik verwenden.
Die Lösung ist diese Funktion. Alle Datenbank-Felder bekommen ihren alten Wert zurück:
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 wäre, wenn man diesen Undo vom Menü aus starten könnte (z.B. Bearbeiten - UNDO) oder durch einen Hotkey.