Logo Oracle Deutschland   Deutschsprachige APEX und PL/SQL Community

Berichte automatisch aktualisieren

Erscheinungsmonat APEX-Version Datenbankversion
September 2012 ab 4.0 ab 10.2

Einen Bericht auf einer Anwendungsseite in regelmäßigen Abständen zu aktualisieren, ist recht einfach: Seit APEX 4.0 muss man noch nicht einmal JavaScript-Code dafür programmieren; mit einem einfach zu nutzenden Plugin des APEX-Entwicklerteams setzt man das in kürzester Zeit um. In diesem Tipp gehen wir noch etwas weiter: Für eine Tabelle, die eine Spalte mit dem Zeitpunkt der letzten Änderung enthält, wollen wir die zuletzt geänderten Werte hervorheben, so dass man sie leichter erkennen kann.

Zunächst braucht es eine Tabelle, deren Inhalte im Bericht dargestellt werden sollen. das folgende Skript erstellt sie und füllt sie mit einigen Zeilen.

create table tab_preise(
  id            number(10) primary key,
  produkt       varchar2(200),
  preis         number(15,2),
  letzte_aend   date,
  preis_aend    number
)
/

create or replace trigger tr_tabpreise_setdate 
before insert or update on tab_preise
for each row
begin
  :new.letzte_aend := sysdate;
  :new.preis_aend := :new.preis - :old.preis;
end;
/

insert into tab_preise values (1, 'USB Sticks 16G', 32,sysdate,null);
insert into tab_preise values (2, 'Maus kabellos USB', 15.95, sysdate,null);
insert into tab_preise values (3, 'USB Hub', 4.95, sysdate,null);
insert into tab_preise values (4, 'Keyboard Kabel', 14.95, sysdate,null);
insert into tab_preise values (5, 'LCD Monitor 1280x800', 259.95, sysdate,null);
insert into tab_preise values (6, 'Mainboard PX7812', 79.95, sysdate,null);
insert into tab_preise values (7, 'WLAN Router X300', 89.95, sysdate,null);
insert into tab_preise values (8, 'Netzwerkkabel 20m', 19.95, sysdate,null);
insert into tab_preise values (9, 'Monitorkabel DVI', 9.95, sysdate,null);
insert into tab_preise values (10, 'Dockingstation Laptop', 49.95, sysdate,null);

  
commit
/

Erzeugen Sie danach einen klassischen Bericht auf diese Tabelle mit folgender SQL-Abfrage.

select 
  id, 
  produkt,
  preis,
  letzte_aend,
  preis_aend,
  case 
    when preis_aend < 0 then 'red'
    when preis_aend > 0 then 'green'
    else 'black'  
  end as aend_textfarbe,
  case
    when sysdate - interval '30' second < letzte_aend then 'yellow'
    else 'transparent'
  end as aend_hintergrund
from tab_preise

Der Bericht sollte dann zunächst wie in Abbildung 1 aussehen.

Der erzeugte Bericht sieht zunächst so aus

Abbildung 1: Der erzeugte Bericht sieht zunächst so aus

Danach geht es daran, die mit den in der SQL-Abfrage verwendeten CASE-Anweisungen berechnten Farben auch tatsächlich zu verwenden. Navigieren Sie zu den Berichtsattributen und nehmen Sie folgende Änderungen an Ihrem Bericht vor.

  • Entfernen Sie das Häkchen Anzeigen bei den Spalten ID, AEND_TEXTFARBE und AEND_HINTERGRUND - diese sind reine Hilfsspalten.
  • Setzen Sie die Formatmaske der Spalte LETZTE_AEND auf DD.MM. HH24:MI:SS.
  • Navigieren Sie zu den Spaltenattributen der Spalte PREIS_AEND , dort zum Abschnitt HTML-Ausdruck und hinterlegen Sie folgendes:
    <span style="background-color: #AEND_HINTERGRUND#; 
                 color: #AEND_TEXTFARBE#; 
                 font-weight: bold;">#PREIS_AEND#</span>
    
  • Tragen Sie danach den folgenden Ausdruck unter HTML-Ausdruck der Spalte PREIS ein. Setzen Sie die Formatmaske der Spalte auf 9990D00.
    <span style="background-color: #AEND_HINTERGRUND#; 
                 font-weight: bold;">#PREIS#</span>
    
    HTML-Ausdruck für die Darstellung der Spalte PREIS eintragen

    Abbildung 2: HTML-Ausdruck für die Darstellung der Spalte PREIS eintragen

    Ändern Sie bei der Gelegenheit auch gleich die Formatmaske auf 9990D00.

Ändern Sie danach (im SQL Workshop oder mit SQL*Plus) einen der Preise um (COMMIT nicht vergessen) und starten Sie die Berichtsseite unmittelbar danach. Der Bericht sollte dann etwa wie in Abbildung 3 aussehen.

update TAB_PREISE set PREIS = 200 where ID = 4;

commit;
APEX-Bericht mit hervorgehobenen letzten Änderungen

Abbildung 3: APEX-Bericht mit hervorgehobenen letzten Änderungen

Natürlich bietet der klassische APEX Bericht noch mehr Möglichkeiten an, die Änderungen farblich hervorzuheben - neben dem hier angesprochenden Weg über den HTML-Ausdruck einer Berichtsspalte kann man natürlich auch mit Berichts-Templates arbeiten und so ggfs. die ganze Zeile mit einer anderen Hintergrundfarbe versehen werden - das soll hier aber nicht weiter vertieft werden.

Nun geht es daran, den Bericht automatisch zu aktualisieren. Das ist einerseits mit ein paar Zeilen JavaScript möglich, andererseits gibt es seit APEX 4.0 die APEX Plugins - und für das regelmäßige Aktualisieren einer APEX-Region lässt sich das vom APEX Entwicklerteam bereitgestellter Plugin Timer hervorragend nutzen. Laden Sie es also aus dem Oracle APEX Plugin Repository herunter (Direkter Link) und importieren Sie es in Ihre Anwendung (Gemeinsame Komponenten, Plugins, Schaltfläche Importieren).

Um den Bericht regelmäßig zu aktualisieren, müssen Sie Ihrer Anwendungsseite nun zwei neue dynamische Aktionen hinzufügen (Abbildung 4).

Eine neue dynamische Aktion hinzufügen

Abbildung 4: Eine neue dynamische Aktion hinzufügen

Die erste dynamische Aktion dient dazu, im Browser ein Timer-Event zu setzen. Es wird noch nicht bestimmt, was bei Ablauf des Timers passieren soll (das legt dann die zweite dynamische Aktion fest).

  • Wählen Sie eine dynamische Aktion vom Typ Advanced
  • Geben Sie der dynamischen Aktion einen Namen, bspw. Timer für Berichts-Refresh setzen
  • Wählen Sie Page Load als Ereignis aus der Auswahlliste aus. Eine Bedingung brauchen Sie nicht.
  • Suchen Sie Timer [Plug-In] aus der Auswahlliste als Aktion aus. Stellen Sie das Plugin so ein, dass der Timer alle 10 oder 20 Sekunden feuert (Abbildung 5).
    Als dynamische Aktion wird das Plugin ausgeführt

    Abbildung 5: Als dynamische Aktion wird das Plugin ausgeführt

  • Als Betroffenes Element wählen Sie jetzt schon die Berichtsregion Preise aus - das ist wichtig, denn hierüber wird der gesetzte Timer mit der Aktion, die bei Ablauf des Timers geschehen soll, kombiniert.
    Die Berichtsregion "Preise" ist das Betroffene Element

    Abbildung 6: Die Berichtsregion "Preise" ist das Betroffene Element

  • Mit einem Klick auf die Schaltfläche Erstellen wird die dynamische Aktion schließlich angelegt.

Danach kommt direkt die zweite dynamische Aktion - diese wird bei Ablauf des Timers feuern und den Bericht aktualisieren.

  • Wählen Sie eine dynamische Aktion vom Typ Advanced
  • Geben Sie der dynamischen Aktion einen Namen, bspw. Bericht aktualisieren
  • Wählen Sie Timer Expired als Ereignis aus der Auswahlliste aus (ganz unten). Eine Bedingung brauchen Sie nicht. Als Auswahltyp nehmen Sie Region und als Region den Bericht mit den Preisen (Abbildung 7).
    Die zweite dynamische Aktion feuert, wenn der Timer abgelaufen ist

    Abbildung 7: Die zweite dynamische Aktion feuert, wenn der Timer abgelaufen ist

  • Als Aktion wählen Sie Aktualisieren aus.
  • Das Betroffene Element ist wiederum die Berichtsregion Preise.
  • Mit einem Klick auf die Schaltfläche Erstellen wird die dynamische Aktion schließlich angelegt.

Nun können Sie die Seite nochmals starten - der Bericht sollte sich nun alle 10 oder 20 Sekunden auffrischen (je nachdem, was Sie eingestellt haben). Anhand der Hervorhebungen sollten Sie die jüngsten, im Hintergrund (mit SQL*Plus oder dem SQL Workshop) gemachte Änderungen sofort erkennen können.

Bericht mit hervorgehobenen, kürzlich gemachten Änderungen

Abbildung 8: Bericht mit hervorgehobenen, kürzlich gemachten Änderungen

Nach kurzer Zeit verschwinden die Hervorhebungen.

Bericht ohne hervorgehobene, kürzlich gemachte Änderungen

Abbildung 9: Bericht ohne hervorgehobene, kürzlich gemachte Änderungen

Wie lange eine Zeile hervorgehoben sein soll, ist durch den Ausdruck ...

sysdate - interval '30' second < letzte_aend 

... in der SQL-Abfrage bestimmt. Wenn Sie möchten, dass die Änderungen bis zu fünf Minuten hervorgehoben werden sollen, ändern Sie das entsprechend um ...

sysdate - interval '5' minute < letzte_aend 

zurück zur Community-Seite