Inhaltsverzeichnis

Oracle Apex 5 - Anmerkungen zum Einsatz und zur Entwicklung

Zurück zur Übersicht über alle Artikel ⇒ Allgemein Übersicht und Zusammenfassung

Oracle Apex - Oracle Application Express ermöglicht es, in der Datenbank deklarativ und auf Basis von SQL und PL/SQL komplexe Webanwendungen zu erstellen. ⇒ https://apex.oracle.com/de/

Der gesamte Apex Code liegt dabei in der Datenbank in einem Meta Repository und ist damit voll in die Oracle Welt integriert.

Oracle Apex ist inzwischen eine sehr komplexes Produkt von Oracle, allein das Handbuch von Oracle hat über 1000 Seiten.

In dieser Zusammenfassung soll auf die generelle Architektur und wichtige Grundeingenschaften eingegangen werden.

Im Detail liegen im Internet zu den einzelnen Fragestellungen sehr umfangreiche Dokumentationen vor.

Apex 5.1 Orginal Doku ⇒ https://docs.oracle.com/database/apex-5.1/HTMDB/HTMDB.pdf


Wie anfangen?

Mit Apex 5 hat der Entwickler nun so vielen Möglichkeiten, das die Schwierigkeit darin liegt zu entscheiden wie was am besten gelöst werden soll.

Soll der Entwickler möglichst viel in Pl/SQL implementieren oder doch besser in JavaScript die Logik der Applikation verbauen? Ajax und Json einsetzen? Rest Data Servcies integrieren?

Diese Frage ist nicht so einfach zu beantworten, und liegt wohl auch stark am Know-how und der Erfahrung des Entwicklers.

Ist viel Erfahrung mit JQuery vorhanden, ist schnell etwas schönes in der Oberfläche entwickelt, ist PL/SQL und Forms der Hintergrund des Entwicklers sollte sich die Logik der Applikation auch sehr gut in der Datenbank abbilden lassen.

Allerdings sollte der doch sehr einfache Start mit Apex nicht dazuführen, dass später die Wartbarkeit stark leidet da die Technologien Kreuz und Quer gemischt werden.

Das viel interaktiv mit dem Page Designer zusammen gestellt wird , ist es hilfreich sich für den Einstieg eines der diversen Video Tutorials (siehe Quellen) anzusehen.


Lizenz

Wie bei jeden Oracle Produkt im ersten Schritt die Lizenzfrage abklären!

Die gute Nachricht, Apex kann in jeder Edition von Oracle kostenfrei eingesetzt werden!

Ein wirkliche Perle unter den Oracle Produkten!

Support: https://www.oracle.com/technetwork/developer-tools/apex/application-express/apex-support-1866620.html


Installation

Oracle Apex besteht aus den Datenbank Objekten, Bildern, Stylesheet und Java Script Libraries

Oder einfach kostenlos in der Cloud unter https://apex.oracle.com nützen.


Upgrade

Welche Version ist gerade im Einsatz?

SELECT version_no 
  FROM apex_release
/
SELECT version 
   FROM dba_registry 
  WHERE comp_name = ‘Oracle Application Express’
 /

Seit 21.12.2016 ist die Version 5.1 von Apex verfügbar. ( inzwischen 11.2019 sind wir schon auf 19.2 .-) )

Bzgl. Neuer Feature siehe https://docs.oracle.com/database/apex-5.1/HTMRN/toc.htm#HTMRN-GUID-D6D545CB-3ECD-468A-9E7F-8CC09F7F478B bzw. jetzt https://docs.oracle.com/en/database/oracle/application-express/index.html

Was ist neu/geändert ⇒ https://apex.mt-ag.com/apex/f?p=279:1:::::


Betrieb

Oracle Apex kann zwar zur Not auch direkt mit dem integrierten HTTP Listener der Datenbank betrieben werden, besser ist aber der Einsatz der ORDS, des Oracle Rest Data Service.


Microsoft AD Integration

Apex läßt sich auch sehr gut in die Microsoft Welt integrieren


Mail Versandt

Um Mails aus der Apex Umgebung zu versenden muss der Mail Server auf Apex Instance Ebene hinterlegt werden. Damit das dann auch funktioniert sind in der DB die Entsprechenden ACLS notwendig


Architektur von Apex

Grundlagen

