Letzte Woche war heftig!
Letzten Montags bekam ich die Einladung zur Oracle World von der EOUC.
Freitags lehnte Oracle meinen Vortrag ab (Forms-Integration in BPEL) da sie den gleichen Vortrag aus Oracle-Sicht halten wollten. Sie gaben mir aber eine zweite Chance für ein anderes Thema.
Diesen Mittwoch bekam ich eine Einladung für meinen Vortrag über BI Beans.
Developing Powerful Oracle Business Intelligence Beans in Oracle Forms
BI Beans ersetzt Oracle Graphics als neues graphisches Tool in Forms. Für diese neue Java-basierte Technologie braucht der Forms Entwickler keine Java-Kenntnisse. Im Vortrag lernt man, wie BI Beans richtig installiert werden, wie die Kommunikation zwischen Forms und BI Beans aufgebaut wird und wie man tolle graphische Anwendungen damit aufbaut.
3. August 2006
25. Juli 2006
Einladung zur OOW 2006
Juhu ! Ich wurde zur Oracle Open World 2006 nach San Francisco eingeladen.
Oracle Forms & BPEL do work hand in hand in the SOA-world
Abstract:
With the come up of service-oriented-architectures it is mandatory that Oracle Forms communicates with the companies automated business processes. In this presentation you'll see, how easy it is to establish a "dialogue" between Oracle Forms and BPEL. The integration will be demonstrated with an example-application: the setup in Oracle Forms, the web-services you need in and around the BPEL-engine and how you poll process-messages in Oracle Forms.
Oracle Forms & BPEL do work hand in hand in the SOA-world
Abstract:
With the come up of service-oriented-architectures it is mandatory that Oracle Forms communicates with the companies automated business processes. In this presentation you'll see, how easy it is to establish a "dialogue" between Oracle Forms and BPEL. The integration will be demonstrated with an example-application: the setup in Oracle Forms, the web-services you need in and around the BPEL-engine and how you poll process-messages in Oracle Forms.
24. Juli 2006
Erstellen eines Forms Frameworks
Seit mehr als 10 Jahren arbeite ich nun schon mit Oracle Forms und denke über die Frage nach: Wie kann man am effizientesten mit dieser 4GL Sprache umgehen?
Es ist sehr einfach um eine Formsmaske zu erstellen und laufen zu lassen. Eine grosse Anwendung mit vielen hundert Formsmasken auf diese Weise zu entwickeln ist jedoch unsinnig, da man das Rad täglich neu erfinden müsste.
Ich wollte das Rad also nur einmal erfinden um es dann in allen Formsmasken benutzen zu können. Der beste Weg hierzu ist:
- Erstelle einen Style Guide für die gesamte Applikation
- Definiere eine Referenz-Form und Templates für die Entwickler
- Erzeuge Prototypen mit dem Framework
Das hört sich so einfach an und es ist auch so einfach, wenn man genügend Erfahrung hat und weiss, wie Forms arbeitet.
Hier ist der Link zu meinem Sourceforge-Projekt, wo ich die Sourcecodes publiziere, Richtlinien für das Framework beschreibe und vieles mehr...
Einige Punkte des Style Guides sind
- Exception Handling
- Dynamisches Meldungswesen
- Zugriffsrechte für Forms und Spezial-Funktionen
- Dynamische Menüs für die Start-Applikation
- PL/SQL-Libraries
Es ist sehr einfach um eine Formsmaske zu erstellen und laufen zu lassen. Eine grosse Anwendung mit vielen hundert Formsmasken auf diese Weise zu entwickeln ist jedoch unsinnig, da man das Rad täglich neu erfinden müsste.
Ich wollte das Rad also nur einmal erfinden um es dann in allen Formsmasken benutzen zu können. Der beste Weg hierzu ist:
- Erstelle einen Style Guide für die gesamte Applikation
- Definiere eine Referenz-Form und Templates für die Entwickler
- Erzeuge Prototypen mit dem Framework
Das hört sich so einfach an und es ist auch so einfach, wenn man genügend Erfahrung hat und weiss, wie Forms arbeitet.
Hier ist der Link zu meinem Sourceforge-Projekt, wo ich die Sourcecodes publiziere, Richtlinien für das Framework beschreibe und vieles mehr...
http://sourceforge.net/projects/forms-framework/
Einige Punkte des Style Guides sind
- Exception Handling
- Dynamisches Meldungswesen
- Zugriffsrechte für Forms und Spezial-Funktionen
- Dynamische Menüs für die Start-Applikation
- PL/SQL-Libraries
21. Juli 2006
CLOB's in Forms 6i
Der neue Datentyp CLOB wird in Oracle Forms 6i noch nicht unterstützt.
Erfinden wir doch einfach einen Workaround !
Voraussetzung: Tabelle EMP ist in der DB und hat eine Spalte Note_CLOB, es gibt eine Maske mit dem Block EMP und allen Spalten ausser dem CLOB.
Anforderung: Der CLOB soll aus der DB gelesen und angezeigt werden. Desweiteren soll er editierbar sein
Zuerst erstellen wir ein Textitem "Note_CLOB" im Block EMP:
Item-Properties:
- Data Type CHAR
- Maximum Length 32000
- Database-Item No
Item-Trigger:
- WHEN-VALIDATE-ITEM
Block-Trigger:
- POST-QUERY
- PRE-UPDATE
Diese Prozeduren werden in der Maske benötigt
Diese Prozedur liegt in der Datenbank
mit dieser Technik kann man aus einem CLOB die ersten 32 KB auslesen und verändern. Bei grösseren CLOB geht dies nicht.
versuche und teste es !
Erfinden wir doch einfach einen Workaround !
Voraussetzung: Tabelle EMP ist in der DB und hat eine Spalte Note_CLOB, es gibt eine Maske mit dem Block EMP und allen Spalten ausser dem CLOB.
Anforderung: Der CLOB soll aus der DB gelesen und angezeigt werden. Desweiteren soll er editierbar sein
Zuerst erstellen wir ein Textitem "Note_CLOB" im Block EMP:
Item-Properties:
- Data Type CHAR
- Maximum Length 32000
- Database-Item No
Item-Trigger:
- WHEN-VALIDATE-ITEM
:EMP.EMPNO := :EMP.EMPNO;
Block-Trigger:
- POST-QUERY
POQ_EMP;
- PRE-UPDATE
PRU_EMP;
Diese Prozeduren werden in der Maske benötigt
PROCEDURE POQ_EMP IS
V_String VARCHAR2 (1000);
V_Index NUMBER := 0;
BEGIN
LOOP
V_String := Read_CLOB (:EMP.EMPNO, V_Index);
IF V_String IS NOT NULL THEN
:EMP.Note_CLOB := :EMP.Note_CLOB || V_String;
V_Index := V_Index + 1;
ELSE
EXIT;
END IF;
END LOOP;
END;
PROCEDURE PRU_EMP IS
V_String VARCHAR2 (1000);
V_Index NUMBER := 0
BEGIN
Clear_CLOB (:EMP.EMPNO);
LOOP
V_String := Substr (:EMP.Note_CLOB, 1 + V_Index * 1000, 1000);
IF V_String IS NOT NULL THEN
Append_CLOB (:EMP.EMPNO, V_String);
V_Index := V_Index + 1;
ELSE
EXIT;
END IF;
END LOOP;
END;
Diese Prozedur liegt in der Datenbank
PROCEDURE CLEAR_CLOB (P_EMPNO IN EMP.EMPNO%TYPE) IS
BEGIN
UPDATE EMP SET Note_CLOB = NULL
WHERE EMPNO = P_EMPNO;
END;
PROCEDURE APPEND_CLOB (P_EMPNO IN EMP.EMPNO%TYPE, P_STRING IN VARCHAR2) IS
BEGIN
UPDATE EMP SET Note_CLOB = Note_CLOB || P_String
WHERE EMPNO = P_EMPNO;
END;
FUNCTION READ_CLOB (P_EMPNO IN EMP.EMPNO%TYPE, P_INDEX IN NUMBER) RETURN VARCHAR2 IS
V_STRING VARCHAR2 (2000);
BEGIN
SELECT SUBSTR (Note_CLOB, 1 + P_Index * 1000, 1000)
INTO V_String
FROM EMP
WHERE EMPNO = P_EMPNO;
RETURN (V_String);
END;
mit dieser Technik kann man aus einem CLOB die ersten 32 KB auslesen und verändern. Bei grösseren CLOB geht dies nicht.
versuche und teste es !
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
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.
Diese Methode der Konstanten-Packages kann noch verbessert werden, wenn man ein weiteres Package pro Formsmaske erstellt und dies CONST_LOCAL nennt.
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
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
24. September 2005
Oracle Open World 2005
Dieses Jahr bin ich zum vierten Mal auf einer Oracle Open World, wobei es das dritte Mal in der nettesten Kleinstadt in Amerika stattfand: San Francisco

