Logo Oracle Deutschland   Application Express Community

Synchron oder Asynchron? Dynamic Actions in Application Express 5.1.

Erscheinungsmonat APEX-Version Datenbankversion Cloud oder on Premise
Dezember 2016 5.1 ab 11.2 beides

Seit dem 16. Dezember 2016 ist APEX 5.1 auf dem öffentlichen Demoserver apex.oracle.com verfügbar. Damit steht dem Testen der neuen Funktionen nichts mehr im Wege - und natürlich werden sich die Community-Tipps im Jahr 2017 intensiv mit diesen neuen Funktionen beschäftigen.

  • Oft wurde nach dem "editierbaren interactive Report" gefagt - mit dem neuen Interactive Grid ist dies nun Realität.
  • Die Integration von Oracle JET bringt viele neue Diagrammtypen - out of the box.
  • Das Universal Theme wurde erweitert und nochmals verbessert. Vor allem die neue Icon Bibliothek Font APEX ist erwähnenswert.
  • Darüber hinaus bringt das neue Release zahlreiche neue Funktionen im Detail - wie die Möglichkeit, ein Icon für ein Formularelement oder für die Applikation selbst festzulegen. Eine Aufzählung würde hier zu weit führen; die vollständige Liste findet sich in den Release Notes in der Dokumentation.

Besonders erwähnenswert sind die Packaged Applications, die mit der Version 5.1 wiederum erweitert wurden. So gibt es die Beispielanwendung Sample Interactive Grids, welche verschiedenste Anwendungsvarianten des Interactive Grid zeigt - wer also wissen möchte, wie diese neue Komponente in eigenen Anwendungen verwendet werden kann, ist dort genau richtig. Aber auch andere Beispielanwendungen wurden aktualisiert: So zeigen Universal Theme Sample Application und Sample Calendar Anwendung, dass sich auch bei diesen Komponenten eine Menge getan hat. Und das sind nur drei der 40 im Release 5.1 mitgelieferten Anwendungen.

Packaged Application "Sample Calendar"

Packaged Application "Sample Calendar"

In diesem Community Tipp geht es jedoch nicht um die neuen Features, sondern um etwas, was sich mit Application Express 5.1 auch für bestehende Anwendungen ändert: asynchrone Dynamic Actions. Dieser Tipp erläutert den Unterschied zwischen synchronen und asynchronen Dynamic Actions, was ich in 5.1 ändert und was für den Entwickler zu tun ist.

In Application Express 5.0 wurden nur Dynamic Actions, deren Attribut Wait for Result auf No steht, asynchron ausgeführt, ansonsten findet eine synchrone Ausführung statt. Ab Application Express 5.1 werden Dynamic Actions grundsätzlich asynchron ausgeführt. Das bedeutet, dass eine Dynamic Action, die einen AJAX-Aufruf zum Server macht, den Browser nicht mehr blockiert - nachfolgende Aktionen können sofort loslaufen. Eine Dynamic Action führt dann einen AJAX-Request aus, wenn sie SQL-Abfragen oder PL/SQL-Code auf dem Server ausführt. Damit folgt Application Express der allgemeinen Entwicklung von Web-Anwendungen; denn mit asynchron ausgeführten AJAX-Requests ist die Anwendungsseite für den Endanwender flüssiger und prompter.

Ein Problem kann sich allerdings ergeben, wenn eine nachfolgende Aktion (eine andere Dynamic Action) vom Ergebnis des AJAX-Requests abhängig ist - wenn beispielsweise das Ergebnis des AJAX-Requests weiterverarbeitet werden soll.

Das wollen wir uns nun etwas näher ansehen: Erzeugen Sie eine Application Express-Seite mit einer Region und zwei Seitenelementen: P1_HIDDENVALUE und P1_TEXTVALUE. Das erste Element ist, wie der Name schon nahelegt, ein ausgeblendetes (Hidden), das zweite sei ein normales Textfeld. Fügen Sie noch einen Button hinzu. Der Button bekommt den Namen Execute Dynamic Actions und zusätzlich "on Click" zwei Dynamic Actions.

  • Die erste Dynamic Action führt ein Set Value vom Typ SQL Statement durch. Als SQL Statement hinterlegen Sie select sysdate from dual. Das Affected Element ist P1_HIDDENVALUE. Stellen Sie Wait For Result auf Yes und Fire On Initialization auf No.
  • Die zweite Dynamic Action führt ebenfalls ein Set Value, nun allerdings vom Typ Javascript Expression durch. Die Javascript Expression ist apex.item("P1_HIDDENVALUE").getValue(). Affected Element ist nun P1_TEXTVALUE. Stellen Sie auch hier Fire On Initialization auf No.

Es ist klar, was dieses Beispiel bezwecken soll: Die erste Dynamic Action führt den (ab APEX 5.1 asychronen) AJAX-Request durch, die zweite "verarbeitet" das Ergebnis weiter. Im Page Designer wird das ganze wie in etwa wie folgt aussehen:

Beispielseite mit Dynamic Actions

Beispielseite mit Dynamic Actions

Bevor Sie die Seite nun starten, navigieren Sie zu den Gemeinsamen Komponenten, und dort zu den Application Definition Attributes. Stellen Sie den Compatibility Mode Ihrer Anwendung auf 5.0 - und nun starten Sie die Anwendung. Wenn Sie die Seite sehen, klicken Sie den Button Execute Dynamic Action.

