Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_apex

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
prog:oracle_apex [2019/12/23 09:44]
gpipperr [Timining in der Oberfläche]
prog:oracle_apex [2019/12/23 10:18] (aktuell)
gpipperr [Plugin Entwicklung]
Zeile 1: Zeile 1:
 +=====Oracle Apex 5 - Anmerkungen zum Einsatz und zur Entwicklung=====
 +
 +Zurück zur Übersicht über alle Artikel => [[:apex|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 [[https://docs.oracle.com/cloud/latest/db121/HTMDB.pdf|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
 +
 +  * [[prog:oracle_apex_install_windows_12c|Oracle Apex 5.0.3 mit der Oracle Datenbank 12c - Installation]]
 +
 +
 +Oder einfach kostenlos in der Cloud unter https://apex.oracle.com nützen. 
 +
 +----
 +
 +====Upgrade====
 +
 +Welche Version ist gerade im Einsatz?
 +<code sql>
 +select version_no 
 +  from apex_release
 +/
 +select version 
 +   from dba_registry 
 +  where comp_name = ‘Oracle Application Express’
 + /
 +</code>
 +
 +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
 +
 +  * [[prog:oracle_apex_upgrade_5_1|Upgrade von Oracle 5.0 auf Oracle Apex 5.1 ]]
 +
 +
 +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.
 +
 +  * [[prog:first_steps_oracle_rest_data_service|Oracle ORDS 3.0 (Oracle REST Data Services) mit APEX 5.0 und als REST Interface verwenden]]
 +  * [[prog:oracle_rest_data_service_tomcat|Oracle ORDS 3.0 (Oracle REST Data Services) mit dem Apache Application Server Tomcat unter Windows 2012 betreiben]]
 +  * [[prog:oracle_rest_data_service_multiple_databases|Oracle ORDS 3.0 (Oracle REST Data Services) für mehrere APEX Datenbank Instancen betreiben]]
 +
 +----
 +
 +
 +=== Microsoft AD Integration ===
 +
 +Apex läßt sich auch sehr gut in die Microsoft Welt integrieren
 +
 +  * [[prog:oracle_apex_active_directory_integration|Oracle Apex 5 Securtiy und Microsoft Active Directory Integration]]
 +
 +----
 +
 +
 +=== 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
 +
 +
 +  * [[prog:apex_mail_acl|Apex 5.0 - Mail Versandt - Hinterlegen der richtigen ACL's in 11g und 12c]]
 +
 +----
 +
 +
 +==== 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:
 +<code sql>
 +select application_id
 +      ,application_name
 +      ,count(page_id) 
 + from APEX_050000.APEX_APPLICATION_PAGES 
 +group by application_id,application_name order by 1
 +/
 +</code>
 +
 +----
 +
 +==== 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:
 +
 +<code>
 +
 +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
 +
 +</code>
 +
 +
 +
 +==htp und htf ==
 +
 +
 +Der wichtige Kern hinter APEX (ehemals WEBDB) ist das [[https://docs.oracle.com/database/121/ARPLS/w_htp.htm#ARPLS391|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:
 +<code plsql>
 +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;
 +/
 +</code>
 +In diesem einfachen Beispiel muss die Prodedure unter dem APEX_PUBLIC_USER liegen.
 +
 +Um den direkten Zugriff einzuschränken
 +[[https://docs.oracle.com/cd/E56351_01/doc.30/e56293/config_file.htm#AELIG7162|security.inclusionList]] des ORDS eine Sicherheitsregel hinterlegt werden, welche Packages erlaubt sind!
 +
 +==owa_util==
 +
 +Das [[https://docs.oracle.com/database/121/ARPLS/w_util.htm|OWA_UTIL]] Package ist sehr praktisch um sich die CGI Variablen eines HTTP Requests anzuzeigen.
 +
 +Beispiel:
 +
 +<code plsql>
 +-- alle CGI Variablen anzeigen
 +OWA_UTIL.PRINT_CGI_ENV;
 +</code>
 +
 +
 +== Apex Util==
 +
 +siehe https://docs.oracle.com/database/121/AEAPI/apex_util.htm#AEAPI101
 +
 +== Aktuellen APEX User erkennen ==
 +
 +<code sql>
 +select SYS_CONTEXT('APEX$SESSION', 'APP_USER') from dual;
 +</code>
 +
 +----
 +
 +===== 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 [[dba:oracle_text|Oracle Text]].
 +
 +
 +----
 +
 +
 +==== Oracle Text einbinden ====
 +
 +Siehe => [[prog:oracle_apex_oracle_text_document_archive|Mit Oracle APEX 5 und Oracle Text ein Dokumentenarchive für technische Dokumentation aufbauen]]
 +
 +
 +----
 +
 +==== Authorisierung in Apex====
 +
 +Siehe => [[prog:oracle_apex_active_directory_integration|Mit Oracle APEX 5 Security and das Active Directory]]
 +
 +
 +  * [[prog:oracle_apex_show_my_user_information|Oracle Apex 5 - Wer bin ich? Dialog]]
 +
 +
 +
 +  * [[prog:apex_authorization_scheme_plsql|Oracle Apex 5 - Authorization Scheme in PL/SQL umsetzen]]
 +
 +
 +  * [[prog:apex_authorization_scheme_protect_link|Oracle Apex 19 - einen Link in einem Report mit einem Authorization Scheme schützen]]
 +
 +
 +----
 +
 +==== 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.
 +
 + * [[prog:oracle_apex_show_runtime_enviroment_prd_tst|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):
 +<code plsql>
 +
 +-- 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');
 +          
 +</code>
 +
 +Ab Version 18 mit "apex_app_settings", damit kann auf den Dummy User Kontext verzichtet werden.
 +
 +----
 +
 +==== Interactive Grid ====
 +
 +  * [[prog:oracle_apex_interactive_gird|Oracle Apex 5 - Interactive Grid anpassen und konfigurieren -  DML ändern]]
 +
 +
 +Sehr hilfreiche Seiten um mit JavaScript den IG anzupassen:
 +
 +
 +  * http://hardlikesoftware.com/weblog/2017/01/18/how-to-hack-apex-interactive-grid-part-1/
 +  * http://hardlikesoftware.com/weblog/2017/01/24/how-to-hack-apex-interactive-grid-part-2/
 +  * http://hardlikesoftware.com/weblog/2017/02/20/how-to-hack-apex-interactive-grid-part-3/
 +  * http://hardlikesoftware.com/weblog/2017/03/31/how-to-hack-apex-interactive-grid-part-4/
 +
 +
 +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:
 +<code javascript>
 +
 +//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);
 +}
 +
 +</code>
 +Nur ein Denkanstoß, produktiv muss das schöner werden.
 +
 +
 +Optionen per Java Script anpassen:
 +<code javascript>
 +// 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;
 +}
 +
 +</code>
 +----
 +==== Session State anzeigen lassen ====
 +
 +View apex_application_page_items verwenden!
 +
 +SQL:
 +<code 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
 +</code>
 +
 +
 +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:
 +<code sql>
 +select null link
 +      , user_name
 +      , count(*) as count  
 + from APEX_WORKSPACE_SESSIONS 
 +where workspace_name='GPI'
 +group by null,user_name
 +</code>
 +
 +
 +----
 +
 +
 +==== 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.
 +
 +  * [[prog:apex_classic_report_use_alert_card_layout|Oracle Apex 5 - Mit CSS Alert Layout vom Classic Report anpassen]]
 +
 +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:
 +<code css>
 +div.P900_USER_INFO{
 +   border-top: thick double #c7d3d3;
 +}
 +</code>
 +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:
 +<code css>
 + td[headers="ROOMS"] {
 +   color: red;
 +   font-weight: bold;
 +
 +}
 +</code>
 +
 +HTML Expresion nützen, zum Beispiel um einen Umbruch zu verbieten:
 +<code css><span style="white-space: nowrap;">#LOG_TIMESTAMP#</span></code>
 +
 +
 +Ein Input Field vor Benutereingaben schütze
 +Advanced/Custom Attribute:
 +<code>
 +readonly="readonly" 
 +</code>
 +
 +
 +
 +ThemeRoller einsetzen:
 +
 +  * => https://apex.oracle.com/pls/apex/germancommunities/apexcommunity/tipp/4261/index.html
 +
 +
 +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
 +
 +===  Link als Button in einem Classic Report darstellen ===
 +
 +  * Column als Link definieren, Link Eigenschaften hinterlegen
 +  * Link Text <code html>
 +  <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>   </code>
 +  * Link Attributes <code html>class="t-Button t-Button--simple t-Button--stretch t-Button--icon t-Button--iconLeft"</code>
 +
 +----
 +
 +
 +==== CSV Export ====
 +
 +Ausgehend von diesem Artikel http://www.apex-at-work.com/2015/02/custom-csv-export-in-apex.html => 
 +
 +  * [[prog:plsql_spool_csv_apex|Oracle PL/SQL - APEX - CSV Datei aus der DB mit DBMS_XMLGEN.CONVERT erzeugen]]
 +
 +----
 +
 +
 +==== JavaScript Integration ====
 +
 +
 +Durch die Integration von JQuery kann sehr einfach mit JavaScript in Apex gearbeitet werden.
 +
 +  * [[prog:apex_jquery_integration|Oracle Apex 5 -Mit JQuery die Logik und Optik einer Apex Page anpassen]]
 +
 +
 +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:
 +<code plsql>
 +...
 + apex_application.g_print_success_message := '<span style="color:yellow">'|| v_message || '</span>';
 +...
 +</code>
 +
 +Erzeugt eine Message Box auf der Seite
 +
 +
 +----
 +
 +
 +==== Hilfe Texte einbinden ====
 +
 +Tooltip auf einem Page Item Element:
 +<code javascript>
 +$('#STOP_CALC_RUN').attr('onmouseover',"toolTip_enable(event,this,'Meine Tipp')");
 +</code>
 +Code in der Seite auf Page Ebene „JavaScript/Execute when Page Loads“ einfügen 
 +
 +Oder als "Advanced/Custom Attribute" auf Element Ebene:
 +<code javascript>
 +onmouseover="toolTip_enable(event,this,'Mein Tipp')"
 +</code>
 +
 +
 +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:<code plsql> 
 +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
 + );
 +</code>
 +    * "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:
 +  * https://docs.oracle.com/cd/E59726_01/doc.50/e39149/apex_app.htm#AEAPI217
 +  * https://storm-petrel.com/orablog/2016/01/20/oracle_apex_help_page/
 +
 +
 +----
 +
 +==== AJAX ====
 +
 +
 +  * http://tpetrus.blogspot.de/2013/03/ajax-calls-in-apex-examples.html
 +  * http://tpetrus.blogspot.de/2013/03/ajax-in-apex-introduction-and-techniques.html
 + 
 +
 +
 +
 +----
 +
 +==== 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.
 +
 +
 +
 +  * [[prog:apex_modal_region|Oracle Apex 5 - Modale Region auf einer Apex Seite für einen Detail Dialog verwenden]]
 +
 +Alternativ, falls mehr Logik notwendig ist eine eigene Seite verwenden:
 +
 +  * [[prog:apex_modal_page|Oracle Apex 5 - Modale Page auf einer Apex Seite für einen Detail Dialog 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 <code bash>STATIC:WARN;WARN,INFO;INFO,DEBUG;DEBUG</code>
 +  * Default für diese Liste mit einer "Computations" auf dem Page Item anlegen
 +    * Static Value wie hinterlegen <code bash>INFO:WARN</code> 
 +    * 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 <code sql> ... and instr(':'||:P43_SHOW_DEBUG||':',log_level) > 0 </code>
 +
 +
 +=== Validierung auf Item Ebene ===
 +
 +Creating a Validation for a Page Item
 +=> https://docs.oracle.com/database/121/HTMDB/bldr_validate.htm#HTMDB28931
 +
 +Mehr:
 +  * http://nerd.net.au/oracle/49-apex-application-express/validation-regex/108-email-regex-validation
 +
 +
 +----
 +
 +==== 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 [[prog:oracle_multimedia_12c|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.
 +
 +  * [[prog:oracle_apex_5_file_handling| Datei Handling in Oracle APEX 5]]
 +
 +----
 +
 +
 +==== 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:
 +<code plsql>
 +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'
 +/
 +</code>
 +
 +
 +----
 +
 +==== 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 => [[:oracle_bi_publisher#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 [[prog:oracle_apex_jasper_reports|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===
 +
 +  * [[http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/apex/r50/PDF%20Printing/Creating%20PDF%20Reports%20with%20Oracle%20Application%20Express%205.0%20and%20Oracle%20REST%20Data%20Services.html|Creating PDF Reports with Oracle Application Express 5.0 and Oracle REST Data Services]]
 +
 +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:
 +<code>
 +<entry key="misc.enableOldFOP">true</entry> 
 +</code>
 +
 +Aber noch keine Besserung
 +
 +===Integration Oracle Reports===
 +
 +  * http://uae-apex.blogspot.de/2016/01/integration-apex-and-oracle-report.html
 +  * http://www.oracle.com/technetwork/developer-tools/apex/howto-integrate-oracle-reports-097845.html
 +
 +----
 +
 +===== Apex Source Code Handling =====
 +
 +Apex Utility APEXExport.class verwenden um täglich das ganze in ein Git Repository einzuschecken.
 +
 +siehe => [[prog:apex_export_source_code_and_git|Oracle Apex Source Code automatisch exportieren und einchecken mit Git unter Windows]]
 +
 +Export:
 +<code powershell>
 +
 +# 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
 +
 +</code> 
 +
 +
 +Spilt into Files:
 +
 +<code powershell>
 +
 +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
 +</code>
 +
 +
 +----
 +
 +==== Weitere Themes ====
 +
 +
 +
 +Material APEX - responsive theme => https://materialapex.com/pls/apex/f?p=12192:
 +
 +
 +
 +----
 +
 +===== Rechte / Rollen / Authentifizierung ====
 +
 +
 +Wie führt APEX SQL Abfragen aus?
 +
 +  * https://joelkallman.blogspot.com/2010/08/application-express-and-parsing-of-sql.html
 +  * https://community.oracle.com/message/928724?tstart=0#926724
 +  * https://mikesmithers.wordpress.com/2014/11/15/apex-and-privileges-granted-through-roles/
 +  * https://de.slideshare.net/DimitriGielis/real-application-security-ras-and-oracle-application-express-apex
 +    * http://dgielis.blogspot.com/2015/04/enable-real-application-security-ras-in.html
 +
 +
 +
 +RAS
 +  * http://dgielis.blogspot.com/2015/04/enable-real-application-security-ras-in.html
 +
 +VPD
 +  * https://jeffkemponoracle.com/2019/03/oracle-workspace-manager-apex-vpd/
 +  * https://www.doag.org/formes/pubfiles/9626052/2017-DEV-Markus_Geis-APEX_-_LDAP__OUD__-_VPD-Praesentation.pdf
 +
 +
 +Verhalten von DB Links in Oracle Apex für Sicherheitskonzepte nützen 
 +  * https://www.oracle.com/webfolder/technetwork/de/community/apex/tipps/enableapexroles/index.html
 +
 +
 +
 +
 +
 +----
 +
  
"Autor: Gunther Pipperr"
prog/oracle_apex.txt · Zuletzt geändert: 2019/12/23 10:18 von gpipperr