Larry kündigte den neuen Life-Time-Support für alle Middleware-Produkte an. Das war ein regelrechter Hammer, da ich weiss, was das für einen Softwareriesen wie Oracle bedeutet.
Gratulation für diese Ankündigung!
Die wichtigsten Themen auf der OOW sind:
und hier noch Larrys Spielzeug im Moscone-Center:

Larry kündigte den neuen Life-Time-Support für alle Middleware-Produkte an. Das war ein regelrechter Hammer, da ich weiss, was das für einen Softwareriesen wie Oracle bedeutet.
Gratulation für diese Ankündigung!
Die wichtigsten Themen auf der OOW sind:
- Oracle Fusion
- Golden future for BPEL
und hier noch Larrys Spielzeug im Moscone-Center:
OOW 2005 Zusammenfassung
Nach einem Dutzend Vorträge, kristallisierten sich ein paar sehr gute heraus.
Steven spielte mit dem Publikum in der Pause erstmal 10 Minuten SET und tauchte dann sehr schnell in FOR-Loops und BULK-Collects ein.

Tom zeigte seine 12 wichtigsten Dinge in einer Oracle DB 10g Rel.2. (http://tkyte.blogspot.com/2005/09/oow-presentation-is-done.html)

Scott in seiner Keynote

Am Tag nach der Konferenz brauchte ich erstmal ein wenig Ruhe. Wo könnte man besser ausruhen als an einem kleinen See mit Pinguinen, einem Wasserfall und im Hintergrund einige hohe blaue Berge:
Steven spielte mit dem Publikum in der Pause erstmal 10 Minuten SET und tauchte dann sehr schnell in FOR-Loops und BULK-Collects ein.

Tom zeigte seine 12 wichtigsten Dinge in einer Oracle DB 10g Rel.2. (http://tkyte.blogspot.com/2005/09/oow-presentation-is-done.html)

Scott in seiner Keynote

Am Tag nach der Konferenz brauchte ich erstmal ein wenig Ruhe. Wo könnte man besser ausruhen als an einem kleinen See mit Pinguinen, einem Wasserfall und im Hintergrund einige hohe blaue Berge:
Init
... und ein neuer Blog erwacht zum Leben ...
Dieser Blog ist ausschliesslich für Oracle Forms-Entwickler.
In allen künftigen Posts werde ich Beispiele von Sourcecodes geben, über neue Technologien diskutieren und versuchen allen zu helfen, die bei der Entwicklung von Oracle Forms Hilfe brauchen.
Viel Spass mit meinem neuen Blog
Gerd
Dieser Blog ist ausschliesslich für Oracle Forms-Entwickler.
In allen künftigen Posts werde ich Beispiele von Sourcecodes geben, über neue Technologien diskutieren und versuchen allen zu helfen, die bei der Entwicklung von Oracle Forms Hilfe brauchen.
Viel Spass mit meinem neuen Blog
Gerd
Abonnieren
Posts (Atom)