Fehlervermeidung und Debugging in APEX



Ähnliche Dokumente
Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Lokale Installation von DotNetNuke 4 ohne IIS

Facebook I-Frame Tabs mit Papoo Plugin erstellen und verwalten

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum:

SEMINAR Modifikation für die Nutzung des Community Builders

Lizenz Verwaltung. Adami Vista CRM

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung

desk.modul : WaWi- Export

Prozedurale Datenbank- Anwendungsprogrammierung

Implementierungsvarianten. mit Oracle Application Express

Debugging in APEX. Christina Funke Apps Associates GmbH Dortmund

AJAX DRUPAL 7 AJAX FRAMEWORK. Was ist das Ajax Framework? Ein typischer Ablauf eines Ajax Requests Die Bestandteile des Ajax Frameworks.

Verwendung des IDS Backup Systems unter Windows 2000

Bedienungsanleitung für den Online-Shop

DOAG Regio 2015 APEX 5 Neuerungen Highlights. Marco Patzwahl

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

Einzelplatz - USB-Lizenz

HTML5 HOCKEYSTICK EXPANDABLE BANNER v1.0

PL/SQL-Code mit APEX generieren

Stellvertretenden Genehmiger verwalten. Tipps & Tricks

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden.

Operator Guide. Operator-Guide 1 / 7 V1.01 / jul.12

Oracle APEX Installer

Softwaretechnik Teil Webprogrammierung (HTML, PHP) SS2011

Bedienungsanleitung für Mitglieder von Oberstdorf Aktiv e.v. zur Verwaltung Ihres Benutzeraccounts auf

Einmalige Registrierung des Arbeitnehmers im ElsterOnline-Portal

Anlegen eines DLRG Accounts

SAMMEL DEINE IDENTITÄTEN::: NINA FRANK :: :: WINTERSEMESTER 08 09

Eigene Seiten erstellen

4D Server v12 64-bit Version BETA VERSION

1. EINLEITUNG 2. GLOBALE GRUPPEN Globale Gruppen anlegen

Erstellen eines Formulars

Anleitung zum Login. über die Mediteam- Homepage und zur Pflege von Praxisnachrichten

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar ZID Dezentrale Systeme

Anmelden und Vorträge einreichen auf der JBFOne-Website Inhalt

Universität Duisburg-Essen Informationssysteme Prof. Dr.-Ing. N. Fuhr. Praktikum Datenbanken / DB2 Woche 8: Trigger, SQL-PL

TYPO3 Super Admin Handbuch

desk.modul : ABX-Lokalisierung

Benutzerverwaltung mit Zugriffsrechteverwaltung (optional)

Suchmaschinen. Universität Augsburg, Institut für Informatik SS 2014 Prof. Dr. W. Kießling 23. Mai 2014 Dr. M. Endres, F. Wenzel Lösungsblatt 6

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erste Hilfe. «/IE Cache & Cookies» Logout, alte Seiten erscheinen, Erfasstes verschwindet?

kreativgeschoss.de Webhosting Accounts verwalten

Die Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden.

Benutzeranleitung Superadmin Tool

Anleitung Modul freie Plätze VAKA heiminfo.ch

Urlaubsregel in David

Wann benötigen Sie eine neue Lizenz-Datei mit der Endung.pkg?

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

2. Im Admin Bereich drücken Sie bitte auf den roten Button Webseite bearbeiten, sodass Sie in den Bearbeitungsbereich Ihrer Homepage gelangen.

Einführung in PHP. (mit Aufgaben)

Upgrade von Starke Praxis

Autoresponder Unlimited 2.0

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

PROSTEP AG: Anmelden für eine mehrtägige Schulung für Opel-Zulieferer

Oracle 12c: Neuerungen in PL/SQL. Roman Pyro DOAG 2014 Konferenz

Anzeige des Java Error Stack in Oracle Forms

Lehrer: Einschreibemethoden

Pixelart-W ebdesign.de

Gesicherte Prozeduren