Siehe zum Beispiel hier ⇒ http://hardlikesoftware.com/weblog/2016/06/08/interactive-grid-under-the-hood/

Da Apex auf einem Meta Modell basiert, kann das auch sehr einfach abgefragt werden.

Z.b. wie viele Seiten hat meine Applikationen:

SELECT application_id
      ,application_name
      ,COUNT(page_id) 
 FROM APEX_050000.APEX_APPLICATION_PAGES 
GROUP BY application_id,application_name ORDER BY 1
/

Die PL/SQL Package hinter Apex

WWV - Web View

Das Basis Package ist WWV_FLOW

Procedure f

Der Einstieg in einen Apex Seite erfolgt immer über die Procedure f, diese löst die Parameter auf und ruf die entsprechende Apex Seite auf.

F ist ein Mapper auf die wwv_flow.show.

So sind folgende Aufrufe ähnlich:

http://localhost/ords/f?p=100:2:23232323::::P10_RECNO:1234


http://localhost/ords/wwv_flow.show?
 p_flow_id=100
 &p_flow_step=2
 &p_instance=23232323
 &p_arg_names=P10_RECNO
 &p_arg_value=1234
htp und htf

Der wichtige Kern hinter APEX (ehemals WEBDB) ist das htp/htf Package

Mit einer Art mod_plsql habe ich damit bereits um 1998 komplette Webanwendungen entwickelt, im Prinzip wie JSP Seiten, es sendet in unendlich schwer wartbaren Code das ein heilloses Durcheinander von Programmlogik und HTML Code entsteht.

Aber für einzelne Ausgaben ist das auch heute noch sehr wertvoll um individuelle Anpassungen an die Apex Vorlagen zu erzielen.

Beispiel:

CREATE OR REPLACE PROCEDURE APEX_PUBLIC_USER.webpageGPI
AS
BEGIN
	htp.htmlopen;
	htp.bodyopen;
 
	htp.p ('Hello World from PL/SQL');
 
	htp.bodyclose;
	htp.htmlclose;
END;
/

In diesem einfachen Beispiel muss die Prodedure unter dem APEX_PUBLIC_USER liegen.

Um den direkten Zugriff einzuschränken security.inclusionList des ORDS eine Sicherheitsregel hinterlegt werden, welche Packages erlaubt sind!

owa_util

Das OWA_UTIL Package ist sehr praktisch um sich die CGI Variablen eines HTTP Requests anzuzeigen.

Beispiel:

-- alle CGI Variablen anzeigen
OWA_UTIL.PRINT_CGI_ENV;
Apex Util

siehe https://docs.oracle.com/database/121/AEAPI/apex_util.htm#AEAPI101

Aktuellen APEX User erkennen
SELECT SYS_CONTEXT('APEX$SESSION', 'APP_USER') FROM dual;

Apex Seiten entwickeln

Folgende Grundregeln sollten bei der Entwicklung beachtet werden:

Page ID Logik

Zu Beginn eine Logik für die Vergabe der Page ID's im Team vereinbaren, am besten mit 4 Stelligen Page Nummer arbeiten und die ersten zwei Stellen für die fachliche Gruppierung verwenden, die nächste zwei Stellen für die Seiten für die jeweilige Aufgabe, wie 1010 etc.

Pages zu Group zuordnen

Page Group, sortiert nach der Logik der Applikation, anlegen und jede Page einer Gruppe zuordnen Die Page Groups orientieren sich dann auch wieder an den ersten zwei Stellen der Page ID

Name der Page Items

Page ID IMMER in die Name der Page Items aufnehmen, damit im Stag der aktuellen Sessoin immer Eindeutigkeit über die gesamte Applikation gewährleistet ist

Der Trick hinter der Apex Entwicklung ist das Einbeziehen der ganze SQL und PL/SQL Technologie der Oracle Datenbank wie Oracle Text.


Oracle Text einbinden

Siehe ⇒ Mit Oracle APEX 5 und Oracle Text ein Dokumentenarchive für technische Dokumentation aufbauen


Authorisierung in Apex

Siehe ⇒ Mit Oracle APEX 5 Security and das Active Directory


Prod und DEV in Apex unterscheiden

In einer größeren Umgebung wird die Apex Umgebung auf DEV entwickelt und auf PRD betrieben.

Da die Anwendung in beiden Umgebungen gleich aussieht soll ein Banner im Kopfbereich der Seite den Anwender darauf hinweisen wo er sich befindet.

