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
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.
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!
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.
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:::::
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.
Apex läßt sich auch sehr gut in die Microsoft Welt integrieren
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
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 /
Das Basis Package ist WWV_FLOW
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
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!
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;
SELECT SYS_CONTEXT('APEX$SESSION', 'APP_USER') FROM dual;
Folgende Grundregeln sollten bei der Entwicklung beachtet werden:
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.
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
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.
Siehe ⇒ Mit Oracle APEX 5 und Oracle Text ein Dokumentenarchive für technische Dokumentation aufbauen
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
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.
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; }
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.
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
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
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
class="t-Button t-Button--simple t-Button--stretch t-Button--icon t-Button--iconLeft"
Durch die Integration von JQuery kann sehr einfach mit JavaScript in Apex gearbeitet werden.
Spinner (Sanduhr anzeigen) über eine Dynamic Action
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
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:
APEX_APPLICATION.HELP ( p_request => NULL , p_flow_id => :APP_ID, p_flow_step_id => :P900_APP_PAGE_ID, p_show_item_help => 'YES', p_show_regions => 'YES', p_before_page_html => NULL, p_after_page_html => NULL, p_before_region_html => NULL, p_after_region_html => NULL, p_before_prompt_html => NULL, p_after_prompt_html => NULL, p_before_item_html => NULL, p_after_item_html => NULL );
Quellen:
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.
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/
STATIC:WARN;WARN,INFO;INFO,DEBUG;DEBUG
INFO:WARN
... AND instr(':'||:P43_SHOW_DEBUG||':',log_level) > 0
Creating a Validation for a Page Item ⇒ https://docs.oracle.com/database/121/HTMDB/bldr_validate.htm#HTMDB28931
Mehr:
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
Wie können Dateien wie Excel File oder Zip in Oracle APEX per Weboberfläche geladen und verarbeitet werden.
Ü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' /
Wird in der URL dieser Parameter hinerlegt wird für die Session auf der Datenbank ein Trace angelegt.
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
Einführung ⇒ https://jeffkemponoracle.com/2019/11/getting-started-with-apex-plugins/
media Plugin: https://apexmediaextension.com/
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.
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
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
Material APEX - responsive theme ⇒ https://materialapex.com/pls/apex/f?p=12192:1
Wie führt APEX SQL Abfragen aus?
RAS
VPD
Verhalten von DB Links in Oracle Apex für Sicherheitskonzepte nützen