Search
Search Keyword: Total 5 results found.
Tag: Coding Ordering

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

{codecitation style="brush: JavaScript;"}

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

{/codecitation}

Dummy-HTML-Datei für den ReportLoader

{codecitation style="brush: JavaScript;"}

<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>

{/codecitation}

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.

{codecitation style="brush: JavaScript;"}

<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>

{/codecitation}

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.

Die Ausführen-Schaltfläche im Reportviewer entfernen

Manchmal ist es erwünscht, bei der Anzeige von Berichten keinen Ausführen-Knopf in der Cognos-Toolbar angezeigt zu bekommen, da der Bericht z.B. nur über Drill-Through oder Berichtsansichten gestartet werden soll.

Den Ausführen-Knopf kann man auf folgende Arten entfernen:

Cognos 8.2

Es reicht, ein HTML-Element mit folgendem Inhalt zu erstellen:

{codecitation style="brush:css;"}<style> #tbbutton5 {   display:none } </style>{/codecitation}

Cognos 8.4

In Cognos 8.4 ist es schon etwas komplizierter. Es reicht nicht, einen einfachen CSS-Style anzulegen. Obwohl der Button auch hier eine ID hat, die man für einen Style verwenden könnte, wird dieser nicht angewendet. Der Style sähe so aus:

{codecitation style="brush:css;"}

<style> table#RSrunReport {   display:none; } #_NS_runReport {   display:none; } td#CVToolbar_NS {   display:none; } </style>

{/codecitation}

Jedoch muss man zu JavaScript greifen und in einem HTML-Element folgenden Inhalt einfügen:

{codecitation}

<script>

function myLoad() { document.getElementById("_NS_runReport").style.display="none";}document.body.attachEvent('onload',myLoad);window.onload = function(){ try{ document.getElementById("_NS_runReport").style.display = "none"; document.getElementById("_NS_runReport").parentNode.parentNode.nextSibling.style.display = "none"; } catch(e){} }</script>{/codecitation}

Danach sind die Schaltfläche und der Trennstrich verschwunden, wenn man den Bericht aus dem ReportStudio oder aus Cognos Connection heraus startet.

 

An dieser Stelle stelle ich ein paar Code-Schnipsel zur Verfügung, die Ihnen vielleicht für die Lösung von bestimmten Anforderungen helfen. Sie können die einzelnen Schnipsel durch einen Klick auf den Titel öffnen und schließen.

Mit JavaScript Sparklines in Cognos-Berichten einbauen

Es ist in Berichten häufig interessant, innerhalb einer Liste kleine Diagramme, sog. Sparklines anzuzeigen. Diese zeigen platzsparend z.B. einen Trend oder eine Verteilung an. Natürlich ersetzen Sie kein umfangreiches Diagramm mit Datenwerten und Legende, aber für eine kurze Übersicht finde ich diese Sparklines, die man häufig in Finanzzeitschriften sieht, sehr interessant.

Um solche Sparklines zu verwenden, benötigt man bestimmte JavaScript-Klassen. Die hier vorgestellten Sparklines basieren auf dem JQuery-Framework. Weitere Informationen zu den JQuery-Sparklines findet man hier.

Der Einbau in einen Cognos-Report ist nicht weiter kompliziert. Zuerst muss man die entsprechenden Klassen importieren:

{codecitation style="brush: HTML;"}

<script type="text/javascript" src="/../jquery/jquery-latest.min.js"></script> <script type="text/javascript" src="/../jquery/jquery-ui-1.8.5.custom.min.js"></script> <script type="text/javascript" src="/../jquery/jquery.sparkline.min.js"></script>

{/codecitation}

Dann muss die Funktion zur Erzeugung der Sparklines in einem HTML-Element eingebaut werden:

{codecitation style="brush: JavaScript;"}

<script type="text/javascript"> $(function() { /* Inline sparklines take their values from the contents of the tag */ /* Use 'html' instead of an array of values to pass options to a sparkline with data in the tag */ $('.inlinebar').sparkline('html', {type: 'bar', barColor: '#0000cc', height:'15px'} ); }); </script>

{/codecitation}

Um nun die Sparklines mit Daten zu versorgen, kann man sich in einem Listbaustein mit folgendem Trick behelfen. Dazu muss man in einer entsperrten Listenzelle ein HTML-Element mit folgendem Code einbauen:

{codecitation style="brush: HTML;"}

<span class="inlinebar"><span style="visibility:hidden">

{/codecitation}

Direkt dahinter wird dann ein Datenelement eingefügt, dass die einzelnen Werte kommagetrennt enthält. Und zum Abschluss fügt man ein weiteres HTML-Element mit folgendem Code ein:

{codecitation style="brush: HTML;"}

</span></span>

{/codecitation}

Mit dieser Vorgehensweise erreicht man, dass in jeder Zeile der Liste ein kleines Diagramm erscheint. Beispiele dazu sind auf der o.g. Webseite zu finden.

 

JavaScript-Bibliothek zur Unterscheidung der Cognos-Versionen

Wenn man Berichte in Cognos 8.2 entwickelt und später auf Cognos 8.4 oder Cognos 10 umsteigen möchte, ist eine Migration der Bericht unerlässlich. Vor allem, wenn in den Berichten JavaScript verwendet wird, um diese z.B. interaktiv zu machen oder bestimmte Parameter-Werte zu setzen.

Um die Berichte unter allen drei Versionen lauffähig zu bekommen, kann man sich mit einer JavaScript-Bibliothek behelfen, die selbständig die für die Version gültigen Funktionen aufruft.

So wurde z.B. die Methode .checkData() für einzelne Steuerelemente ab Version 8.4 durch die Methode canSubmitPrompt() ersetzt. Jedoch prüft diese Methode direkt alle Prompt-Werte und damit entfällt die Möglichkeit, einzelne Steuerelemente zu prüfen und gültig zu machen.

Mit den entsprechenden Aufrufen für die einzelnen Steuerelement ist es jedoch auch in Cognos 8.4 und 10 weiterhin möglich, einzelne Steuerelemente zu prüfen.

{codecitation style="brush: JavaScript;"}

var f = (typeof getFormWarpRequest == "function" ? getFormWarpRequest() : document.forms.formWarpRequest); var version = (typeof getFormWarpRequest == "function" ? '8.4' : '8.2' ); function checkData(elem) {   if ( version=='8.2' ) {     if (elem.tagName == "SELECT") {        if (elem.multiple) {           try {             eval("multipleText" + elem.name.replace(/_oLstChoices/,"") + ".checkData();");           } catch(e) {}           try {             eval("listBox" + elem.name.replace(/_oLstChoices/,"") + ".checkData();");           } catch(e) {}         } else {           eval("listBox" + elem.name.replace(/_oLstChoices/,"") + ".checkData();");         }     } else if (elem.tagName == "INPUT" && elem.type == "text") {       eval("textBox" + elem.name.replace(/_textEditBox/,"") + ".checkData();");     }   } else {     if(typeof elem._ep=="object") elem._ep.checkData();     if(typeof elem._ft=="object") elem._ft.checkData();   } }

{/codecitation}

Zur Verwendung dieser Funktion wird innerhalb des Berichts nicht mehr formWarpRequest.<Element Name>.checkData() aufgerufen, sondern stattdessen checkData(<Element>).

Login-Footer

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