BSV Software Support Mobile Portal (SMP) Stand

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Konvertieren von Settingsdateien

WordPress. Dokumentation

Registrierung Ihres Fachbesucher Tickets

Die Dateiablage Der Weg zur Dateiablage

Installation & Konfiguration AddOn AD-Password Changer

Powerful PL/SQL: Collections indizieren mit VARCHAR2- Indizes ein Praxisbeispiel

Testen mit JUnit. Motivation

1. Loggen Sie sich mit Ihrem Benutzernamen in den Hosting-Manager (Confixx) auf Ihrer entsprechenden AREA ein. Automatische Wordpress Installation

1.Unterschied: Die Übungen sind nicht von deinem Mathe-Lehrer...

Registrierung für eine Senioren IPIN Ab 17. Mai 2011 können sich Spieler für eine Senioren IPIN (Lizenz) registrieren.

1. Legen Sie die mitgelieferte CD in ihr Laufwerk des PC, diese startet dann automatisch mit folgenden Fenster, klicken Sie nun English an.

How to install freesshd

MOM - Medienforum Online-Medien Anleitung zum Ändern der Login-Nummer und des Passworts

Werkzeuge für Datenbank Handwerker: IBM Data Studio und IBM Optim QWT

BitDefender Client Security Kurzanleitung

cs241: Datenbanken mit Übungen HS 2011

Update von Campus-Datenbanken (FireBird) mit einer Version kleiner 9.6 auf eine Version größer 9.6

FRONT CRAFT.

Hier mal einige Tipps zum Einbau vom "Anfy" Applets. Hier die Seite von "Anfy" und zum Download des Programms:

Inhalt: Ihre persönliche Sedcard... 1 Login... 1 Passwort vergessen... 2 Profildaten bearbeiten... 3

Informationen zum neuen Studmail häufige Fragen

Arbeiten mit dem Outlook Add-In

Anleitung zum Einfügen von Daten aus OpenOffice Calc in OpenOffice Base Beispiel anhand einer Adressen Calc-Tabelle

Schiller-Gymnasium Hof

Hilfe, ich verstehe meine APEX Seite nicht mehr! DOAG Development Konferenz, Düsseldorf

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

1 Konto für HBCI/FinTS mit Chipkarte einrichten

Updatehinweise für die Version forma 5.5.5

Pflegende Angehörige Online Ihre Plattform im Internet

PocketPC.ch Review. SBSH ilauncher 3.1. Erstelldatum: 3. Dezember 2007 Letzte Änderung: 3. Dezember PocketPC.ch_Review_iLauncher.

Zur Bestätigung wird je nach Anmeldung (Benutzer oder Administrator) eine Meldung angezeigt:

Eine Anwendung mit InstantRails 1.7

efa elektronisches Fahrtenbuch im Berliner Ruder-Club

TeamSpeak3 Einrichten

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und combit GmbH Untere Laube Konstanz

Arbeitsschritte EAÜ Leistungserbringer Einnahmen erfassen

Transkript:

Saubere Arbeit! Fehlervermeidung und Debugging in APEX Andreas Wismann WHEN OTHERS Beratung Programmierung Coaching rund um Oracle Application Express wismann@when-others.com http://when-others.com

Einstieg Es gibt wenig "APEX Design Patterns" Einheitliche Entwurfsmuster für die Praxis wartbare APEX-Anwendungen pragmatischer Ansatz

Credo Never Add Functionality Early Know Your Tools Test Your Code RTFM

HTML & Co. beherrschen HTML CSS jquery jquery mobile

SQL und PL/SQL auffrischen Pivot Model Clause Pipelined Functions RESULT_CACHE XML DB

Zwei-Schichten-Architektur APEX DB

Ordnung schaffen! Validierungen Prozesse Hidden Items Berechnungen Templates Conditions Selects (puh!)

Seiten "sperren" Vor jeder Bearbeitung auf das Schloss klicken Schutz ist nicht 100% wasserdicht Admin kann Sperren aufheben

