12. Oktober 2005

Globales Konstanten-Package

Wenn man Ausdrücke und Konstanten in Forms benötigt, dann ist der einfachste Weg: Hartkodieren der Werte im Sourcecode.

Bitte nutze nie den einfachsten Weg!

Schau einmal auf diese Beispiel-Codes und versuche ein Gefühl dafür zu bekommen, wie man das im eigenen Code verwenden könnte:

Alle meine Formsmasken haben attached Libraries, in denen ich meine Framework-Funktionen halte.

Eine Package Spezifikation in der Library ist das Package CONST. Es gibt hier keinen Package Body

PACKAGE Const IS
/*
|| Name : Const
||
|| Function : Dieses Package enthält alle globalen Konstanten für alle Masken
||
|| Autor : 08.08.1999, VOL
|| Updates :
*/

-- Alert
alr_Error CONSTANT VARCHAR2 (30) := 'AL_ERROR';
alr_Info CONSTANT VARCHAR2 (30) := 'AL_INFO';
alr_Warning CONSTANT VARCHAR2 (30) := 'AL_WARNING';

-- Mode
mod_Call_Form CONSTANT VARCHAR2 (10) := 'CALL_FORM';
mod_Open_Form CONSTANT VARCHAR2 (10) := 'OPEN_FORM';
mod_Go_Form CONSTANT VARCHAR2 (10) := 'GO_FORM';
mod_New_Form CONSTANT VARCHAR2 (10) := 'NEW_FORM';

-- Block, Record and Form-Status
sta_Changed CONSTANT VARCHAR2 (10) := 'CHANGED';
sta_Insert CONSTANT VARCHAR2 (10) := 'INSERT';
sta_New CONSTANT VARCHAR2 (10) := 'NEW';
sta_Query CONSTANT VARCHAR2 (10) := 'QUERY';

-- Other
CR CONSTANT VARCHAR2 (1) := CHR (10);
Tab CONSTANT VARCHAR2 (1) := CHR (9);
TRUE CONSTANT VARCHAR2 (10) := 'TRUE';
FALSE CONSTANT VARCHAR2 (10) := 'FALSE';

END Const;

Das ist nur ein winziger Ausschnitt meiner Konstanten-Package

Alle Sourcecodes in denen ich Literale benutze werden nun auf Konstanten in dem Package verwandelt.

z.B.

IF NAME_IN ('System.Last_Record') = Const.TRUE THEN
--do something;
ELSE
--do something different;
END IF;


Diese Methode der Konstanten-Packages kann noch verbessert werden, wenn man ein weiteres Package pro Formsmaske erstellt und dies CONST_LOCAL nennt.


PACKAGE Const_local IS
/*
|| Name : Const_local
||
|| Function : local Constant-Package
||
|| Author : 08.08.1999, VOL
|| Updates :
*/

-- Blocks
blk_Control CONSTANT VARCHAR2 (30) := upper ('Control');

-- Items
itm_Test CONSTANT VARCHAR2 (61) := upper ('Control.TI_TEST');

END Const_local;


In diesem lokalen Package speichert man nun alle Literale die in der Masken benötigt werden und sonst nirgendwo. Dieses Package kann schnell grösser werden und ist der zentrale Punkt für alle anderen Funktionen und Prozeduren.

Dieses Package eröffnet einem ein paar interessante Nutzungsmöglichkeiten. Alle Literale sind nun Konstanten. D.h. man hat ab sofort keine Laufzeitfehler mehr, wenn man mal einen Schreibfehler macht. Alle Fehler werden ab sofort Kompilierfehler sein und somit findet man sie schneller.

Wenn man ein Literal falsch schreibt, dann gibt es in der gesamten Library nur genau einen Platz, wo dieser Fehler gemacht werden konnte: Im Package CONST. Dieser Fehler mag auftreten, er wird aber sehr schnell gefunden und kann genauso einfach korrigiert werden.


Ergebnis: Benutze das globale Konstanten-Package in einer Library und benutze das lokale Package für alle Dinge in der Maske selber.

Try it