Stephan Engel<br />OPITZ CONSULTING Bad Homburg GmbH	<br />Lösungen für Standard-anforderungen mit Köpfchen<br />DOAG Konf...
Leistungs-angebot<br /><ul><li>Java
SOA/BPM
ORACLE
BI/DWH
Outtasking</li></ul>Kunden<br /><ul><li>Branchen-übergreifend
Über 600 Kunden</li></ul>Tätigkeits-felder<br /><ul><li>IT-Strategie
Beratung
Implementierung
Betrieb
Training</li></ul>Fakten<br /><ul><li>Gründung 1990
400 Mitarbeiter
8 Standorte in D/PL/CH</li></ul>Industrie / Versorger / Telekommunikation 29%<br />Handel / Logistik / Dienstleistungen29%...
Fachliche Fehlermeldungen aus Prozessen<br />Löschen nur mit Sicherheitsabfrage<br />Rückfrage „Daten wurden geändert“ <br...
Geschäftslogik liegt in PL/SQL vor<br />In dieser Geschäftslogik finden auch Validierungen statt. Schlägt eine Validierung...
Szenario: Eingabeformular für Projekte<br />Projektname muss eindeutig sein<br />Gesichert durch einen Unique Constraint<b...
Einfache Lösung: Validierung implementieren<br />Fachliche Fehlermeldungen aus Prozessen<br />
Nachteil der Validierungslösung<br />Performance<br />Code-Redundanzen<br />Aufwand bei der Entwicklung<br />Vorteil<br />...
Lösungsansatz<br />Fehlermeldungen in Collectionschreiben<br />Bericht auf Seite 0, der aussieht wie Validierungsmeldungen...
Vorgehen:<br />1. Neue Collection beim Anmelden an die Anwendung anlegen:<br />Fachliche Fehlermeldungen aus Prozessen<br />
2. Methode zum Schreiben der Fehlermeldungen in die Collectionanlegen:<br />Fachliche Fehlermeldungen aus Prozessen<br />
3. Bericht auf Seite 0 anlegen:<br />Fachliche Fehlermeldungen aus Prozessen<br />
4. Globale Prozesse und Items definieren:<br />Item F101_SHOW_ERRROS<br />Branch definieren, der im Fehlerfall auf der Sei...
5. Fehler in PL/SQL fangen und loggen:<br />Fachliche Fehlermeldungen aus Prozessen<br />
Anforderung: Alle Löschaktionen in der Anwendung sollen mit einer Sicherheitsabfrage bestätigt werden<br />Häufige Umsetzu...
Idee: Einhängen in den Submit-Prozess<br />Generisch auf allen Seiten automatisch eine Delete-Meldung anzeigen, wenn der R...
Platzieren des JavaScript-Codes<br />Löschen mit Sicherheitsabfrage<br /><scriptlanguage="JavaScript" type="text/javascrip...
Dieser Code kann z. B. auf Seite 0 oder im Template platziert werden<br />Vorteil Seite 0: Verhalten kann z. B. gezielt fü...
Anstelle der Standard JavaScript Dialoge sind in ApEx 4 auch jQueryUI Dialoge <br />functionsubmitOverride(event) {<br />i...
apex.jQuery('#ConfirmDeleteMessage').dialog({<br />autoOpen: false,<br />width: 400,<br />        modal: true,<br />resiza...
Der hier vorgestellte Mechanismus kann auch für andere Themen benutzt werden<br />z. B.: Änderungen finden nur nach Rückfr...
Implementierung mit dem Gedanken „Checksumme“<br />Beim Laden der Seite den Inhalt aller Items in einen String packen<br /...
Methode zum Bauen des Strings<br />Item auf Seite 0 anlegen und z.B. mithilfe einer Dynamic Action das Item beim Laden der...
Nächste SlideShare
Wird geladen in …5
×

ApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan Engel

2.482 Aufrufe

Veröffentlicht am

Auf der DOAG 2010 hielt Stephan Engel einen Vortrag zum Thema "ApEx effektiv" und zeigt Lösungen für Standardanforderungen mit Köpfchen auf. Application Express (kurz ApEx) ist eine Entwicklungsumgebung für Oracle Datenbanken.

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
2.482
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
3
Aktionen
Geteilt
0
Downloads
0
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

ApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan Engel

  1. 1. Stephan Engel<br />OPITZ CONSULTING Bad Homburg GmbH <br />Lösungen für Standard-anforderungen mit Köpfchen<br />DOAG Konferenz 2010, Nürnberg, 17.11.2010<br />ApEx effektiv<br />
  2. 2. Leistungs-angebot<br /><ul><li>Java
  3. 3. SOA/BPM
  4. 4. ORACLE
  5. 5. BI/DWH
  6. 6. Outtasking</li></ul>Kunden<br /><ul><li>Branchen-übergreifend
  7. 7. Über 600 Kunden</li></ul>Tätigkeits-felder<br /><ul><li>IT-Strategie
  8. 8. Beratung
  9. 9. Implementierung
  10. 10. Betrieb
  11. 11. Training</li></ul>Fakten<br /><ul><li>Gründung 1990
  12. 12. 400 Mitarbeiter
  13. 13. 8 Standorte in D/PL/CH</li></ul>Industrie / Versorger / Telekommunikation 29%<br />Handel / Logistik / Dienstleistungen29%<br />42%Öffentliche Auftraggeber / Banken & Versicherungen / Vereine & Verbände<br />
  14. 14. Fachliche Fehlermeldungen aus Prozessen<br />Löschen nur mit Sicherheitsabfrage<br />Rückfrage „Daten wurden geändert“ <br />Navigation mit „Zurück“-Buttons<br />Vorgestellte Lösungen<br />
  15. 15. Geschäftslogik liegt in PL/SQL vor<br />In dieser Geschäftslogik finden auch Validierungen statt. Schlägt eine Validierung fehl wird typischerweise eine Exceptiongeworfen<br />Ziel: Diese Validierungen soll nur einmal aufgerufen werden und fachliche Meldungen in der Oberfläche angezeigt werden<br />Fachliche Fehlermeldungen aus Prozessen<br />
  16. 16. Szenario: Eingabeformular für Projekte<br />Projektname muss eindeutig sein<br />Gesichert durch einen Unique Constraint<br />Default Verhalten:<br />Fachliche Fehlermeldungen aus Prozessen<br />
  17. 17. Einfache Lösung: Validierung implementieren<br />Fachliche Fehlermeldungen aus Prozessen<br />
  18. 18. Nachteil der Validierungslösung<br />Performance<br />Code-Redundanzen<br />Aufwand bei der Entwicklung<br />Vorteil<br />Sieht gut aus<br />Ziel: Entwicklung einer Lösung, die Nachteile kompensiert UND gut aussieht<br />Fachliche Fehlermeldungen aus Prozessen<br />
  19. 19. Lösungsansatz<br />Fehlermeldungen in Collectionschreiben<br />Bericht auf Seite 0, der aussieht wie Validierungsmeldungen<br />Fachliche Fehlermeldungen aus Prozessen<br />
  20. 20. Vorgehen:<br />1. Neue Collection beim Anmelden an die Anwendung anlegen:<br />Fachliche Fehlermeldungen aus Prozessen<br />
  21. 21. 2. Methode zum Schreiben der Fehlermeldungen in die Collectionanlegen:<br />Fachliche Fehlermeldungen aus Prozessen<br />
  22. 22. 3. Bericht auf Seite 0 anlegen:<br />Fachliche Fehlermeldungen aus Prozessen<br />
  23. 23. 4. Globale Prozesse und Items definieren:<br />Item F101_SHOW_ERRROS<br />Branch definieren, der im Fehlerfall auf der Seite <br />bleibt<br />Prozess anlegen, der die Collection aufräumt<br />Fachliche Fehlermeldungen aus Prozessen<br />
  24. 24. 5. Fehler in PL/SQL fangen und loggen:<br />Fachliche Fehlermeldungen aus Prozessen<br />
  25. 25. Anforderung: Alle Löschaktionen in der Anwendung sollen mit einer Sicherheitsabfrage bestätigt werden<br />Häufige Umsetzung: javascript:apex.confirm(htmldb_delete_message,'DELETE');<br />Nachteil: Muss bei jedem Button implementiert werden<br />Löschen mit Sicherheitsabfrage<br />
  26. 26. Idee: Einhängen in den Submit-Prozess<br />Generisch auf allen Seiten automatisch eine Delete-Meldung anzeigen, wenn der Request bestimmten Werten entspricht<br />Löschen mit Sicherheitsabfrage<br />
  27. 27. Platzieren des JavaScript-Codes<br />Löschen mit Sicherheitsabfrage<br /><scriptlanguage="JavaScript" type="text/javascript"><br />apex.jQuery(document).ready(function() {<br />functionsubmitOverride(event) {<br />if(apex.jQuery('#pRequest').val().indexOf('DELETE')>-1) {<br />if (confirm(htmldb_delete_message)) {<br />this._submit();<br />} <br />} else {<br />this._submit();<br />}<br />}<br />document.wwv_flow._submit = document.wwv_flow.submit;<br />document.wwv_flow.submit = submitOverride;<br />});<br /></script><br />
  28. 28. Dieser Code kann z. B. auf Seite 0 oder im Template platziert werden<br />Vorteil Seite 0: Verhalten kann z. B. gezielt für bestimmte Seiten mit ApEx-Mitteln ausgeschaltet werden<br />Code ist unabhängig vom gewählten Seitentemplate vorhanden<br />Löschen mit Sicherheitsabfrage<br />
  29. 29. Anstelle der Standard JavaScript Dialoge sind in ApEx 4 auch jQueryUI Dialoge <br />functionsubmitOverride(event) {<br />if(apex.jQuery('#pRequest').val().indexOf('DELETE')>-1) {<br />apex.jQuery('#ConfirmDeleteMessage').dialog('open');<br /> } else {<br />this._submit();<br /> }<br />}<br />Löschen mit Sicherheitsabfrage<br />
  30. 30. apex.jQuery('#ConfirmDeleteMessage').dialog({<br />autoOpen: false,<br />width: 400,<br /> modal: true,<br />resizable: false,<br />buttons: {<br /> "Lieber nicht": function() {<br /> $(this).dialog('close');<br /> },<br /> "Klar, weg damit": function() {<br />document.wwv_flow.submit();<br />}}});});<br /></script><br />Löschen mit Sicherheitsabfrage<br />
  31. 31. Der hier vorgestellte Mechanismus kann auch für andere Themen benutzt werden<br />z. B.: Änderungen finden nur nach Rückfrage statt, wenn Datensatz bestimmten Status hat<br />Rückfrage kann z. B. lauten:„Daten wurden geändert“ <br />Rückfrage „Daten wurden geändert“ <br />
  32. 32. Implementierung mit dem Gedanken „Checksumme“<br />Beim Laden der Seite den Inhalt aller Items in einen String packen<br />Beim Submit prüfen, ob der alte String != Neue String und Request z.B. = „Back“<br />Wenn ja, dann Meldung anzeigen<br />Vorteil:<br />Funktioniert immer, z. B. auch bei tabellarischen Formularen<br />Rückfrage „Daten wurden geändert“ <br />
  33. 33. Methode zum Bauen des Strings<br />Item auf Seite 0 anlegen und z.B. mithilfe einer Dynamic Action das Item beim Laden der Seite füllen<br />Rückfrage „Daten wurden geändert“ <br />functioncalculatePageItemsChecksum() <br />{ <br />returnapex.jQuery(":input").map(function(){ <br />return (apex.jQuery(this).attr("id")=='pRequest'<br /> ||apex.jQuery(this).attr("id")=='P0_PAGE_INPUT_TYPE_CHECKSUM' <br /> || apex.jQuery(this).attr("id")==null <br /> || apex.jQuery(this).attr("id")==''<br /> )?null:apex.jQuery(this).val(); <br />}<br />).get().join(","); <br />};<br />$s('P0_PAGE_INPUT_TYPE_CHECKSUM',calculatePageItemsChecksum()); <br />
  34. 34. Beim Submit prüfen, ob eine Meldung angezeigt wird<br />Rückfrage „Daten wurden geändert“ <br />if(!(apex.jQuery('#pRequest').val().indexOf('CANCEL')>-1 <br /> || apex.jQuery('#pRequest').val().indexOf('SAVE')>-1 <br /> || apex.jQuery('#pRequest').val().indexOf('DELETE')>-1) <br /> && (apex.jQuery('#P0_PAGE_INPUT_TYPE_CHECKSUM').val() != calculatePageItemsChecksum())) {<br />apex.jQuery('#ConfirmUnsavedChangeMessage').dialog('open');<br /> }<br />
  35. 35. In ApEx-Anwendungen wird häufig mit Buttons navigiert<br />Deshalb soll auch der Anwendungsfall „Zurück“ über Buttons implementiert werden<br />Navigation mit „Zurück“-Buttons<br />
  36. 36. Lösungsansätze:<br />Javascript: Über die History kann auf die vorherige Seite zurücknavigiert werden. Nachteil: Funktioniert nicht, wenn zweimal auf der gleichen Seiten geblieben wird<br />Mit einem speziellen Item auf den Seiten wird über die Funktion „Branchto Page Identifiedby Item“ auf die Ursprungsseite zurückgesprungen. Nachteil: Komplexere Navigationen sind sehr aufwendig<br />Idee: Mit einer Collection einen Navigationsstack implementieren, bei „Back“ automatisch auf die letze Seite des Stacksnavigieren<br />Navigation mit „Zurück“-Buttons<br />
  37. 37. Collection anlegen<br />Prozess anlegen, der die aktuelle Seite auf den Stack legt<br />Muss auf jeder Seite bis auf die Login Seite ausgeführt werden<br />Wenn die oberste Seite auf dem Stack schon die aktuelle Seite ist, dann nichts tun<br />Navigation mit „Zurück“-Buttons<br />APEX_COLLECTION.CREATE_COLLECTION(p_collection_name => 'NAVIGATION_COLLECTION');<br />
  38. 38. Navigation mit „Zurück“-Buttons<br />DECLARE<br />v_last_page PLS_INTEGER;<br />BEGIN<br /> SELECT c001<br /> INTO v_last_page<br /> FROM (SELECT seq_id, c001<br /> FROM apex_collections<br /> WHERE collection_name = 'NAVIGATION_COLLECTION'<br /> ORDER BY seq_id DESC)<br /> WHERE ROWNUM < 2;<br /> IF v_last_page != :app_page_id<br /> THEN<br />apex_collection.add_member<br /> (p_collection_name => 'NAVIGATION_COLLECTION',<br /> p_c001 => :app_page_id<br /> );<br /> END IF;<br />EXCEPTION<br /> WHEN NO_DATA_FOUND<br /> THEN<br />apex_collection.add_member<br /> (p_collection_name => 'NAVIGATION_COLLECTION',<br /> p_c001 => :app_page_id<br /> );<br />END;<br />
  39. 39. 3. Prozess anlegen, der auf den „Zurück“-Button reagiert<br />Navigation mit „Zurück“-Buttons<br />DECLARE<br />v_last_page PLS_INTEGER;<br />v_seq_id PLS_INTEGER;<br />BEGIN<br /> -- Vorherige Seite vom Stack ermitteln<br /> SELECT c001<br /> INTO v_last_page<br /> FROM (SELECT seq_id, c001, ROW_NUMBER () OVER (ORDER BY seq_id DESC) seq<br /> FROM apex_collections<br /> WHERE collection_name = 'NAVIGATION_COLLECTION')<br /> WHERE seq = 2;<br /> -- Aktuelle Seite vom Stack ermitteln, damit sie gelöscht werden kann<br /> SELECT seq_id<br /> INTO v_seq_id<br /> FROM (SELECT seq_id, c001, ROW_NUMBER () OVER (ORDER BY seq_id DESC) seq<br /> FROM apex_collections<br /> WHERE collection_name = 'NAVIGATION_COLLECTION')<br /> WHERE seq = 1;<br />…<br />
  40. 40. Navigation mit „Zurück“-Buttons<br />-- Aktuelle Seite löschen<br />apex_collection.delete_member<br /> (p_collection_name => 'NAVIGATION_COLLECTION',<br />p_seq => v_seq_id<br /> );<br /> -- Redirect<br />OWA_UTIL.redirect_url ( 'f?p='<br /> || :app_id<br /> || ':'<br /> || v_last_page<br /> || ':'<br /> || :app_session<br /> );<br /> -- Verarbeitung abbrechen<br />apex_application.g_unrecoverable_error := TRUE;<br />EXCEPTION<br /> -- Keine Daten auf dem Stack, kein Redirect.<br /> WHEN NO_DATA_FOUND<br /> THEN<br /> NULL;<br />END;<br />
  41. 41. Navigation mit „Zurück“-Buttons<br />Abbruch führt automatisch auf die Seite,<br />von der aus navigiert wurde<br />
  42. 42. Fazit<br />Die hier vorgestellten Lösungen<br />entlasten den Entwickler von Standardaufgaben,<br />sind generisch im Ansatz und somit wiederverwendbar<br />und erhöhen den Komfort für den Endbenutzer.<br />Daher sollten sie in Erwägung gezogen werden, wenn eine Neuentwicklung mit ApEx begonnen wird!<br />
  43. 43. BesuchenSieauch die anderenVorträge von OPITZ CONSULTING und den Stand auf Ebene 2<br />
  44. 44. Kontakt<br />Stephan Engel<br />OPITZ CONSULTING Bad Homburg GmbH<br />stephan.engel@opitz-consulting.com<br />Tel. +49 6172 66260 1535<br />

×