Drei /// v_info := '/// mit Fachbereich klären'; Markieren Sie Baustellen mit /// ist in jedem Zeichensatz lesbar verträgt sich mit SQL*Plus wird von jeder Volltextsuche gefunden

Testbaren Code schreiben keine Mega-SQL-Statements in APEX Views, Trigger verwenden Pipelined Table Functions Kurzer Prozess V(' ') erschwert (automatisches) Testen V(' ') bedeutet Vermeiden

V(' ') vermeiden FUNCTION get_rollen RETURN apex_application_global.vc_arr2 IS v_rollen apex_application_global.vc_arr2; BEGIN select rollenname bulk collect into v_rollen from user_rollen where user_name = v('app_user'); END get_rollen;

V(' ') vermeiden FUNCTION get_rollen RETURN apex_application_global.vc_arr2 IS v_rollen apex_application_global.vc_arr2; v_app_user varchar2 := v('app_user'); BEGIN select rollenname bulk collect into v_rollen from user_rollen where user_name = v_app_user; END get_rollen;

V(' ') vermeiden FUNCTION get_rollen (i_app_user IN VARCHAR2) RETURN apex_application_global.vc_arr2 IS v_rollen apex_application_global.vc_arr2; BEGIN select rollenname bulk collect into v_rollen from user_rollen where user_name = i_app_user; END get_rollen;

PL/SQL gehört in die Datenbank warum? in APEX Performance-Nachteile im APEX-Fenster kein Debugging möglich kein Komfort durch Code Completion Invalider Code kann überleben

Ein Package pro Seite APEX Package Page 1000 P1000 Page 1100 P1100 Page 1200 P1200

Einheitliche Namen Button: Request: Prozess: Branch: SPEICHERN SPEICHERN SPEICHERN SPEICHERN P100.SPEICHERN ( i_datum => :P100_DATUM );

Verteilte Geschäftslogik Validierung in APEX :P2_VERTRAGSBEGINN >= trunc(sysdate) and extract (DAY FROM to_date(:p2_vertragsbeginn, 'DD.MM.YYYY')) = 1 Fehlermeldung "Der Vertragsbeginn kann nur an einem Monatsersten und nicht rückwirkend beginnen." Gleich mehrere Probleme

Zentrale Geschäftslogik APEX-Validierung ruft Datenbankfunktion auf

Zentrale Geschäftslogik APEX-Validierung ruft Datenbankfunktion auf

Zentrale Geschäftslogik APEX-Validierung ruft Datenbankfunktion auf FUNCTION check_vertragsbeginn (i_datum in date) RETURN VARCHAR2 IS BEGIN IF i_datum < trunc(sysdate) OR extract(day FROM i_datum)!= 1 THEN RETURN 'Der Vertrag kann nur an einem Monatsersten' ' und nicht rückwirkend beginnen'; END IF; RETURN NULL; -- fehlerfrei END check_vertragsbeginn;

Page 0 PL/SQL-Region namens TEST_OUTPUT Einfaches Platzhalter-Template verwenden <div id="#region_static_id#"> #BODY# </div> Der Region eine Static ID mitgeben Build Option TEST

Hidden Items Page 0: HTML-Region namens HIDDEN_ITEMS für sämtliche Hidden Items der Anwendung Wieder das Platzhalter-Template verwenden Werte hervorzaubern mit jquery

