QlikView & Was für Felder habe ich denn da gerade selektiert?

Mit QlikView kann man seit der Version 10 Kommentare für Feldnamen hinterlegen, um etwa zu erklären aus welcher Datenquelle das Feld stammt und was das Feld beinhaltet (Klassische Frage: enthält das Feld Datum das Bestelldatum, das Rechnungsdatum oder das Lieferdatum?). Dieses Feature kam bisher vor allem Entwicklern und Fachanwendern zu gute, die selbst QlikView Applikationen entwickeln. Seit QlikView 11.20 Service Release 9 werden diese Feldbeschreibungen über den QlikView Accesspoint nun allen Benutzern bereitgestellt.

Beschreibende Infos liegen uns am Herzen. Wie wir hier beschrieben haben, ist es unserer Meinung ideal bereits in der Entwicklung am QVD-Layer eine Beschreibung für jedes Feld zu hinterlegen. Hat man beispielsweise SAP kann man aus dem Data Dictionary die Feldbeschreibung automatisch nach QlikView übernehmen.

An der Oberfläche hatte man bisher schon die Möglichkeit bei jedem Objekt ein Kommentar zu hinterlegen. Ist unter "Eigenschaften|Titelleiste" ein Kommentar eingetragen, so erscheint beim Objekt ein Fragezeichen-Icon. Wer mehr als einen kurzen Text erklären möchte, kann mittels unserer Document Extension auf ein Wiki/eine Webseite abspringen.
 

Für Applikationserklärung hat sich über die Jahre der "Info"-Button durchgesetzt. Mittels Show/Hide-Bedingungen werden Objekte eingeblendet, die die Funktionalität bzw. Inhalt der Applikation erklären.


In QlikView 11.20 SR9 ist uns eine Neuerung im IE-Plugin aufgefallen: Fährt man in der Auswahlbox über ein selektiertes Feld, so wird das im Skript hinterlegte Feld-Kommentar als Tooltip angezeigt.

Das ist sehr praktisch, denn im Gegensatz zum Ansatz mit "Titelleiste|Kommentar", hat man für Gewöhnlich nicht für jede Feldselektion eine eigene Listbox bei der man ein Kommentar hinterlegen kann (weil man zB. Multibox oder Globale Suche nutzt). Weiters hat der Benutzer in der Auswahlbox nun einen zentralen Punkt wo er alle Felderklärungen sehen kann, sobald er einen Filter darauf gesetzt hat.

Der "COMMENT Fields" Befehl im Skript sorgt für die Erklärung des Feldes "Kunden.Firma" in der Auswahlbox


Für QlikView-Entwickler die bisher schon das COMMENT-Feature benutzt haben, heißt das:
  • Achtung wenn Sie bereits Feldbeschreibungen definiert haben, die nicht für jedermann bestimmt sind! Nun sehen auch all Ihre Anwender das Kommentar
  • Fügen Sie das COMMENT Field erst nach dem BINARY-Load ein; sonst gehen die Kommentare verloren
  • Im AJAX-Client sehen wir das Kommentar als Tooltip noch nicht. Wir werden uns schlau machen, ob wir dieses sinnvolle Feature auch dort bekommen können.





Qlik Sense - Mashup Integration mit Drupal CMS auf qvheroes.com

Die Themen Integration und Mashup sind eine der großen Stärken von Qlik Sense. Wir haben unsere Webseite qvheroes.com genutzt, um zu demonstrieren wie man interaktive Qlik Sense Analysen direkt in die eigene Webseite einbauen kann.

Meistens sind Integrationen von Dashboards  und Analysen lediglich via HTML und <IFRAME> gelöst; ein <IFRAME> ist jedoch bloß ein unabhängiger "Reiter" der sich innerhalb der eigentlichen Webseite öffnet. Diese <IFRAME> Integrationen haben keine Möglichkeiten auf die Darstellung (den DOM-Tree) der "aufrufenden" Webseite zuzugreifen um diese bei Bedarf zu ändern.

Warum möchte ich, dass meine Analysen mit der Webseite interagieren? Es wäre doch hilfreiche, wenn ein Filter auf meinem Dashboard sich direkt auf die dargestellten Werte meiner Webseite auswirken würde. Sei es nun meine Börsen-Webseite, mein Online-Banking oder ein Online Auto-Konfigurator.

Für unseren Blog-Aggregator qvheroes.com haben wir genau das gemacht, und Qlik Sense direkt in den DOM-Tree der Seite eingebaut:

Der obere Teil der Webseite zeigt einige Analysen zu den gesammelten "Blogs" an. Die Darstellungen sind Qlik Sense Elemente, die wir mit der Mashup API in das Drupal CMS unserer Webseite eingebaut haben.


Weiter unten befinden sich die Liste der Blogeinträge auf qvheroes.com, sortiert nach Datum.


Wie man in dem Video unterhalb sehen kann, interagiert nun Qlik Sense mit der Webseite. Filtere ich auf spezifische Blogs - etwa heldendaten.net - werden mir auch nur noch die Beiträge dieser Quelle angezeigt. Die Buttons "Clear All", "Back" und "Forward" sind hingegen Teile von Drupal, die in Qlik Sense Filter verändern.

 

Technische Notizen


Mit QlikView waren derartige Integrationen meist mühsam, vor allem aufgrund der Same Origin Policy die alle modernen Browser implementiert haben, und Integrationen mit dem AJAX-Client erschwert haben. Da Qlik Sense für die Kommunikation auf Websockets setzt, fällt dieses Problem weg:

  • qvheroes.com ist bei einem amerikanischen Webhoster gehostet
  •  unsere Qlik Sense Umgebung läuft  - wie hier beschrieben - auf einer Amazon Maschine und ist eigentlich über http://demo.heldendaten.net:8080/hub/ erreichbar
  •  man kann im Qlik Proxy mehrere Domains whitelisten mit denen die Websocket Kommunikation erlaubt wird. Bei uns sieht das folgendermaßen aus:

Qlik Sense QMC Virtual Proxy Settings


- Die Qlik Sense Applikation wird über den Hub gebaut, und ist auch direkt auf unserer demo.heldendaten.net QlikSense Umgebung verfügbar. Die einzelnen Darstellungen wurden mittels Qlik Sense Workbench aus der Applikation "herausgeholt" und auf qvheroes.com eingebunden.

- Der "Kleber" der die beiden Welten - Qlik Sense und Drupal - zusammenhält sind dann einige Javascript-Libraries (JQuery, JQuery UI, require.js,gridstack.js) und bloß ca. 150 Zeilen customized Code! Falls jemand die Code-Details interessieren: einfach melden!


Felder aus Feld laden - Load XML mit FROM FIELD

Der LOAD-Befehl kennt viele Quellen aus denen er sich befüttern lässt: OLEBC/ODBC-Datenquellen, .csv-Dateien, SAP, QVSource. Gerade eben habe ich mir den QVX-Connector von Rapidminer angesehen - nur um eine kleine Auswahl anzuführen.

Einen  weiteren LOAD-Befehl gibt es zwar laut Dokumentation, er ist aber in der freien Wildbahn  höchst selten anzutreffen:

LOAD FROM FIELD

Die Idee: ich habe ein Feld bereits geladen, möchte aber dessen Inhalt nochmals als Datenstruktur weiterverarbeiten. Wieso möchte ich das? Nach einigen Jahren ist mir das erste Mal ein sinnvolles Beispiel untergekommen: Ein Vorsystem liefert uns eine .csv-Datei,  in der das Feld "Data" weitere Informationen als XML-Struktur enthält.



Ladet man das Feld "Data" ohne weitere Transformation, ist es nur bedingt nützlich.

Das Feld "Data" enthält nur einen langen XML-String

Ziel ist es, die einzelnen XML-Tags und Attribute wie  PNR, Name und ID aus dem Feld "Data" zur Analyse bereitzustellen. Genau hier kommt FROM FIELD zu Tragen.

Table:
LOAD 
  rowno() as rowid,
  Department,
  Data
FROM
[.\text.csv]
(txt, codepage is 1252, embedded labels, delimiter is '|', msq);



//Loop and Table "Helper" with just a single row is necessary, 
//otherwise the "From Field" fails in QV11.20SR10. 
//Bug accepted by Qlik Support.
for i = 1 to (NoOfRows('Table'))

 Helper:
 load
   Data as XmlField
 resident Table where rowid=$(i);
 


 //Trick: rowno() so we can join with the original Table 
        //to retrieve "Department" field
 XMLResult:
 load
   $(i) as rowid,
   [PNR], //access xml Tag
   [Name],
   [Id] //access xml Attribute
 From_Field (Helper,XmlField)
 (xmlSimple, table is [Info/Data]);
 
 drop table Helper;

next

Das Listing ist nicht ganz trivial, aber das Ergebnis erfolgreich: Aus meinen drei Inputzeilen werden vier Mitarbeiter generiert. Der Verweis zurück zu meinem "Department" funktioniert über den Trick mit rowno(). Im Screenshot unterhalb sieht man, dass die Person "RVA" dem "Sales"-Department zugeordnet ist.



Unterhalb einige Notizen zum Skript:
  • Zeile 1: Die .csv-Datei ganz normal laden. In diesem Fall hat sie eine '|' als Trennzeichen
  • Zeile 15: Der FROM FIELD -Load  funktioniert momentan nur wenn man einzelne Zeilen liest. Deswegen müssen wir hier in einer Schleife über die Tabelle iterieren. Das ist nicht furchtbar schnell, aber momentan als Workaround notwendig. Das Problem ist beim Qlik Support eingekippt. Ich melde mich, sobald es in einem Service Release gefixt wurde.
  • Zeile 32: Hier kommt das FROM FIELD zum Einsatz. Das bereits geladene Datenfeld Data wird hier nochmals als XML geladen --> hier werden die XML-Infos. ID, NAME,PNR aus dem XML geholt.

