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.

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...

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
: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 !