|
Änderbare Kreuztabellen in Application Express ...
Insbesondere in Geschäftsberichten wird häufig die
Darstellung als Kreuztabelle
gewünscht.
Abb. 1: Bericht als Kreuztabelle darstellen
Abbildung 1 zeigt den Unterschied zwischen einem normalen
Application Express-Bericht und der Darstellung als Kreuztabelle. In
der Kreuztabelle werden die Daten im Grunde genommen "gekippt". Wie
man einen Application Express-Bericht als Kreuztabelle darstellt, haben
Sie bereits in der
letzten Ausgabe erfahren. Lesen Sie heute, wie
Sie diese Kreuztabelle änderbar machen;
der Endanwender kann die Daten
in der Tabelle also ändern - die Applikation ändert jedoch die Daten
in der (in Abbildung 1 links dargestellten) Original-Tabelle
(hier UMSATZ).
Editierbare Berichte bietet Application
Express als tabellarische Formulare
eigentlich out-of-the-box an. Allerdings
erwartet das "normale" tabellarische Formular, dass die Daten in der Form dargestellt
werden, wie sie in der Tabelle vorliegen. Mit der Kreuztabelle, welche die
Daten ja in "gekippter" Form darestellt, kann es nicht umgehen.
Allerdings kann man das mit ein wenig Programmierung selbst erledigen.
Die reine Darstellung der Daten als Kreuztabelle ist ja bereits fertig - das Ergebnis
der letzten Ausgabe ist Ausgangspunkt für heute. Als nächste Schritte
werden Sie nun ...
-
Eingabefelder in der Kreuztabelle darstellen, damit der Endanwender
Daten eingeben kann.
-
Einen PL/SQL-Prozeß schreiben, der die eingebenen Daten richtig in die
Originaltabelle einfügt.
-
Eine "Sicherung" einbauen, so dass der Anwender eine Warnung bekommt,
wenn ein anderer Nutzer die gleichen Daten zwischenzeitlich geändert
hat (Optimistisches Locking)
Navigieren Sie also zu den Berichtsattributen und
dort zu den Attributen der einzelnen Spalten der Kreuztabelle (Abbildung 2).
Abb. 2: Spaltenübersicht in den Berichtsattributen der Kreuztabelle
Navigieren Sie nun in die Spaltenattribute der einzelnen Spalten
der Kreuztabelle und gehen Sie in den Bereich Tabellarisches Form-Element
(Abbildung 3). Wählen Sie für die Spalte PRODUKT, also die
ganz linke
Spalte der Kreuztabelle den Wert
Als Text anzeigen (hat Speicherstatus)
bei Anzeigen als aus. Dadurch wird die
Spalte wie bisher dargestellt; Sie
haben aber im PL/SQL-Prozeß später Zugriff auf die Inhalte.
Wählen Sie für die nachfolgenden Datenspalten den Wert
Textfeld bei
Anzeigen als aus
und geben Sie die Elementbreite nach Ihren
Wünschen ein ("10" meint 10 Zeichen).
Damit wird das Feld im Bericht editierbar.
Abb. 3: Einstellungen für das tabellarische Formular in den Spaltenattributen konfigurieren
Klicken Sie dann auf Änderungen anwenden und
verfahren Sie mit den anderen
Datenspalten analog. Wenn Sie die Seite danach neu starten, sollte sie in etwa
wie in Abbildung 4 aussehen.
Abb. 4: Die editierbare Kreuztabelle
Nun fehlen noch Schaltflächen, um die gemachten Änderungen zu speichern. Fügen Sie
also eine neue Schaltfläche hinzu. Erzeugen Sie eine Schaltfläche, die
in einer Regionsposition angezeigt wird und
welche die Seite weiterleitet (Abbildung 5).
Das Template und die
Position können Sie nach Ihren Vorstellungen
aussuchen - nach Klick auf die Schaltfläche soll auf die gleiche Seite (hier:
Seite 1)
zurückverzweigt werden.
Abb. 5: Schaltflächenattribute
Nun geht's ans Eingemachte: Wenn auf die neue Schaltfläche geklickt wird,
sollen die Daten gespeichert werden. Dazu benötigen Sie etwas PL/SQL-Code. Erzeugen
Sie also einen neuen PL/SQL-Prozeß, welcher beim Weiterleiten
der Seite (onSubmit)
durch die soeben erzeugte Schaltfläche APPLY_CHANGES
ausgeführt werden soll.
Innerhalb des PL/SQL-Code haben Sie durch die vordefinierten Arrays
APEX_APPLICATION.G_F01
bis APEX_APPLICATION.G_F50 Zugriff auf die Elemente
eines tabellarischen Formulars - dabei wird auf der linken Seite mit dem Zählen
begonnen. Die Spalte PRODUKTE
(die benötigen Sie beim späteren UPDATE
in der Originaltabelle für die WHERE-Klausel)
befinden sich also in
APEX_APPLICATION.G_F01 und die fünf
Datenspalten sind in den Arrays
APEX_APPLICATION.G_F02 bis
APEX_APPLICATION.G_F06. Hinterlegen Sie für
den PL/SQL-Prozeß also folgenden PL/SQL Code.
Der PL/SQL Code sieht nur auf den ersten Blick kompliziert aus: Da die Kreuztabelle
fünf Datenspalten hat (die eingegebenen Daten also in den Arrays
APEX_APPLICATION.G_F02
bis APEX_APPLICATION.G_F06 enthalten sind),
muss für jedes dieser Arrays ein
MERGE-Statement im Code angegeben werden.
Das SQL MERGE ist nötig, da für leere
Eingabefelder noch gar keine Zeile in der Originaltabelle existiert - sie
muss also eingefügt (INSERT) werden.
Für geänderte Werte wird ein UPDATE durchgeführt.
Wenn Sie sich die einzelnen MERGE-Kommandos ansehen,
erkennen Sie in der USING-Klausel,
dass das Datum stets um einen Tag erhöht wird und jeweils das nächste Array
angesprochen wird.
Probieren Sie das tabellarische Formular nun aus, indem Sie einige Änderungen
vornehmen - man erkennt, dass auch die Daten in der links dargestellten
Originaltabelle entsprechend geändert werden.
Abb. 6: Die änderbare Kreuztabelle funktioniert
Fehlt nur noch eines: Wenn ein anderer Nutzer
in der Zeit zwischen dem
Laden des Formulars und dem Speichern der Änderungen
eigene Änderungen
an den gleichen Daten durchführt, werden diese durch den PL/SQL-Prozeß
einfach überschrieben - das ist jedoch in vielen Fällen nicht gewünscht.
Im folgenden werden wir daher das Formular so erweitern, dass es vor dem
Speichern der Änderungen feststellt, ob die Daten zwischenzeitlich
von einer anderen Stelle aus geändert wurden.
Fügen Sie Ihrer Applikation dazu eine neue
Validierung auf Seitenebene
hinzu. Die Validierung soll als
PL/SQL-Funktion, die booleschen Wert zurückgibt
erfolgen - der PL/SQL-Code stellt also fest, ob die Daten zwischenzeitlich
geändert wurden und liefert true zurück,
wenn alles in Ordnung ist und
false, wenn Daten geändert wurden - der
Anwender sich die Daten also nochmals ansehen sollte.
Application Express hat beim Laden der Seite bereits MD5-Checksummen
für alle Zeilen des tabellarischen Formulars berechnet. Diese befinden sich
im Array APEX_APPLICATION.G_FCS. Die Validierung
erfolgt nun beim Absenden
des Formulars: Die Prüfsummenberechnung muss nochmals durchgeführt und die
MD5-Checksummen der einzelnen Zeilen müssen mit denen im Array
APEX_APPLICATION.G_FCS
verglichen werden. Sind alle Prüfsummen gleich, wurden die Daten zwischenzeitlich
nicht geändert, der vorhin erstellte PL/SQL-Prozeß kann loslaufen. Bei Unterschieden
soll eine Fehlermeldung angezeigt werden.
Der PL/SQL-Code für die Validierung hängt von der Art und Weise ab, wie Sie
die Kreuztabelle erstellt haben. Das folgende Beispiel basiert auf der
Version "vor Oracle11g" und der Funktion
getPivotSQL(). Diese Funktion wird
nun genau wie für die Kreuztabelle aufgerufen; das zurückgegebene SQL wird allerdings
nochmal von einem Aufruf auf WWV_FLOW_ITEM.MD5 umschlossen.
Das so
ermittelte SQL wird mit EXECUTE IMMEDIATE aufgerufen,
so dass eine Liste
mit Prüfsummen für die Zeilen der Kreuztabelle zurückgegeben wird. Diese wird in der anschließenden
Schleife mit den Summen im Array APEX_APPLICATION.G_FCS
verglichen; sobald
in Unterschied auftritt, wird das Ergebnis der Funktion auf
false gesetzt.
Wenn Sie auf einer Oracle11g Datenbank arbeiten und die
neue PIVOT-Klausel für Ihre Kreuztabelle verwendet haben, muss
auch der PL/SQL-Code anders aussehen. Im Grunde
genommen ist es aber dasselbe. Nur das zugrundeliegende SQL für die Kreuztabelle ist ein anderes.
Probieren Sie es nun aus: Starten Sie die Seite und ändern Sie in der Kreuztabelle
sichtbaren Daten der Tabelle UMSATZ
dann in SQL*Plus oder im
SQL Workshop (Commit
nicht vergessen). Nehmen Sie dann im Formular Änderungen vor und senden Sie die
Seite ab. Sie sollten dann eine Fehlermeldung bekommen (Abbildung 7)
Abb. 7: Fehlermeldung, wenn die Inhalte der Kreuztabelle bereits von andere Seite geändert wurden
Damit ist die änderbare Kreuztabelle fertig. Sie können Daten mit der Oracle
Datenbank und Application Express also nicht nur pivotieren (kippen), sondern
diese Tabelle auch noch ändern und die Änderungen direkt auf die Originaltabelle
durchreichen.
Zurück zur Community-Seite
|