Reports in iFrame laden

Dashboard beschleunigen, indem Reports in iFrames geladen werden

Wenn ein Dashboard in Cognos als Bericht entwickelt werden soll, eigenen sich JQuery-Tabs hervorragend, um den Bericht übersichtlich zu gestalten und die Inhalte ansprechend zu gruppieren. Jedoch wird der Bericht u.U. sehr langsam, wenn viele Diagramme und Inhalte im Dashboard angezeigt werden soll.
Diesem Umstand kann man hervorragend mit iFrames begegnen. Innerhalb der iFrames werden Subreports geladen. Dies geschieht asynchron zum Hauptbericht, so dass das Dashboard sehr schnell angezeigt wird, die einzelnen Inhalte aber nachgeladen werden. Vorallem in Verbindung mit den Tabs eine gute Möglichkeit, den Bericht schnell erscheinen zu lassen, da die Inhalte der noch nicht sichtbaren Tabs nicht direkt geladen werden müssen, sondern entsprechend der Reportgeschwindigkeit der Subreports nach und nach erscheinen.

Um diesen Effekt zu ermöglichen, müssen im Hauptbereicht per HTML-Element für jeden Tab ein iFrame eingefügt werden. Die Quelle des iFrames ist eine Dummy-HTML-Datei, die lediglich ein Formular enthält.

HTML-Element für den iFrame im Bericht

<iframe id="subreport_frame1" onload="setFrameParams(this);" scrolling="no" frameborder="0" style="width=100%; height=450px" src="/../samples/reportLoader.html"></iframe>

Dummy-HTML-Datei für den ReportLoader

<html>
<body>
<form action="/cognos8/cgi-bin/cognosisapi.dll" name="form_reportloader" method="post"> 
<input type="hidden" name="b_action" value="xts.run" /> 
<input type="hidden" name="m" value="portal/report-viewer.xts" /> 
<input type="hidden" name="method" value="run" /> 
<input type="hidden" name="prompt" value="false" />
<input type="hidden" name="ui.header" value="false" />
</form> 
</body>
</html>

Funktion zur Parameter-Übergabe an den Subreport

Um nun einen Bericht innerhalb des iFrames zu laden, müssen die nötigen Berichtsparameter und einige Cognos-Steuerparameter an das Dummy-Formular übergeben werden. Danach wird das Formular abgeschickt und führt dadurch den Bericht aus. Über den HTTP-Post kann man beliebig viele Parameter übergeben, die HTTP-Get Methode, die die Parameter über die URL weitergibt, birgt Probleme bei der URL-Länge und auch teilweise bei Parameter-Inhalten (z.B. Umlaute oder Ampersants).

Um das Dummy-Formular zu füllen, ist wiederum ein HTML-Element im Bericht notwendig.

<script>
' Funktion zur Erzeugung eines neuen Formular-Eingabeelements, das den Parameterwert für den Bericht aufnimmt

function getParamElem(doc, param_name, param_val) {
 var elem_new;
 elem_new = doc.createElement("input");
 elem_new.type = "hidden";
 elem_new.name = param_name;
 elem_new.value = param_val;
 return elem_new;
 }
' Setzen aller Berichts-Parameter, die an den auszuführenden Bericht übergeben werden

function setParams(frame_elem) {
 var frmLoader1 = frame_elem.contentWindow.document.forms.form_reportloader;
 if (typeof frmLoader1 == "undefined") return false;
 var docLoader1 = frame_elem.contentWindow.document;
 var reportName;
 ' Hier muss der Package-Name und der Berichtsname des Subreports eingetragen werden.
 reportName = "/content/package[@name='<PACKAGE_NAME>']/report[@name='<REPORT_NAME>']";
 frmLoader1.elements.appendChild(getParamElem(docLoader1, "m_obj", reportName));
 ' Hier werden die einzelnen Parameter übergeben. Vor dem Parameter-Namen muss p_ eingefügt werden.
 frmLoader1.elements.appendChild(getParamElem(docLoader1, "p_PARAM1", 'Paramwert 1'));
 frmLoader1.elements.appendChild(getParamElem(docLoader1, "p_PARAM2", 'Paramwert 2'));
 frmLoader1.elements.appendChild(getParamElem(docLoader1, "p_PARAM3", 'Paramwert 3')); 
 frmLoader1.submit();
 }
</script>

Im Bericht passiert nun Folgendes: der Hauptbericht wird ausgeführt. In diesem Bericht werden die enthaltenen iFrames mit dem Dummy-Formular geladen. Nach dem Laden des Dummy-Formulars wird die Funktion setParams() aufgerufen. Diese erzeugt für jeden Parameter eine neue INPUT-Box innerhalb des Dummy-Formulars, füllt diese mit Werten und schickt das Formular im Anschluss ab. Dadurch wird der Subreport dann innerhalb des iFrames geladen.

Login-Footer

Copyright © 2017 OCToConsult - Oliver C. Tank. Alle Rechte vorbehalten.
Joomla! ist freie, unter der GNU/GPL-Lizenz veröffentlichte Software.