Eine QlikView .qvw, eine Qlik Sense.qvf und die Inputdatei zum Ausprobieren finden Sie hier.



QlikView Easter Eggs - ObjectTimeLimitSec - sinnlose Chart Berechnung abbrechen

Selbst dem erfahrensten QlikView Entwickler passiert es manchmal: man baut ein Diagramm, das nicht und nicht zu rechnen aufhören will. Vermutlich hat man unabsichtlich ein kartesisches Produkt, oder irgendetwas Ähnliches produziert.

Der QlikView Developer ist äußerst gutmütig und versucht jedes Objekt "fertig" zu rechnen. Entweder kann man auf eine ausgedehnte Kaffeepause gehen, oder man verliert die Nerven und beendet die Qv.exe im Taskmanager. Besonders bitter wenn das letzte Speichern der .qvw Stunden zurückliegt ("Benutzereinstellungen|Speichern|Wiederherstellungsdatei anlegen" hilft doch manchmal).

Der QlikView Server kennt die Einstellung "Object Calculation Time Limit". Defaultmäßig gibt der Server  das Berechnen eines Objektes nach 60 Sekunden auf. 60 Sekunden stimmt nicht ganz, denn meiner Meinung nach multiplizieren sich diese 60 Sekunden mit Anzahl der Cores am Server. Hat man also 8 Cores, versucht der Server 8 Minuten lang ein Objekt zu berechnen >> viel zu lange, weswegen wir dieses Setting gerne auf 5 oder 10 Sekunden stellen.


QlikView Server Object Calculation Time Limit
Der Screenshot zeigt einen QlikView Server mit "Object Calculation Time Limit" von 10Sek*4Cores = 40 Sek


Am QlikView Developer gibt es diese Einstellung ebenfalls --> allerdings nur  versteckt mittels Eintrag "ObjectTimeLimitSec" in den QlikView Easter Eggs. Defaultmäßig ist der Wert auf -1 (unendlich), weswegen der QlkView Developer eben nie aufhört das Objekt zu rechnen. Gerade während der Entwicklung ist es jedoch sinnvoll, die Berechnung von fälschlicherweise definierten "Langläufern" nach einer gewissen Zeit abzubrechen. Unterhalb ein Video und ein Screenshot wie Sie den Wert ändern können.





QlikView Developer Easteregg ObjectTimeLimitSec
Rechtsklick auf das QlikView Logo zeigt den Easter Egg Dialog.


Wer also vor sich selbst und seinen Entwicklungskünsten in Schutz genommen werden möchte, setzt den Wert "ObjectTimeLimitSec" zum Beispiel auf 10! Zum Testen können Sie diese .qvw herunterladen, die ein Tabellendiagramm mit kartesischen Produkt beinhaltet. --> Haben Sie "ObjectTimeLimitSec" korrekt gesetzt, sehen Sie die Fehlermeldung "Timeout bei Berechnung".
QlikView Screenshot Lange Berechnung
Auf den Versuch das fehlerhafte Chart zu rechnen....

QlikView Timeout Fehlermeldung
... folgt die Fehlermeldung "Timeout bei der Berechnung"



PS: die meisten Einstellungen in den Easter Eggs lassen sich über den normalen Benutzereinstellungen-Dialog ändern. Einige "Versteckte" gibt es trotzdem.  Einen zweiten Eintrag den ich gerne setze ist "DataPreviewSize" --> dann bekommt man mehr Zeilen  in der Tabellen-Vorschau unter der CTRL+T "Tabellenstruktur" Ansicht.

DataPreview QlikView Easter Egg
QlikView 1000 Lines in Tabellenstruktur
1000 statt 100 Zeilen im Tabellenstruktur Preview

PPS: Support gibt es für diese Easter Eggs natürlich keine :)

Qlik Sense 1.1 - Integration mit QlikView

Seit meinem letzten Blog-Eintrag ist Qlik Sense 1.1 erschienen. Einen guten Überblick über die neuen Layout-Features finden Sie am Qlik Design Blog. Unter der Haube haben sich aber noch viel mehr Dinge getan. 

Wir haben deswegen demo.heldendaten.net schnellstmöglich auf Qlik Sense 1.1 aktualisiert, und können jetzt  neben dem zentralen Einstiegspunkt "Qlik Portal" auch die elegante Integration von Qlik Sense in eine QlikView-Analyse demonstrieren. Wunsch unserer bestehenden QlikView-Kunden ist es, die Features&Vorteile von Qlik Sense ohne große Veränderungen und möglichst nahtlos an die Benutzern auszurollen, dabei aber trotzdem die Datenintegrität gewährleisten zu können. Sehen Sie im Video unterhalb wie das für Ihre Anwender aussehen kann:


 

Mehr Informationen finden Sie auf unserer Webseite! Zum selber ausprobieren empfiehlt sich der direkte Link zur Qlik Sense QlikView Integration.
heldendaten GmbH,2020