Wenn man nun den Record-Status zurück auf QUERY setzt, ist das auf jeden Fall schon mal eine gute Vorgehensweise. Dazu erstellen wir eine Prozedur zum Setzen des Record-Status auf QUERY:
PROCEDURE Set_Record_Query_Status IS
BEGIN
Set_Record_Property (NAME_IN ('SYSTEM.TRIGGER_RECORD'),
NAME_IN ('SYSTEM.TRIGGER_BLOCK'),
STATUS,
QUERY_STATUS);
END;
dieser wird dann im POST-QUERY-Trigger aufgerufen:
BEGIN
SELECT someColumns
INTO :myBlock.nonBasetable_Item
FROM myTable
WHERE someFilter;
Set_Record_Query_Status;
END;
Nachdem nun jeder Datensatz auf QUERY-Status gesetzt wurde hat man mit den Daten des Blockes auch kein Problem mehr.
Wichtig: Wenn der POST-QUERY Basetable-Items im Datensatz verändert muss man die erzeugten Datensatz-Sperren zurücksetzen, falls der Block-Locking-Modus auf Immediate gesetzt ist. Dieses Problem kann folgendermassen gefixt werden:
BEGIN
Set_Block_Property ('myBlock', LOCKING_MODE, Delayed);
SELECT someColumns
INTO :myBlock.nonBasetable_Item
FROM myTable
WHERE someFilter;
Set_Block_Property ('myBlock', LOCKING_MODE, Immediate);
Set_Record_Query_Status;
END;
try it
Gerd
Keine Kommentare:
Kommentar veröffentlichen