5. Dezember 2006

ON-ERROR und ON-MESSAGE-Trigger

Viele Entwickler haben das Problem mit Meldungen, die in der Maske angezeigt werden, zum Beispiel "FRM-40401: No changes to save".

Sie suchen dann nach Workarounds und manipulieren dann oft den :system.message_level:

KEY-COMMIT - Trigger auf Form-Ebene (Quick + Dirty)
BEGIN
:System.Message_Level := 25;
COMMIT;
:System.Message_Level := 5;
END;

oder speichern ihn zwischen:

DECLARE
V_Message_Level NUMBER;
BEGIN
V_Message_Level := :System.Message_Level;
:System.Message_Level := 25;
COMMIT;
:System.Message_Level := V_Message_Level;
END;


Das sind keine Best Practices. Diesen Code müsste man in hunderten Prozeduren unterbringen.

Fehler und Meldungen filtern ist die Lösung für ein gutes Message-Handling. Diese Prozedur zeigt die Technik:

ON-ERROR - Trigger auf Form-Ebene
DECLARE
V_Error_Code       NUMBER;
V_Error_Text       VARCHAR2 (2000);
V_DBMS_Error_Code  NUMBER;
V_DBMS_Error_Text  VARCHAR2 (2000);
BEGIN
V_Error_Code      := Error_Code;
V_Error_Text      := Error_Text;
V_DBMS_Error_Code := DBMS_Error_Code;
V_DBMS_Error_Text := DBMS_Error_Text;

IF V_Error_Code IN (40401, 40405) THEN
/*
|| 40401, 40405 - no changes to save / apply  get filtered
*/
NULL;
ELSIF V_Error_Code IN (-1034, -3114) THEN
/*
|| -1034, -3114 - not connected to database
*/
Message ('Not connect to database, exiting Form');
Exit_Form (no_validate);
ELSIF V_Error_Code IN (40508, 40735)
AND   V_DBMS_Error_Code BETWEEN -20999 AND -20000 THEN
/*
|| -20000 errors are raised by RAISE_APPLICATION_ERROR 
|| They are handled in a different way
*/
Show_and_Log_DB_Error (V_DBMS_Error_Text);
ELSE
/*
|| All other errors went into Show_and_Log_Error, where they
|| get inspected, analyzed and logged.
*/
Show_and_Log_Error (V_Error_Code);
END IF;
END;

Keine Kommentare: