Codegenerator für APEX Collections und Tabular Forms Andreas Wismann wismann@when-others.com WHEN OTHERS Beratung Programmierung Coaching
Agenda Andreas Wismann wismann@when-others.com Tabular Forms Features APEX Collection Features Welchen Code brauchen wir Wie wird der Code erzeugt Herausforderungen und Grenzen WHEN OTHERS Beratung Programmierung Coaching
Ausgangspunkt
Tabular Forms-Assistent
Tabular Form maximal 50 Spalten, ein Grid pro Seite
Direkter Zugriff auf die Tabelle!
nur Standardfunktionalität
möchte man "mehr", SELECT APEX_ITEM.HIDDEN(1, empno) APEX_ITEM.DISPLAY_AND_SAVE(2,ename) ename, APEX_ITEM.TEXT (3, salary) job, APEX_ITEM.DATE_POPUP2(4, hiredate) hiredate, APEX_ITEM.TEXT (5, sal) sal, APEX_ITEM.TEXT (6, comm) comm FROM emp
möchte man "mehr", BEGIN FOR i IN 1.. APEX_APPLICATION.G_F01.COUNT LOOP UPDATE emp SET ename = APEX_APPLICATION.G_F02(i),job = APEX_APPLICATION.G_F03(i),hiredate = to_date(apex_application.g_f04(i), 'dd-mon-yyyy'),sal = APEX_APPLICATION.G_F05(i),comm = APEX_APPLICATION.G_F06(i) WHERE empno = to_number(apex_application.g_f01(i)); END LOOP; END;
Zwischenstand Tabular Forms entweder überhaupt kein Code (Assistenten) oder gleich "die volle Breitseite" Zuordnung von Formularspalten (Nummern) zu Tabellenspalten (Namen), fehleranfällig Direktes Arbeiten auf der DB-Tabelle (INSERT, UPDATE, DELETE)
Was sind APEX Collections? zwei echte Datenbanktabellen unbegrenzte Menge Daten privat, der Benutzersession zugeordnet APEX übernimmt die Session-Verwaltung
Was sind APEX Collections? WWV_FLOW_COLLECTIONS$ WWV_FLOW_COLLECTION_MEMBERS$
API-Dokumentation
Ähnlichkeiten? Temporäre Tabellen Materialized Views funktionieren nicht mit APEX Sessions werden laufend gewechselt sind mächtiger als APEX Collections aber nicht privat
Persistenz Collection-Daten sind innerhalb der Session auf allen APEX-Seiten verfügbar.
Flexibilität Abkopplung von fachlichen Tabellen endgültiges Datenmodell muss nicht bekannt sein Fehlerhafte Eingaben können dem Benutzer später wiedervorgelegt werden
APEX Collections sind robust.
Collection anlegen Warenkorb-Prinzip Abfrage-Prinzip Die Collection ist zu Beginn leer Die Collection wird inital mit Daten aus Tabellen oder Views befüllt apex_collection. create_collection ( WARENKORB' ); apex_collection. create_collection_from_query ( MERKLISTE', select * from merkliste where ' );
create_collection_from_query select * from
create_collection_from_query where
Collection auflösen Warenkorb-Prinzip Abfrage-Prinzip Alle Datensätze prüfen in fachliche Tabellen einfügen apex_collection. delete_collection ( collection_name ) Datensätze prüfen INSERT, UPDATE oder DELETE
Hinzufügen eines Datensatzes apex_collection.add_member ( p_collection_name => 'WARENKORB',p_c001,p_c002,p_c003,p_c004,p_c005 -- usw. ); => :P100_C001 => :P100_C002 => :P100_C003 => :P100_C004 => :P100_C005
Aktualisieren eines Datensatzes apex_collection.update_member ( p_collection_name => 'WARENKORB',p_seq => :P100_SEQ_ID,p_c001,p_c002,p_c003,p_c004,p_c005 -- usw. ); => :P100_C001 => :P100_C002 => :P100_C003 => :P100_C004 => :P100_C005
Löschen eines Datensatzes apex_collection.delete_member ( p_collection_name => WARENKORB,p_seq => :P100_SEQ_ID );
Collection-Lifecycle (Beispiel 1) create_collection add_member add_member update_member insert into TABELLE select * from APEX_COLLECTIONS delete_collection
Collection-Lifecycle (Beispiel 2) create_collection_from_query [ Zeile hinzufügen ] add_member [ Speichern ] PL-SQL-Loop, truncate_collection
Tabular Form updaten for i in 1.. apex_application.g_f01.count loop apex_collection.update_member ( p_collection_name => 'WARENKORB,p_seq => apex_application.g_f01( i ),p_c001 => apex_application.g_f02( i ),p_c002 => apex_application.g_f03( i ),p_c003 => apex_application.g_f04( i ),p_c004 => apex_application.g_f05( i ),p_c005 => apex_application.g_f06( i ) ); end loop;
Zwischenstand: Collections Zuordnung Tabellenspalten zu Collection- Spalten, fehleranfällig Erzeugen einer Collection über APEX_COLLECTION -Aufruf Einfügen, Ändern, Löschen, Beenden über APEX_COLLECTION -Aufrufe
Nutzdaten C001 C002 C003 C048 C049 C050 N001 N005 D001 D005 BLOB001 CLOB001 XMLTYPE001
kombiniere Tabelle Collection APEX Fehlerquellen potenzieren sich Viel, viel (sehr viel) Code notwendig
Demo: Code-Generator verwenden
Code und Seite "verheiraten"
Code und Seite "verheiraten" Musterseite anlegen (einmalig) "Buttons"-Region ADD_ROW - Schaltfläche CREATE_COLLECTION (raise_application_error) STORE_MRU (raise_application_error) SAVE_MRU_TO_TABLE (raise_application_error) Musterseite kopieren COPY & PASTE aus dem APEX-Codegenerator Berichtsspalten auf "Standard Report Column" umstellen
Resultat
Validierung? eigenen PL/SQL-Code hinzufügen
Tabular Form Start Index A_Collection B_Collection C_Collection 1 50 apex_application.g_f01 apex_application.g_f50
Debugging privat bedeutet privat Collection-Inhalte (zunächst) nur in derselben Benutzersession sichtbar Auf Formularseiten einen einfachen Report über die Collection anzeigen: select * from tabellenname_cv;
Meta-Informationen C001 C002 C003 C048 C049 C050 N001 N005 D001 D005 BLOB001 CLOB001 XMLTYPE001 N001 N002 N003 N004 N005 neu - geändert sichtbar - unsichtbar Versionsnummer erfolgreich validiert - nicht validiert übergeordneter Datensatz (SEQ_ID)
Verkettete Liste C001 C002 C003 C048 C049 C050 N001 N005 D001 D005 BLOB001 CLOB001 XMLTYPE001 N001 N002 N003 N004 N005 Vorgänger Nachfolger
Historie C001 C002 C003 C048 C049 C050 N001 N005 D001 D005 BLOB001 CLOB001 XMLTYPE001 D001 D002 D003 D004 D005 erstellt am letzte Änderung am validiert am zuletzt gespeichert am gültig bis
Freie Auswahl C001 C002 C003 C048 C049 C050 N001 N005 D001 D005 BLOB001 CLOB001 XMLTYPE001 Direkte Vorversion des Datensatzes Änderungshistorie <aenderung user= Heinz" datum="2012-06-14 23:59:11"> <feld name="x" wert-alt="1" wert-neu= "2"/> <feld name="y" wert-alt="10" wert-neu= "20"/> </aenderung> Informationen für der Benutzer (Kommentare, ToDo, Links, Dokumentverweise ) HTML
Fallstricke Datensatz-Status (neu, geändert, gelöscht) Integrität (Pessimistic Locking)
Demo: Exception Handler Generator
Fazit? Beißen Sie sich durch die Dokumentation Bauen Sie nichts nach, das es bereits gibt Schreiben Sie Code-Generatoren
Lesetipp Expert Oracle Application Express (Verlag: Apress, Mai 2011) ausführlicher Teil zu Tabular Forms gute Einführung zu APEX-Collections Charts, Dynamic Actions, Plugins u.v.m.
Andreas Wismann wismann@when-others.com WHEN OTHERS Beratung Programmierung Coaching