Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

The Power of the Oracle APEX Repository Patrick Wolf, Sphinx IT Consulting DOAG SIG – APEX für Fortgeschrittene, 31.05.2007.

Ähnliche Präsentationen


Präsentation zum Thema: "The Power of the Oracle APEX Repository Patrick Wolf, Sphinx IT Consulting DOAG SIG – APEX für Fortgeschrittene, 31.05.2007."—  Präsentation transkript:

1 The Power of the Oracle APEX Repository Patrick Wolf, Sphinx IT Consulting DOAG SIG – APEX für Fortgeschrittene,

2 Über Sphinx IT Consulting
Gegründet 1993 Erstellung von Individualsoftware Consulting im Bereich Datenbanken & Java Middleware Spezialist im Oracle Umfeld Weitere Informationen auf Über Patrick Wolf 13 Jahre Oracle Erfahrung in SQL, PL/SQL und Oracle Forms Solution Architect bei Sphinx IT Consulting Betreibt einen APEX Blog – Autor des ApexLib Frameworks – Autor des Oracle APEX Builder Plugins Zu erreichen unter

3 Agenda Das Oracle APEX Repository Teil 1 - Die APEX Dictionary Views
Einfache Auswertungen Automatische Dokumentation erstellen APEX Applikation überwachen Generischen Code mithilfe des Repositories erstellen Teil 2 – APEX Repository direkt manipulieren Massenupdates im Repository durchführen Neue Page Items, ... erstellen Fragen & Antworten

4 Das Oracle APEX Repository
Oracle APEX speichert alle Meta-Daten zu einer Applikation in einem Repository in der Datenbank Schema FLOWS_xxx (zB.: FLOWS_030000) Tabellen beginnen mit WWV_FLOW_* Diese Tabellen sind aber (leider) nicht öffentlich. Seit Version 2.2 gibt es eine View Schicht. Die Views haben als Präfix APEX_* Seit 3.0 gibt es auch eine Oberfläche für einfache Abfragen. Zu finden unter Utilities/APEX Dictionary

5 Die APEX Dictionary Views
Zeigen eine „lesbare“ Form der internen APEX Repository Tabellen Kaschieren das weitgehend generischere/alte Datenmodell Machen Lookups für einige Foreign-Keys Übersetzen interne Enumerations ins Englische Beinhalten teilweise Statistikwerte – z.B. Anzahl Kindelemente Berücksichtigen Zugriffsrechte (man sieht nur die Daten seiner Applikationen) Als Schema User: Alle Applikationen der Workspaces denen das Schema zugeordnet ist. Als SYS, SYSTEM, FLOWS_xxx: Alle Applikationen Anderer User: Nichts Sind Public und können daher sowohl in APEX Applikationen verwendet werden als auch in externen Scripts.

6 Die APEX Dictionary Views

7 Die APEX Dictionary Views
Tree Ansicht auswählen

8 Die APEX Dictionary Views
Hierarchische Darstellung

9 Die APEX Dictionary Views
Dokumentation jeder Spalte

10 Die APEX Dictionary Views

11 Die APEX Dictionary Views
Hochkomma nicht vergessen! Zum Ausführen „Go“ Button am Seitenanfang drücken

12 Die APEX Dictionary Views
Unterteilen sich in 3 Bereiche Applikations-Meta-Daten APEX_APPLICATION* Monitoring Daten zu den Applikationen APEX_WORKSPACE_ACCESS_LOG APEX_WORKSPACE_ACTIVITY_LOG APEX_WORKSPACE_LOG_SUMMARY* APEX_WORKSPACE_CLICKS APEX_WORKSPACE_SESSIONS Workspace-Meta-Daten Die restlichen APEX_WORKSPACE* Views wie z.B. APEX_WORKSPACE_APEX_USERS, ...

13 Die APEX Dictionary Views
Wozu kann man diese Views jetzt verwenden? Ein paar Beispiele Überprüfung von Codierrichtlinien Dynamische Generierung von Site-Maps Automatische Dokumentation der Applikation Automatische Überwachung der Applikation Ein paar nette Charts für Zugriffsstatistiken Zur Erstellung von generischen Code Und so weiter...

