19. Juli 2007

Check Form_Success für jedes Built-In

Alle Built-Ins haben das Problem, das sie keine echten Exceptions werfen. Nur im ON-ERROR

Beispiel: Sie möchten zum Block Customer navigieren. Dabei unterlief ihnen ein Schreibfehler:

Go_Block ('CUSTOMR');
Do_something_after_Go_Block;

Go_Block kann nicht zu dem angegebenen Block navigieren, da CUSTOMR nicht existiert. Es wird jedoch keine Exception für innerhalb des PL/SQL-Blockes erzeugt. Das heisst, der Code wird nicht unterbrochen und die Abarbeitung von Do_something_after_Go_Block startet. Das ist immer ein grosses Problem!

Lösung: Erzeuge eine Prozedur Check_Builtin

PROCEDURE Check_Builtin IS
BEGIN
IF NOT Form_Success THEN
RAISE Form_Trigger_Failure;
END IF;
END;

Benutze diese Prozedur nach jedem Built-In:

BEGIN
Go_Block ('CUSTOMR');
Check_Builtin;
Do_something_after_Go_Block;
EXCEPTION
WHEN FORM_TRIGGER_FAILURE THEN
-- do something ...
END;

Desweiteren kann man ein eigenes Built-In schreiben für Goto_Block anstelle von Go_Block: Diese neue Prozedur arbeitet intern mit dem neuen Check_Builtin

PROCEDURE Goto_Block (P_Block IN VARCHAR2) IS
BEGIN
Go_Block (P_Block);
Check_Builtin;
Do_something_after_Go_Block;
END;

als nächstes:

BEGIN
Goto_Block ('CUSTOMR');
Do_something_after_Go_Block;
EXCEPTION
WHEN FORM_TRIGGER_FAILURE THEN
-- do something ...
END;

Wichtig: Wenn sie diese Technik anwenden müssen sie ein Exception-Handling schreiben, dass den FORM_TRIGGER_FAILURE abfängt und behandelt.

Diese Technik ist identisch zu Oracle's Check_Package_Failure-Routine, diese kann jedoch nur genutzt werden, wenn in der Maske mindestens eine Master-Detail-Relation existiert.

benutze Check_Builtin
Gerd

Keine Kommentare: