APEX-AT-WORK no image

Es sind die kleinen Dinge, die APEX 4 so viel besser machen

Von Tobias Arnhold 3.07.2011
Ich habe heute eine Frage im APEX Forum beantwortet. Diese recht trivial klingt, aber in der Konstellation doch recht anspruchsvoll wurde.

Ausgangslage:
Ein Entwickler hat zwei Textfelder: P1_FIELD_A, P1_FIELD_B und beide Felder sind im DATE-Format.
Wenn er das Feld P1_FIELD_A verlässt, dann soll das Feld P1_FIELD_B den Wert von P1_FIELD_A erhalten und diesen Wert automatisch um 1 Jahr erhöhen.

Wie gesagt es klingt recht einfach, sofern Sie PL/SQL verwenden dürfen und APEX 4.0 im Einsatz haben!

Kreieren Sie eine Dynamic Action > "Erweitert" > Event: "Lose Focus" > Item: P1_FIELD_A

TRUE Action: "Set Value" > Set Type: "PL/SQL Expression" >
Code: to_char(add_months(to_date(:P1_FIELD_A,'DD.MM.YYYY'),12),'dd.mm.yyyy')
Page Items to Submit: P1_FIELD_A

Affected Elements: Items > Item: P1_FIELD_B

Mit APEX 3 sah das noch ganz anders aus!
Statt einfach auf eine PL/SQL Funktion zugreifen zu können, musste diese über Javascript als Application Prozess eingebunden werden. Statt 5 Klicks brauchten Sie 20 Zeilen Code der an verschiedenen Stellen lag.
Ich habe die Aufgabe versucht mit Javascript zu lösen. Verdammt unschön und aufwendig so ganz ohne PL/SQL:

Dazu müssen Sie dem Element P1_FIELD_A folgenden Code unter "HTML Form Element Attributes" zuweisen:

onblur="javascript:fnc_field_b(this)"

Und im Page Header folgte dieser JS Code:

<script>
function fnc_field_b(v_field_a){
/* Input: mm/dd/yyyy */
/* Output: dd.mm.yyyy */
/* Documentation: http://www.javascriptkata.com/2007/04/27/mastering-of-the-date-object-in-javascript/ */
/* http://programming.top54u.com/post/Javascript-Convert-String-to-Date.aspx */

/* Create date object */
var myDate = new Date(v_field_a.value);

/* Add 1 year */
myDate.setDate(myDate.getDate() + 365);

/* Create output string DD.MM.YYYY */
/* Day */
var myStr = (myDate.getDate() < 10 ? "0" + myDate.getDate().toString() : myDate.getDate().toString()) + ".";
/* Month */
myStr = myStr + (myDate.getMonth()+1 < 10 ? "0" + (myDate.getMonth()+1).toString() : (myDate.getMonth()+1).toString()) + ".";
/* Year */
myStr = myStr + myDate.getFullYear().toString();

/* Set value */
$s('P1_FIELD_B',myStr);
}

Dabei ist dieser Code noch nicht einmal inhaltlich vollständig. Javascript kann nur das Format mm/dd/yyyy direkt in Date umwandeln.
Ok und diese:
* MM-dd-yyyy
* yyyy/MM/dd
* MM/dd/yyyy
* MMMM dd, yyyy
* MMM dd, yyyy
Unser beliebtes dd.mm.yyyy ist nicht dabei. Also müsste man dieses via ein paar ausgefeilten String-Funktionen noch umwandeln und unter Umständen noch eine Regular Expressions zum Fehlerhandling hinzufügen.
Javascript unterstützt auch nicht die to_char-Funktion. Weshalb ein recht komplexer Script zu umwandeln benötigt wird. Das Gute an JS ist, dass es unzählige Beispiele im Netz gibt.
Weshalb dieser Part recht einfach zu lösen war (http://www.javascriptkata.com/2007/04/27/mastering-of-the-date-object-in-javascript/).

Nur zur Info: Die meisten anderen Web-Entwickler haben kennen keine Dynamic Action Logik bzw. kennen kein PL/SQL.

Das zeigt nur im kleinem Beispiel warum die Entwicklung von APEX Anwendungen so schnell geht.
Ich vergleiche das immer mit Oracle Forms und Oracle Java Alternativen dazu. Wieso tief in den Programmierschichten graben wenn das Leben doch so leicht sein kann. :)

Den Forum Beitrag finden Sie hier: http://forums.oracle.com/forums/thread.jspa?threadID=2186734&tstart=0