Hidden-Items-Region auf Page 0 $(function() { var table = '<table>'; // Region Static ID ist "hiddenitemspage0" $('#hiddenitemspage0 input[id]').each(function() { table += '<tr><td>' + $(this).attr('id') + ':</td><td>' + $(this).val() +'</td></tr>'; }); table += '</table>'; // Region Static ID ist "testoutput" $('#testoutput').prepend($(table)); });

Demo: Hidden Items

Subscription ("Abonnieren") Templates (u.a.) zentral verwalten Mit wenigen Klicks sämtliche Anwendungen im Workspace aktualisieren Ebenso: LOVs, Shortcuts, Plugins, Navigation Bar Entries,

Demo: Subscription ///

Conditions zentralisieren Formular hat mehrere logische Bereiche? Regions-Template namens PARENT_REGION <div class="parent_region"> #BODY# </div> Bereiche als Parent-Regionen definieren, alle abhängigen Regionen unterordnen Formulieren Sie die Conditions nur ein einziges Mal auf den Parent-Regionen

Shortcuts verwenden Nicht-Wiederverwendbarkeit von Items und Regionen abmildern PL/SQL-Shortcuts sehen &VARIABLEN. IF &P0_BEDINGUNG. THEN &P0_PROZEDURNAME. ; END IF;

Build Options verwenden Alles, was zum Entwickeln und Testen dient, erhält die Build Option TEST ("Include") Später wird TEST wieder auf "Exclude" umgestellt

Plug-ins verwenden Funktionalität und Code werden gekapselt Entwickler brauchen nur "auszuwählen" Neue Versionen einfach verteilbar

Session State Komisch, jetzt funktioniert's plötzlich!

Session State In-Memory Session State vs. Persisted Session State Merkwürdig? Ausloggen und Einloggen!

Demo: Tabs

Items können nicht rechnen :P1_A := 3000; :P1_B := 5; :P1_X := :P1_A + :P1_B; -- 3005 IF :P1_A > :P1_B THEN -- wird niemals ausgeführt!

Demo: Rechnen

Items sind VARCHAR's! :P100_A := to_number('1000'); :P100_B := to_number('5'); IF :P100_A > :P100_B THEN -- nie im Leben!

Items sind VARCHAR's! :P100_A := 1000; :P100_B := 5; IF to_number(:p100_a) > to_number(:p100_b) THEN -- dann klappt's auch mit der Number!

Gnädige Browser Es existieren semantische JavaScript-Fehler id="xyz" mehrfach vergeben Zirkelbezüge in Dynamic Actions "submit" sowohl im Objekt als auch in Dynamic Action Skripte funktionieren zunächst Irgendwann sind zu viele "Spielregeln" verletzt

APEX_DEBUG_MESSAGE Einfaches Logging-Werkzeug Schreibt in das Debug-Log der Anwendung selbst, wenn Debugging ausgeschaltet ist APEX_DEBUG_MESSAGE.LOG_MESSAGE ( p_message => '/// Code dringend prüfen in ' $$PLSQL_UNIT ', Zeile: ' $$PLSQL_LINE,p_enabled => TRUE,p_level => 1 );

DBMS_APPLICATION_INFO Sagt Ihrem Admin, welches "Programm" läuft Erleichtert Identifizierung und Beenden hängender Sessions DBMS_APPLICATION_INFO.set_module ( module_name => 'meine_procedure',action_name => 'Plausi-Prüfung' );

DBMS_APPLICATION_INFO PROCEDURE log_module ( i_module_name in VARCHAR2 ) IS BEGIN DBMS_APPLICATION_INFO.set_module ( module_name => i_module_name ); APEX_DEBUG.ENTER ( p_routine_name => i_module_name ); END;

DBMS_APPLICATION_INFO PROCEDURE log_module ( i_module_name in VARCHAR2 ) IS BEGIN NULL; $IF $$DEBUG_MODE $THEN DBMS_APPLICATION_INFO.set_module ( module_name => i_module_name ); APEX_DEBUG.ENTER ( p_routine_name => i_module_name ); $END END; ALTER PROCEDURE log_me COMPILE PLSQL_CCFLAGS = 'DEBUG_MODE:TRUE' REUSE SETTINGS;

Code-Generatoren verwenden PROCEDURE meine_prozedur ( i_tag IN NATURAL,i_monat IN NATURAL,i_jahr IN NATURAL ) IS BEGIN APEX_DEBUG.ENTER ( p_routine_name => 'meine_prozedur',p_name01 => 'i_tag',p_value01 => i_tag,p_name02 => 'i_monat',p_value02 => i_monat,p_name03 => 'i_jahr',p_value03 => i_jahr );

Leuchtspur-Munition "Warum macht er das denn nicht???" BEGIN END; :P1_X := UMSATZ ( p_monat => 1 );

Leuchtspur-Munition Lassen Sie es krachen! BEGIN END; :P1_X := UMSATZ ( p_monat => 1/0 );

EXCEPTION HANDLING Entweder überhaupt keins oder: konsistent und überall Fachliche Fehler abfangen (z.b. WHEN NO_DATA_FOUND THEN RETURN NULL;) Technische Fehler hochgeben (z.b. WHEN OTHERS THEN RAISE;)

Application Errors Home > Administration > Monitor Activity > Application Errors

Eigene Error-Function

Eigene Error-Function

APEX Advisor Findet :TIPPEFHLER Erkennt invalide Codeblöcke return VALIDIERUNG.check_vertragsbeginn ( i_datum => :P2_VERTRASGBEGINN )

APEX Advisor

APEX Advisor

APEX-Views SELECT * FROM APEX_APPLICATION_PAGE_ITEMS

APEX-Views

Funktioniert trotzdem nicht??? wegwerfen und neu bauen ist oft keine schlechte Idee

Team Development Angaben zur Anwendung und Seite nicht vergessen

Anwender-Feedback Feedback-Seite in die Anwendung einbauen

Literaturempfehlung Expert Oracle Application Express John Scott, Dietmar Aust et. al. (2011) ISBN 978-1430235125 zu Version 4.0 diverse Fallbeispiele

Literaturempfehlung Pro Oracle SQL Karen Morton (2010) ISBN 978-1430232285 zu Version 11g kein SQL-Einsteigerbuch

Literaturempfehlung Der Pragmatische Programmierer Andrew Hurt, David Thomas (2003) ISBN 978-3446223097 ausführliche Betrachtung verbreiteter Fehler professionelle Entwurfsmuster trotzdem kurzweilig

Viel Spaß beim Schrauben

Andreas Wismann WHEN OTHERS Beratung Programmierung Coaching rund um Oracle Application Express wismann@when-others.com http://when-others.com

Wenn noch Zeit ist Auf NULL als Returnwert verzichten Browser exakt spezifizieren

Einheitliche Bedienung 1 2 3 4 5 6 7 8 9 1 4 7 2 5 8 3 6 9

ID einmalig vergeben // falsch: <input id="datumseingabe" name="datum1" type="text" value=""> <input id="datumseingabe" name="datum2" type="text" value=""> <input id="datumseingabe" name="datum3" type="text" value=""> <input id="datumseingabe" name="datum4" type="text" value=""> <input id="datumseingabe" name="datum5" type="text" value=""> // richtig: <input class="datumseingabe" name="datum1" type="text" value=""> <input class="datumseingabe" name="datum2" type="text" value=""> <input class="datumseingabe" name="datum3" type="text" value=""> <input class="datumseingabe" name="datum4" type="text" value=""> <input class="datumseingabe" name="datum5" type="text" value="">

HTML-Tags schließen <!-- falsch --> <table> <tr> <td>zelle 1 <td>zelle 2 </table> <!-- richtig --> <table> <tr> <td>zelle 1 </td> <td>zelle 2 </td> </tr> </table>

Pipelined Function FUNCTION komplexer_report (i_info IN VARCHAR2) RETURN report_table_t PIPELINED IS v_report report_t; BEGIN for c in ( -- kompliziertes Select select feld1, case when feld2 = 'XYZ' then '123' else NULL END as feld2 from -- noch komplizierter! where -- höchst kompliziert!!! ) loop v_report.feld1 = geschaeftslogik1 ( c.feld1, i_info ); v_report.feld2 = geschaeftslogik2 ( c.feld2, i_info ); PIPE ROW; end loop; RETURN; END;

Pipelined Function select * from table ( komplexer_report (:P500_XY) ) Return-Typen (für Row und Table) müssen in der Datenbank registriert sein