* Oracle Apex 5 - Die aktuelle Umgebung per Banner auf allen Seiten anzeigen

Umgebung als Setting in der App hinterlegen

Vor Version 18 mit APEX_UTIL.SET_PREFERENCE (normalerweise für User Settings gedacht):

-- persistieren
 
APEX_UTIL.SET_PREFERENCE(  p_preference => 'APP_RUNTIME_ENV_NAME'
			  , p_value      => 'PROD'
			  , p_user       => 'ALL'); 
 
 
-- Wieder einlesen
:GLOBAL_ENV_NAME:= APEX_UTIL.GET_PREFERENCE(      
        p_preference => 'APP_RUNTIME_ENV_NAME',
        p_user       => 'ALL');
 

Ab Version 18 mit „apex_app_settings“, damit kann auf den Dummy User Kontext verzichtet werden.


Interactive Grid

Sehr hilfreiche Seiten um mit JavaScript den IG anzupassen:

Siehe auch ⇒ https://github.com/mgoricki/orclapex-ig-cheat-sheet

Siehe auch http://www.explorer.uk.com/getting-grips-apex-interactive-grid-api/

Z.b. über eine Dynamic Action auf einem Element um einen Schlüssel der aktuellen Zeile herauszubekommen:

//Referenzen auf das Modell holen
//zuvor hier eine static ID hinterlegen!
 
var igrid   = apex.region("PARAM_TAB").widget();
var view    = igrid.interactiveGrid("getViews","grid");
var model   = igrid.interactiveGrid("getViews","grid").model;
 
 
// Referenz auf das Datenmodell
 
//alternativ auf einmal
var view = apex.region("PARAM_TAB").widget().interactiveGrid("getViews", "grid")
 
// die aktuelle erste ausgewählte Zeile
 
record1 = view.getSelectedRecords()[0]
 
// mit dem 12 Element was tun
console.log(record1[12]);
 
$s('P1_AKT_PATT_NK',record1[12]);
 
// über alle iterieren
 
var selectedRecords = view.view$.grid("getSelectedRecords");
 
for (idx=0; idx < selectedRecords.length; idx++) {
    records = model.getRecord(selectedRecords[idx][0]);
    recval= model.getValue(records,"AKT_PATT_NK");
    console.log(recval);
}

Nur ein Denkanstoß, produktiv muss das schöner werden.

Optionen per Java Script anpassen:

// alle Optionen auslesen
apex.region("PARAM_TAB").widget().interactiveGrid("option").config;
 
//über das JavaScript Code Attibute setzen
 
function( options ) {
    options.toolbar = options.toolbar || {};
 
    options.toolbar = false;
    return options;
}

Session State anzeigen lassen

View apex_application_page_items verwenden!

SQL:

SELECT  page_name
      , page_id
      , item_name
      , display_as
      , component_comment
      , apex_util.get_session_state(item_name) session_value      
FROM  apex_application_page_items
WHERE application_id = :APP_ID
ORDER BY page_id,page_name

Z.B. in einer Modalen Seite und die Page ID übergeben, dann hat man ein Info Fenster pro Seite.

Wer ist gerade angemeldet

Um das zum Beispiel in einer Bar Chart anzuzeigen:

SELECT NULL link
      , user_name
      , COUNT(*) AS COUNT  
 FROM APEX_WORKSPACE_SESSIONS 
WHERE workspace_name='GPI'
GROUP BY NULL,user_name

Charts in Apex 5

Siehe diese gute Übersicht über die ganzen Möglichkeiten ⇒ https://apex.oracle.com/pls/apex/f?p=10800:3:0: bzw. https://apex.oracle.com/pls/apex/f?p=42:1902:::NO:::

Gant Charts ⇒ https://apex.oracle.com/pls/apex/f?p=36648:LOGIN


CSS in APEX 5

Mit CSS Können gut Eigenschaften auf der Seite angepasst werden.

Auf den Page Elementen können Klassen Namen definiert werden, diese können dann mit einen CSS angesprochen werden.

Zum Beispiel sollen über bestimmten Item eine Linie eingefügt werden:

div.P900_USER_INFO{
   border-top: thick double #c7d3d3;
}

Dazu wird in jedem Item eine CSS Klasse „USER_INFO“ hinterlegt, hier in Großbuchstaben und mit Page ID, damit gleich klar ist das hier eine Anpassung per Hand durchgeführt wurde!.

Alle Zellen einer Tabelle die Schriftfarbe anpassen:

 td[headers="ROOMS"] {
   color: red;
   font-weight: bold;
 
}

HTML Expresion nützen, zum Beispiel um einen Umbruch zu verbieten:

<span style="white-space: nowrap;">#LOG_TIMESTAMP#</span>

Ein Input Field vor Benutereingaben schütze Advanced/Custom Attribute:

readonly="readonly" 

ThemeRoller einsetzen:

Schönes Beispiel um Elemente in CSS, wie eine Tabellenüberschrift zu drehen ⇒ https://css-tricks.com/rotated-table-column-headers/

Einstellungen von einer Applikation mit „apex.utr.config()“ ( In A Theme Roller öffnen, in der apex.utr.config(), erzeugten Text kopieren, In App B Theme Roller öffnen und erzeugten Text in der Console ausführen) zu einer anderen kopieren: ⇒ https://reynde.blogspot.de/2015/09/copy-theme-roller-settings-from-one-app.html


CSV Export

Ausgehend von diesem Artikel http://www.apex-at-work.com/2015/02/custom-csv-export-in-apex.html


JavaScript Integration

Durch die Integration von JQuery kann sehr einfach mit JavaScript in Apex gearbeitet werden.

Spinner (Sanduhr anzeigen) über eine Dynamic Action


Meldungstexte von PL/SQL Routinen setzen

Processing\Process Type „PL/SQL Code“

Im PL/SQL Code einfügen:

...
 apex_application.g_print_success_message := '<span style="color:yellow">'|| v_message || '</span>';
...

Erzeugt eine Message Box auf der Seite


Hilfe Texte einbinden

Tooltip auf einem Page Item Element:

$('#STOP_CALC_RUN').attr('onmouseover',"toolTip_enable(event,this,'Meine Tipp')");

Code in der Seite auf Page Ebene „JavaScript/Execute when Page Loads“ einfügen

Oder als „Advanced/Custom Attribute“ auf Element Ebene:

onmouseover="toolTip_enable(event,this,'Mein Tipp')"

Hilfe Texte anzeigen:

Quellen:


AJAX


Modale Dialoge

In Apex gibt es zwei Arten von modalen Aufrufen, eine Region der Seite als Modale Unterseite aufrufen oder eine ganze neue Page als Modale Seite auf der aktuellen Seite starten.

Alternativ, falls mehr Logik notwendig ist eine eigene Seite verwenden:

Um Parameter zwischen den Seiten weiterzugeben, kann natürlich auch über den Session State gearbeitet werden. D.h. das Page ITEM wird im von der „Mutter“ Seite in den Session State geschrieben und kann dann von der „Kind“ Seite via AJAX Call wieder gesetzt werden.


Gui Elemente

Rich Text Editor

Neben den normalen Page Item's wie Text input etc. seht auch ein Rich Text Editor zur Verfügung

siehe z.B ⇒ http://www.explorer-development.uk.com/updated-apex-5-0-rich-text-editor/

Checkboxes

Validierung auf Item Ebene

Creating a Validation for a Page Item ⇒ https://docs.oracle.com/database/121/HTMDB/bldr_validate.htm#HTMDB28931

Mehr:


Bildbearbeitung mit APEX

Wie lässt sich am einfachsten mit Oracle APEX ein Bild Archiv mit Bildbearbeitung aufbauen?

Mit Oracle Multimedia 12c (seit 8i / 11g noch unter dem Namen Oracle interMedia vertrieben) steht dem Apex Entwickler ein reichhaltiges Werkzeug für das Metadaten Handling von Bild und Ton Daten in der Oracle Datenbank zur Verfügung.

Mit der Oracle Multimedia 12c lassen sich die Metadaten und Attribute von Multimedia Daten lesen und setzen und viele Eigenschaften von Bild Dateien, wie Größe, Rotation, Schärfe, Kontrast etc., direkt in der Datenbank bearbeiten. Bestimmte Eigenschaften wie die Farbe eines Bildes lassen sich aus den binären Daten des Bildes ermitteln und werden damit auch suchbar.

Mit diesem umfangreichen Set an Hilfsmitteln lassen sich mit PL/SQL auch komplexere Aufgabenstellung in Oracle Apex relativ einfach integrieren.

Siehe Multimedia in der Oracle Datenbank 12c - Bildbearbeitung in PL/SQL


Datei Upload inkl. Datei Verarbeitung

Wie können Dateien wie Excel File oder Zip in Oracle APEX per Weboberfläche geladen und verarbeitet werden.


APEX User Monitoring/Auditing

Über „apex_workspace_activity_log“ läßt sich gut das User Verhalten der Applikation „überwachen“.

View um die Aktivität der APEX User wie Logins etc. auf einer APEX Seite in der Applikation für das Auditing mit anzeigen:

CREATE OR REPLACE VIEW v_page_75_mon_apex_usage
AS
SELECT apex_user
     , application_name
     , page_id
     , page_name
     , TO_CHAR (view_date, 'dd.mm.yyyy hh24:mi') log_date    
     , log_context
     , ip_address
     , page_view_type
     , error_message
FROM apex_workspace_activity_log
WHERE apex_user != 'ADMIN'
/

Apex Debuggen und Tracen

Parameter &P_TRACE=YES

Wird in der URL dieser Parameter hinerlegt wird für die Session auf der Datenbank ein Trace angelegt.

Timining in der Oberfläche

Mit dem Schlüsselwort „#TIMING#“ im Regions-Footer kann nachvollzogen werden wie lange diese Region benötigt hat.

Gute Einführung ⇒ https://www.doag.org/de/home/news/aufgezeichnet-peter-raganitsch-apex-debugging-101/detail


Plugin Entwicklung

Einführung ⇒ https://jeffkemponoracle.com/2019/11/getting-started-with-apex-plugins/

media Plugin: https://apexmediaextension.com/


Reporting / Drucken

Aus HTML Anwendungen ist das Drucken meist eine Herausforderung, hier ist leider APEX auch keine Ausnahme.

Eine Möglichkeit ist das Erstellen eines Berichts als PDF, das kann dann ausgedruckt werden.

Ein hervorragendes, leider aber auch ein etwas Kostenpflichtiges, Tool ist das zu der Oracle BI Publisher ⇒ Reporting mit der Oracle Datenbank.

Steht dieser nicht zur Verfügung ist eine Alternative auf OpenSource wie Jasper Report auszuweichen ⇒ http://www.opal-consulting.de/apex/f?p=20090928:4:0

⇒ Siehe Mit Oracle APEX 5 und Jasper Reports PDF Dateien erstellen

Schade das Oracle hier nicht eine bezahlbare Apex Edition des Oracle BI Publisher anbietet.

PDF mit ORDS

Funktioniert mit Classic Reports, sieht aber bei größeren Seite etwas seltsam aus.

Hat nur einmal funktioniert, danach nur noch eine leere PDF erhalten.

Laut diversen Einträgen im Netz soll folgender Eintrag in ORDS in der „default.xml“ helfen:

<entry key="misc.enableOldFOP">true</entry> 

Aber noch keine Besserung

Integration Oracle Reports


Apex Source Code Handling

Apex Utility APEXExport.class verwenden um täglich das ganze in ein Git Repository einzuschecken.

siehe ⇒ Oracle Apex Source Code automatisch exportieren und einchecken mit Git unter Windows

Export:

# Umgebung setzen
set-item -path env:CLASSPATH -value "C:\oracle\products\12.2.0.1\dbhome_1\jdbc\lib\ojdbc8.jar;C:\oracle\apex\utilities\"
 
# Hilfe bei Bedarf anzeigen lassen
java  oracle.apex.APEXExport -h
 
# ins Git Repository Verzeichnis wechseln
 
cd c:\lokalRepos\APEX
 
# Source Code exportieren
java  oracle.apex.APEXExport  -db 10.10.10.1:1521:GPI -user system -password xxxxxx -applicationid 100

Spilt into Files:

set-item -path env:CLASSPATH -value "C:\oracle\products\12.2.0.1\dbhome_1\jdbc\lib\ojdbc8.jar;C:\oracle\apex\utilities\"
 
java  oracle.apex.APEXExportSplitter  f100.sql

Weitere Themes

Material APEX - responsive theme ⇒ https://materialapex.com/pls/apex/f?p=12192:1


Rechte / Rollen / Authentifizierung

Wie führt APEX SQL Abfragen aus?

RAS

VPD

Verhalten von DB Links in Oracle Apex für Sicherheitskonzepte nützen