14 Überprüfung von Codierrichtlinien 1
Bei Page Items soll NICHT das „xxx Label with Help“ Label Template verwendet werden. SELECT APPLICATION_NAME , PAGE_ID , ITEM_NAME , DISPLAY_AS , ITEM_LABEL_TEMPLATE FROM APEX_APPLICATION_PAGE_ITEMS WHERE ITEM_LABEL_TEMPLATE LIKE '%Label with Help' AND DISPLAY_AS <> 'Hidden' ORDER BY APPLICATION_NAME ;

15 Überprüfung von Codierrichtlinien 2
Wurden alle Labels linksbündig ausgerichtet? SELECT APPLICATION_NAME , PAGE_ID , ITEM_NAME , DISPLAY_AS , LABEL_ALIGNMENT FROM APEX_APPLICATION_PAGE_ITEMS WHERE LABEL_ALIGNMENT <> 'Left' AND DISPLAY_AS <> 'Hidden' ORDER BY APPLICATION_NAME ;

16 Überprüfung von Codierrichtlinien 3
Wurden für alle Felder Hilfetexte erfasst, dort wo das „xxx Label with Help“ Template verwendet wurde? SELECT APPLICATION_NAME , PAGE_ID , ITEM_NAME , DISPLAY_AS FROM APEX_APPLICATION_PAGE_ITEMS WHERE ITEM_LABEL_TEMPLATE LIKE '%Label with Help' AND DISPLAY_AS <> 'Hidden' AND ITEM_HELP_TEXT IS NULL ORDER BY APPLICATION_NAME ;

17 Dynamische Site-Maps Eine automatisch generierte Site-Map in die Applikation einbauen. Relevante Seiten im Seiten Kommentar mit $SITEMAP$ markieren. SELECT PAGE_ID , PAGE_TITLE , PAGE_GROUP FROM APEX_APPLICATION_PAGES WHERE APPLICATION_ID = :APP_ID AND INSTR(PAGE_COMMENT, '$SITEMAP$') > 0 ORDER BY PAGE_TITLE ; SQL Report mit obigem SQL Statement erstellen. Bei der Spalte „PAGE_TITLE“ den Link Text auf #PAGE_TITLE# und Page auf #PAGE_ID# setzen. Die Spalte „PAGE_ID“ auf „Hidden“ setzen. Mit Page Groups könnte das ganze Hierarchisch in einem Tree angezeigt werden...

18 Automatische Dokumentation
Wäre es nicht nett, manchmal den Page Flow einer Applikation grafisch zu sehen? Welche Seite ruft welche Seite auf... Wie z.B. beim JDeveloper, wo es Page Flow Seite für JSF Applikationen gibt, die jedoch manuell erstellt werden muss. Um Gegensatz zu anderen Entwicklungsumgebungen, wo das vielleicht irgendwo in XML Dateien oder in Java/... Code gespeichert ist, haben wir alles über einfache SQL Abfragen im Zugriff! Mithilfe von Graphviz, einem Open Source Tool, ist eine grafische Ausgabe kein Problem.

19 Page Flow Generator Analysiert die Meta-Daten einer Applikation wie z.B. Pages, Branches, Buttons, Links- in Report Columns, HTML Regions und SQL Statements. Erstellt ein Beziehungsmodell im Memory und erstellt für jede Page Group ein eigenes Diagram, damit es übersichtlicht bleibt. Das komplizierte daran war Graphviz Syntax Der Page Flow Generator ist Teil des ApexLib Frameworks.

20

21 APEX Applikationen überwachen 1
Wäre es nicht schön, bei Fehlern in der Applikation automatisch informiert zu werden, dass etwas schief gelaufen ist? APEX bietet dazu die View APEX_WORKSPACE_ACTIVITY_LOG und die Spalte ERROR_MESSAGE gibt Auskunft über etwaige Fehler. Ein DBMS_JOB kann dazu verwendet werden um sie periodisch abzufragen. Siehe dazu Blog Eintrag auf Und mit kann man auch eine SMS verschicken.

22 APEX Applikationen überwachen 2
Wie können Einbruchsversuche erkannt werden? Die View APEX_WORKSPACE_ACCESS_LOG protokolliert jeden Login Versuch mit Zeitpunkt Usernamen IP Adresse Ergebnis – Erfolgreich/Nicht Erfolgreich