Beispielseite mit Dynamic Actions - mit Compatibility Mode 5.0

Beispielseite mit Dynamic Actions - mit Compatibility Mode 5.0

Wenn Sie den Button klicken, wird zunächst die erste Dynamic Action ausgeführt; diese führt einen AJAX-Request zum Server durch und führt dort die SQL-Abfrage aus. In APEX 5.0 wurden Dynamic Actions synchron ausgeführt; der Compatibility Mode führt also dazu, dass die zweite Dynamic Action erst ausgelöst wird, wenn die erste fertig ist. Da das Ergebnis der SQL-Abfrage nun vorliegt, kann es problemlos ins Textfeld P1_TEXTITEM übernommen werden.

Stellen Sie nun den Compatibility Mode in den Gemeinsamen Komponenten auf 5.1 um und starten Sie die Seite nochmals.

Beispielseite mit Dynamic Actions - mit Compatibility Mode 5.1

Beispielseite mit Dynamic Actions - mit Compatibility Mode 5.1

Mit dem Compatibility Mode 5.1 laufen Dynamic Actions asynchron - das bedeutet, dass die zweite Dynamic Action unmittelbar nach dem Auslösen der ersten ausgelöst wird. Das Ergebnis der SQL-Abfrage ist noch gar nicht da - soll aber schon in das Element P1_TEXTITEM übernommen werden, was folgerichtig nicht funktioniert.

Aber was ist mit der Einstellung Wait for Result = Yes, werden nun einige fragen - denn damit wurde doch explizit festgelegt, dass auf diese Dynamic Action gewartet werden soll. Allerdings gilt dies für mehrere Schritte (TRUE oder FALSE Actions) innerhalb der gleichen Dynamic Action. Wenn Sie also beide Dynamic Actions in eine einzige, mit mehreren TRUE Actions, konsolidieren, dann werden Sie das gewünschte Verhalten bekommen - und Application Express wird Wait for Result berücksichtigen.

"Wait For Result" gilt für mehrere Schritte innerhalb einer Dynamic Action

"Wait For Result" gilt für mehrere Schritte innerhalb einer Dynamic Action

Für bestehende Anwendungen in der Praxis wird es wohl meist so sein, dass mehrere Dynamic Actions bislang nacheinander (synchron) ausgeführt wurden und das auch so beabsichtigt war. Mit Application Express 5.1 ergibt sich hier Handlungsbedarf:

  • Der erste Schritt ist sicherlich das Setzen (oder das Belassen) des Compatibility Mode auf 5.0 - so werden die Dynamic Actions vorerst synchron ausgeführt. Allerdings sollte das nur eine Übergangslösung sein. Um neuen Features in Application Express nutzen zu können, wollen Sie den Compatibility Mode ja hochsetzen - und dann müssen die Dynamic Actions angepasst werden.

  • Wenn Sie mehrere Dynamic Actions auf das gleiche Ereignis - und mit den gleichen Bedingungen hinterlegt haben, konsolidieren Sie diese in eine einzige Dynamic Action und setzen Sie Wait For Result auf Yes. Sie bekommen den positiven Nebeneffekt, dass ihre Seite übersichtlicher wird.

  • Wenn es nicht möglich ist, die Dynamic Actions zusammenzufassen, müssen Sie diese für andere Ereignisse setzen. In obigem Beispiel kann die zweite Dynamic Action auch auf das Ereignis Change des Elements P1_HIDDENVALUE gesetzt werden. Dann wird sie ausgelöst, wenn P1_HIDDENVALUE mit dem Ergebnis der SQL-Abfrage gesetzt wird - Sie haben dann eine auch asynchron funktionierende Abfolge von Dynamic Actions - quasi nach Lehrbuch.
    Asynchrone Abfolge von Dynamic Actions: "P1_TEXTVALUE" wird on change of "P1_HIDDENVALUE" gesetzt

    Asynchrone Abfolge von Dynamic Actions: "P1_TEXTVALUE" wird on change of "P1_HIDDENVALUE" gesetzt


  • Achten Sie besonders auf Dynamic Actions, die einen AJAX-Request durchführen und die Before Page Submit ausgeführt werden. Wenn der Compatibility Mode auf 5.1 steht, findet der Page Submit statt, bevor der AJAX-Request fertig ist und bestimmte Element werden nicht korrekt an nachfolgende Seiten übergeben. Untersuchen Sie hier, ob die Dynamic Action überhaupt das Richtige ist - im Falle eines Set Value wäre eine serverseitige Computation wahrscheinlich die bessere Alternative.

  • Wenn Ihre Dynamic Actions keine AJAX-Requests ausführen, wie Show oder Hide, können Sie entspannen; hier gibt es nichts zu tun.

Fazit

Mit der Umstellung von Dynamic Actions auf asynchrone Ausführung folgt Application Express dem allgemeinen Trend in der Web-Entwicklung - die asynchrone Ausführung hat viele Vorteile. Ist der Compatibility Mode der Anwendung auf 5.0 gestellt, so ändert sich nichts - die Dynamic Actions werden genauso ausgeführt wie zuvor.

Entwickler sollten sich ihre Anwendungen dennoch ansehen, die Dynamic Actions "fit" für die asychrone Ausführung machen, um so den Compatibility Mode schließlich auf 5.1 hochsetzen zu können. Weitere, wichtige Informationen zum neuen Application Express Release finden sich in der Dokumentation und in den Release Notes.

Zurück zur Community-Seite