Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_apex

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

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
  • Die Apex-Engine wird in der Datenbank ausgeführt, Webserver dient nur zur Kommunikation mit der DB
  • Alle Seiten in Apex sind in einem Meta Modell hinterlegt, d.h. das Erzeugen des HTML Codes erfolgt im Moment des Zugriffes auf die Seite

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

  • Alle POST Requests ⇒ wwv_flow.accept
  • Alle GET Requests ⇒ wwv_flow.show
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
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

Authorisierung in Apex

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

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

  • Column als Link definieren, Link Eigenschaften hinterlegen
  • Link Text
      <span class="t-Icon t-Icon--left fa fa-circle-arrow-in-north" aria-hidden="true"></span>
      <span class="t-Button-label">#KUNDENNUMMER#</span>
      <span class="t-Icon t-Icon--right fa fa-circle-arrow-in-north" aria-hidden="true"></span>   
  • Link Attributes
    class="t-Button t-Button--simple t-Button--stretch t-Button--icon t-Button--iconLeft"

CSV Export

JavaScript Integration

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

Spinner (Sanduhr anzeigen) über eine Dynamic Action

  • Auf globaler Ebene die Variable definieren wie var $oidSpinner=null
  • In der ersten Dynamic Action : $oidSpinner = apex.util.showSpinner( $( „#RECHECK_OID_CONTAINER“ ) );
  • In der zweiten Dynamic Action wieder ausschalten :$oidSpinner.remove();

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:

  • Page für die Hilfe als „No-Modal Dialog“ anlegen, z.b. Page „Help“ mit der ID 900
    • Hidden Page Item fürdie Übergabe der SeiteNr aus der die Hilfe angewählt wurde, z.B. P900_APP_PAGE_ID
    • „PL/SQL Dynamic Content“ Region auf der Seite anlegen mit:
      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
      	);
    • „Close“ Button zum Schließen der Seite einfügen (Schließen über „Dynamic Action“ realisieren)
  • ÜBer „Shared Components/Navigation Bar List“ die „Desktop Navigation Bar“ öffnen und einen neuen List Entry hinzufügen
    • Eintrag „Help“ nennen, je nach Geschmack ein Icon hinterlegen
    • Über „Set these items“ auf die P900_APP_PAGE_ID verweisen und mit „With these values“ die Seiten NR mit „&APP_PAGE_ID.“ hinterlegen
  • Über den Help Link wird nun die Hilfeseite aufgerufen und zeigt den in der Seite hinterlegten Text an

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

  • Check Box Item wie z.B. P43_SHOW_DEBUG anlegen und mit Werten versorgen, z.b. über eine Static list wie
    STATIC:WARN;WARN,INFO;INFO,DEBUG;DEBUG
  • Default für diese Liste mit einer „Computations“ auf dem Page Item anlegen
    • Static Value wie hinterlegen
      INFO:WARN
    • Damit jezt das nur bei ersten Page Load wirkt und nicht jedesmal die Werte des Anwenders überschrieben werden, eine „Condition“ setzen, das nur wenn das „ITEM is NULL“ der Default wert angesetzt wird.
  • Die Werte der Checkbox werden als String mit „:“ getrennt übergeben, daher nun in SQL das ganze so refernzieren
     ... AND instr(':'||:P43_SHOW_DEBUG||':',log_level) > 0 

Validierung auf Item Ebene

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

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

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
"Autor: Gunther Pipperr"
prog/oracle_apex.txt · Zuletzt geändert: 2019/12/23 10:18 von gpipperr