23 APEX Applikationen überwachen 3
Wie kann erkannt werden, dass sich die Response Time der Applikation verschlechtert? Die View APEX_WORKSPACE_ACTIVITY_LOG protokolliert jeden Seitenaufruf und ELAPSED_TIME gibt Aufschluss über die Zeit welche APEX für die Seitengenerierung benötigt hat. Kombiniert mit Historischen Daten und der Anzahl User, die gleichzeitig Abfragen gemacht haben, kann man Trends ermitteln. Mit der View kann man auch eine Analyse des Navigationsver-haltens der Benutzer machen. Siehe dazu auch die Spalte THINK_TIME Oder eine Abfrage, welche Seiten nie in Verwendung sind. Und so weiter...

24 Generischen Code erstellen 1
Schon mal das Problem gehabt, eine Seite zu haben, wo mehrere Page Items durchnummeriert sind und die gleichen Überprü-fungen haben? Haben Sie für jedes Feld die gleiche Validierung erstellt? Es geht auch anders und mit wesentlich weniger Aufwand! BEGIN FOR rITEM IN ( SELECT ITEM_NAME FROM APEX_APPLICATION_PAGE_ITEMS WHERE APPLICATION_ID = :APP_ID AND PAGE_ID = :PAGE_ID AND ITEM_NAME LIKE 'P'||:PAGE_ID||'_VALUE%' ) LOOP IF V(rITEM.ITEM_NAME) IS NOT NULL THEN APEX_Util.set_session_state ( p_name => rITEM.ITEM_NAME , p_value => 1 ); END IF; END;

