20. Dezember 2006

Undo

Daten aus der Datenbank abfragen und ändern ist in Forms relativ einfach. Aber was ist, wenn der Anwender einen einfachen Undo auf seine Änderungen machen will?

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.

Keine Kommentare: