Berichte automatisch aktualisieren

Einen Bericht auf einer Anwendungsseite in auf Anfrage oder in regelmäßigen Abständen zu aktualisieren, ist recht einfach: Mit Hilfe der AJAX-Technologie und JavaScript kann dies sogar erfolgen, ohne dass die anderen Bereiche der Anwendungsseite überhaupt betroffen sind.

Beim Umsetzen ergeben sich Unterschiede zwischen "klassischen" und "interaktiven" Berichten. Dieser Tipp geht auf beide Varianten ein: Zunächst wird beschrieben, wie man einen klassischen Bericht auffrischt, anschließend wird die Vorgehensweise für interaktive Berichte erläutert.

Schritt 1: "Klassischen" Bericht erzeugen

Erzeugen Sie zunächst einen klassichen SQL-Bericht auf Ihrer Anwendungsseite. Verwenden Sie als Berichtsquelle folgendes SQL:

select 
  sysdate  as aktuelles_datum,
  empno    as employee_id,
  ename    as employee_name, 
  hiredate as employee_hiredate,
  sal      as employee_salary
from EMP

Navigieren Sie anschließend zunächst zu den Berichtsattributen, dort zu den Spaltenattributen und stellen Sie für die Spalte AKTUELLES_DATUM ein Datumsformat ein, bei dem Sie auch Minuten und Sekunden erkennen können; in diesem Beispiel benötigen Sie das, damit Sie die Aktualisierung des Berichts erkennen können.

Format für Berichtsspalte AKTUELLES_DATUM setzen

Abbildung 1: Format für Berichtsspalte AKTUELLES_DATUM setzen

Stellen Sie weiterhin sicher, dass die sog. Partial Page Refresh -Eigenschaft des Berichts aktiviert ist (Abbildung 2).

Partial Page Refresh-Eigenschaft des Berichts setzen

Abbildung 2: Partial Page Refresh-Eigenschaft des Berichts setzen

Navigieren Sie dann zu den Regionsdefinition (erste Reiterkarte) und geben Sie der Region eine Statische ID wie in Abbildung 3 dargestellt.

Statische ID "EMP_REPORT" vergeben

Abbildung 3: Statische ID "EMP_REPORT" vergeben

Schritt 2: Bericht mit AJAX-Technologie aktualisieren

Damit ist der Bericht vorbereitet. Hinterlegen Sie nun den JavaScript-Code, welcher den Bericht auf Anfrage aktualisiert. Navigieren Sie dazu zu den Seitenattributen, dort zum HTML-Header und tragen Sie dort folgenden Code ein:

<script type="text/javascript">
function refreshReport(pStatReportId){
  var currentSort, lHref, start, end, oppSort, descPos, reportId, els;

  // Diese Zeile ermittelt die HTML-Tabellenelemente mit
  // den Spaltenüberschriften. Sie passt zu den von Oracle gelieferten
  // Standardtemplates. Wenn eigene Berichtstemplates
  // verwendet werden, in denen die Überschriften nicht mit dem
  // HTML-Tag TH gebildet werden, muss der Code angepasst werden.

  els = $x(pStatReportId).getElementsByTagName("th");
  for (i=0; i<els.length; i++){
    if (els[i].childNodes.length > 1) {
      lHref = els[i].firstChild.href;
      if (lHref) {
        start = lHref.indexOf('\'',1) + 1;
        end = lHref.indexOf('\'',start);
        reportId = lHref.substring(start,end);
        start = lHref.indexOf('\'',end+1) + 1;
        end = lHref.indexOf('\'',start);
        oppSort = lHref.substring(start,end);
        descPos = oppSort.search(/desc/);
        if (descPos != -1){
          currentSort = oppSort.substring(0,descPos-1);
        }else{
          currentSort = oppSort + '_desc';
        }
      }
    }
  }

  $a_report(reportId,false,false,false,currentSort);
}
</script>

Dieser JavaScript-Code stellt Ihnen die Funktion refreshReport({regions-id}) bereit, welche die statische Regions-ID als Parameter entgegennimmt und den Bericht dann entsprechend aktualisiert. Sie sollte mit allen von Oracle mitgelieferten Berichtstemplates funktionieren. Wenn Sie eigene Berichts-Templates verwenden, sollte in diesen das HTML-Tag <th> für die Spaltenüberschriften verwendet werden - ist das nicht der Fall, müssen Sie den JavaScript-Code anpassen.

Fügen Sie nun unterhalb des Berichts eine neue Region vom Typ HTML hinzu und hinterlegen Sie darin folgende Regionsquelle:

<a href="javascript:refreshReport('EMP_REPORT');">Bericht aktualisieren</a>

Wenn Sie die Seite nun neu starten und auf den Link Bericht aktualisieren klicken, sollte sich der Bericht auffrischen - ob es funktioniert, erkennen Sie an der ersten Spalte mit dem aktuellen Datum (Abbildung 4).

Bericht per Klick auf den Link aktualisieren

Abbildung 4: Bericht per Klick auf den Link aktualisieren

Schritt 3: Bericht automatisch intervallweise aktualisieren

Nun geht es im letzten Schritt daran, diese Auffrischung automatisch intervallweise durchzuführen. Navigieren Sie dazu wiederum zur Seitendefinition und dort zum HTML-Header. Fügen Sie dort zusätzlich zum bereits vorhandenen JavaScript-Code (unterhalb) folgenden hinzu:

<script language="JavaScript1.1" type="text/javascript">
 var g_interval = null;
 
 function startRefresh() {
   g_interval = window.setInterval("refreshReport('EMP_REPORT')", 5000);
 }

 function stopRefresh() {
   window.clearInterval(g_interval);
 }
</script>

Die 5000 im Aufruf von setInterval gibt (in Millisekunden) an, welches Intervall zum Aktualisieren des Berichts verwendet werden soll. Achten Sie bei kleinen Werten darauf, dass die Aktualisierung selbst auch ein wenig Zeit benötigt. Speichern Sie die Seite dann ab.

Fügen Sie zum Abschluß noch zwei Links zum Ein- und Ausschalten der automatischen Aktualisierung ein. Ändern Sie den Quelltext der HTML-Region wie folgt:

<a href="javascript:refreshReport('EMP_REPORT');">Bericht aktualisieren</a><br>
<a href="javascript:stopRefresh();">Aktualisierung stoppen</a><br>
<a href="javascript:startRefresh();">Aktualisierung beginnen</a>

Starten Sie die Seite anschließend neu und klicken Sie auf den neuen Link Aktualisierung beginnen. Beobachten Sie dann, wie sich der Bericht alle 5 Sekunden auffrischt. Ein Klick auf Aktualisierung stoppen beendet den Prozeß.

Interaktive Berichte automatisch aktualisieren

Die bis hierher beschriebene Vorgehensweise funktioniert nicht mit interaktiven Berichten, da diese einen völlig anderen Aufbau haben. Die Umsetzung ist hier allerdings noch einfacher. Erzeugen Sie also einen interaktiven Bericht mit der gleichen SQL-Abfrage und stellen Sie das Datumsformat der ersten Spalte ebenfalls, wie eingangs dargestellt, auf DD.MM.YYYY HH24:MI:SS um.

interaktiver Bericht

Abbildung 5: interaktiver Bericht

Um einen interaktiven Bericht zu aktualisieren, brauchen Sie keine eigene JavaScript-Funktion; rufen Sie einfach die bereits vorhandene Funktion gReport.search('SEARCH') auf (der Parameter SEARCH referenziert das Eingabefeld für den Suchbegriff). Erzeugen Sie also (wie vorhin) eine HTML-Region mit folgender Regionsquelle unterhalb des interaktiven Berichts.

<a href="javascript:gReport.search('SEARCH');">Bericht aktualisieren</a>

Starten Sie die Seite und probieren Sie den Link aus; der Bericht aktualisiert sich bei Klick darauf - alle gemachten Einstellungen bleiben erhalten. Eingaben ins Suchfeld werden berücksichtigt.

interaktiven Bericht per Klick auffrischen

Abbildung 6: interaktiven Bericht per Klick auffrischen

Entsprechend einfach ist nun auch die Einrichtung der automatischen Aktualisierung. Navigieren Sie nochmals zur Seitendefinition, dort wiederum zum Seiten-Header und fügen Sie zusätzlich zum bereits vorhandenen JavaScript-Code folgenden hinzu.

<script language="JavaScript1.1" type="text/javascript">
 var g_interval_ir = null;
 
 function startRefreshIR() {
   g_interval_ir = window.setInterval("gReport.search('SEARCH')", 5000);
 }

 function stopRefreshIR() {
   window.clearInterval(g_interval_ir);
 }
</script>

Ändern Sie abschließend den Quelltext der HTML-Region mit dem Aktualisierungs-Link wie folgt:

<a href="javascript:gReport.search('SEARCH');">Bericht aktualisieren</a><br>
<a href="javascript:stopRefreshIR();">Aktualisierung stoppen</a><br>
<a href="javascript:startRefreshIR();">Aktualisierung beginnen</a>

Starten Sie die Seite und probieren Sie es aus: Mit einem Klick auf Aktualisierung starten wird sich der interaktive Bericht alle 5 Sekunden auffrischen.

Zurück zur Community-Seite