25 Generischen Code erstellen 2
Schon mal abhängige/hierarchische LOVs benötigt? Für jede LOV das AJAX Beispiel vom Carl Backstom (http://carlback.blogspot.com/) implementiert? Provokante Frage: Ist nicht eigentlich schon alles in den Meta-Daten der entsprechenden Page Items vorhanden? Die WHERE Clause der LOVs enthält doch alle Abhängigkeiten! Warum verwenden wir sie nicht, anstatt Code und Informationen zu duplizieren? Genau das macht der Open Source ApexLib Framework (http://apexlib.sourceforge.net/)! Kurze Demonstration des Frameworks

26 APEX Dictionary Views - Conclusio
Sind ein mächtiges Werkzeug mit dem man seine Applikationen oder die Entwicklung vereinfachen/verbessern kann. Viele Anwendungsmöglichkeiten, man braucht nur ein paar gute Ideen. Verwenden Sie den APEX Dictionary View Browser, um sich damit vertraut zu machen! Ab Oracle APEX Version 2.2 verfügbar.

27 APEX Repository direkt manipulieren
Haben Sie schon einmal die Anforderung gehabt, größere Änderungen in einer Applikation durchführen zu wollen? z.B. bei allen Feldern das Label Template auf „ohne Hilfe“ umzustellen. Oder per eigenem Code neue Page Items, ... zu erstellen. Sozusagen ein eigener Wizard. Oracle APEX bietet leider keine Tools, mit dem obige Anforderungen offiziell umgesetzt werden können. Aber wenn schon alle Meta-Daten der Applikation in der Datenbank sind ... Der Versuch eines direkten Updates in den Repository Tabellen kann sehr ernüchternd sein. Die Applikation ist danach auf einmal nicht mehr zugreifbar! Wie geht es also richtig?

28 APEX Repository direkt manipulieren
BACKUP, BACKUP, BACKUP!!! Machen Sie bevor Sie das Repository selbst manipulieren ein Backup/Export Ihres FLOW_XXX Schemas. Zumindest einen Export Ihrer Applikation! Die Anwendung der nachfolgenden Tipps geschieht auf eigene Gefahr !

29 APEX Repository direkt manipulieren
Manipulation erfolgt unter dem FLOWS_xxx (z.B. FLOWS_030000) User Account. Die Tabellen beginnen mit WWV_FLOW* Tabellen und Spalten sind am einfachsten über die APEX Dictionary Views identifizierbar. Referenz Datensatz erstellen z.B. mit dem neuen Label Template APEX Kontext mit WWV_Flow_API.set_security_group_id setzen. Was ist die Security Group ID? Entspricht der Workspace ID und kann über Apex_Util.get_security_group_id(`Workspacename`) ermittelt werden.

30 APEX Repository direkt manipulieren
Beispiel zum initialisieren des APEX Kontexts. DECLARE vSecurityGroupId NUMBER; BEGIN vSecurityGroupId := Apex_Util.find_security_group_id ( p_workspace => 'SPHINX_SXSD' ); IF vSecurityGroupId = 0 THEN RAISE_APPLICATION_ERROR ( , 'Workspace not found! Do not issue updates' END IF; -- WWV_Flow_Api.set_security_group_id(vSecurityGroupId); WWV_Flow.g_user := 'PWOLF'; END;

31 APEX Repository direkt manipulieren
Beispiel, welches bei allen Page Items der Seite 4 das Label Template von „Optional Label with Help“ auf „Optional Label“ setzt. UPDATE WWV_FLOW_STEP_ITEMS SET ITEM_FIELD_TEMPLATE = E18 WHERE FLOW_ID = 106 AND FLOW_STEP_ID = 4 AND ITEM_FIELD_TEMPLATE = E18 ; FLOW_STEP_ID entspricht Page Id FLOW_ID entspricht Application Id

32 APEX Repository direkt manipulieren
Was kann man machen, wenn eine Applikation nach dem Update auf einmal verschwunden ist? Die SECURITY_GROUP_ID in WWV_FLOWS überprüfen. Ist sie 0, dann den APEX Kontext initialisieren und die SECURITY_GROUP_ID im WWV_FLOWS wieder setzen. UPDATE WWV_FLOWS SET SECURITY_GROUP_ID = NULL WHERE FLOW_ID = 106 ; NULL wurde bewusst verwendet!

33 APEX Repository direkt manipulieren
Wie können jetzt neue Page Items, ... angelegt werden? APEX bietet dazu das öffentliche(!) Package WWV_Flow_Api Kann daher sowohl von einem Package im Applikationsschema als auch von FLOWS_XXX aufgerufen werden. Beispiele gibt es genug, einfach einen Export einer Applikation machen. WWV_Flow_Api.g_id_offset wird dazu verwendet, um beim Import eindeutige IDs zu bekommen -> für unseren Fall nicht notwendig. Die nächste freie ID gibt es von WWV_Flow_Id.next_val.

34 APEX Repository direkt manipulieren
Die folgenden Session Initialisierungsschritte sind nur notwendig wenn keine APEX Session vorhanden ist. z.B. wenn mit FLOWS_XXX connected wurde. APEX Kontext wie bei Update herstellen + folgenden Code ausführen BEGIN SELECT VALUE INTO WWV_Flow_Api.g_nls_numeric_chars FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS' ; EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=''.,'''; -- WWV_FLOW.g_browser_language := 'en'; WWV_Flow_Api.g_id_offset := 0; END;

35 APEX Repository direkt manipulieren
Danach ganz einfach mit folgendem Codebeispiel ein Page Item erstellen. DECLARE vPageItemId NUMBER; BEGIN WWV_Flow_Api.set_version ( WWV_Flow_Api.g_compatable_from_version ); WWV_Flow.g_flow_id := 100; -- Application Id -- vPageItemId := WWV_Flow_Id.next_val; WWV_Flow_Api.create_page_item ( p_id => vPageItemId , p_flow_id => WWV_Flow.g_flow_id , p_flow_step_id => 4 , p_name => 'P4_TESTIT' ... END;

36 APEX Repository direkt manipulieren - Conclusio
BACKUP, BACKUP, BACKUP!!! Updates am besten direkt machen. Immer Referenzdatensatz erstellen. Inserts mit dem Package WWV_Flow_Api durchführen. Applikations Export File gibt gute Beispiele vor.

37 Danke für die Aufmerksamkeit! Haben Sie noch Fragen?


Herunterladen ppt "The Power of the Oracle APEX Repository Patrick Wolf, Sphinx IT Consulting DOAG SIG – APEX für Fortgeschrittene, 31.05.2007."

Ähnliche Präsentationen


Google-Anzeigen