Gaps und Abweichungen in QlikView - Zwei Darstellungen

Plandaten finden sich in vielen (ja fast allen) QlikView Applikationen. Hat man die Plandaten sinnvoll mit den Istdaten verknüpft (zumeist mit CONCATENATE), geht es in der Darstellung zumeist um die Gegenüberstellung von Ist- zu Plandaten.

Auch abseits von Dashboards und Tachozeigern kann man hilfreiche Charts zur Visualisierung von "Ist zu Plan" bauen. In diesem Beitrag möchte ich auf zwei "spezielle" Darstellungen eingehen, die wir in Projekten erfolgreich mit QlikView umgesetzt haben.

Mind the Gap - Sales Pipeline Analysis im CRM Projekt

Diese Darstellung kommt aus einem CRM-Projekt um zu sehen wie viel Umsatz (Ist) noch fehlt um das Jahresziel (Plan) zu erreichen. Das Liniendiagramm ist eine kumulierte Darstellung von Jänner bis Dezember. Wählt man einen Monat, sieht man wie groß die Lücke zum Umsatzziel ist!

Im Beispiel unterhalb ist September gewählt.  Der Grüne Balken signalisiert uns, dass unser Ist-Umsatz momentan über dem kumulierten Planwert Jänner-September steht. Schauen wir aber in die Zukunft, so sehen wir, dass unsere Salespipeline für den Zeitraum Oktober-Dezember nicht genügend Umsatzpotential enthält. Bis Dezember würde die Lücke zum Plan aus heutiger Sicht bis auf 147k Umsatz anwachsen! Es bleibt also viel zu tun :-)

Kumulierte Istumsatz als graue Linie. Kumulierte Planumsatz als gestrichelte Linie. Gap/Lücke als Balken.
Die Berechnung in QlikView sehen Sie im Screenshot in der Tabellendarstellung unten. Das komplizierteste hier ist die Offset-Berechnung für die gestrichelte Planlinie. Diese soll vom "Ist-Wert" des Vormonats zu zeichnen beginnen. Um das zu lösen wurden die zwei Hilfsspalten "Offset" und "OffsetKum" eingefügt! Für Details kann man die .qvw vom heldendaten Accesspoint herunterladen.

Abweichungen Prozesskennzahlen von Plan

In diesem Projekt ging es um Prozesskennzahlen. In einem Geschäftsprozess wurden verschiedene KPIs wie etwa "Avg. Durchlaufzeit Geschäftsfall" und "Reklamationsquote" gemessen. Die Prozessmanager interessierte in diesem Fall weniger der absolute Wert der Kennzahl (Ist), sondern vielmehr die Abweichung vom gesetzten Ziel (Plan) um zu sehen wie sich der Geschäftsprozess über die Zeit verbessert.

Im Screenshot unterhalb sehen Sie links unten unseren ersten naiven Ansatz. Der Istwert wird als Balken dargestellt. Der Zielwert (der über die Monate steigt um die gewünschten Verbesserungen im Geschäftsprozess zu symbolisieren) wird als Linie gezeichnet. Man sieht zwar ganz gut wann der Istwert den Plan unter bzw. überschritten hat, die Abweichungen sind  aber schwer zu sehen.

Aus diesem Grund haben wir uns für die Darstellung auf der rechten Seite entschieden. Die Linie zeigt weiterhin den sich ändernden Planwert über die Zeit. Die Balken zeichnen aber nicht mehr von 0 weg, sondern zeigen die Abweichung vom Planwert.


Im rechten Chart wird der Planwert als Balkensockel benutzt. Ähnlich wie in einem Wasserfalldiagramm definieren wir damit wo die Abweichung zu zeichnen beginnen soll. Die Abweichung ist dann schlicht mit  sum(Ist)-sum(Plan)berechnet!

Geht man einen Schritt weiter, und zieht nicht einmal die Planänderung in Betracht sondern will sich ausschließlich auf die Abweichungen konzentrieren, kann das gleiche Diagramm auch so wie unterhalb aussehen: Die Planlinie ist nun eine flache Linie.


Auch dieses Beispiel findet sich am heldendaten Accesspoint zum Rumspielen! Viel Spaß damit!

QlikView /NoData im Contextmenü - Rightqlik

Wer erinnerst sich an unseren Blogpost über den QlikView /Nodata Shortcut am Desktop? Miguel García hat auf seinem Blog IQlik jetzt eine noch elegantere Lösung präsentiert: Rightqlik.

RightQlik in Action

Neben "Open without data" gibt es auch "Open in a new QV instance". Wunderbar! Bisher habe ich immer zuerst einen QVDeveloper geöffnet, und anschließend die .qvw via Drag&Drop  reingezogen. Ein Mouse-Klick Ersparnis bei ein paar tausend .qvws die ich wohl im Jahr öffne ist einiges :)

Zusammen mit einem komfortablen QVD-Viewer wie EasyQlik macht da das Arbeiten mit .qvws und .qvds auch abseits des QlikView Developers  richtig Spaß!

EasyQlik - Preview einer .qvd mit Doppelklick




Qlikview - Poor man's Print & Scroll Up Extension

Heute gibt es einen Ausflug in die dunklen Kammern der  "Quick and Dirty - getting it done" Heldendaten-Katakomben. Schon mal eine QlikView Extension programmiert? QlikView Workbench installieren, Property-Bags definieren, am Server deployen? Geht das nicht einfacher? Natürlich! Gibt es dafür Support: selbstverständlich nicht :-)

QlikView's "Full Browser Client" - vormals AJAX-Client oder ZeroFootprintClient - ist ein voller HTML5 Client. Auch der QlikView (Offline) IPAD-Client, der dieser Tage in Version 2.0 erschienen ist,  startet im Onlinemodus innerhalb der App einfach den Safari Browser.

Will man den Client funktionell und/oder graphisch erweitern, so hat man in QlikView 11 die Möglichkeit Document- bzw. Object Extensions zu entwickeln. Stefan Walther schreibt darüber gerade eine Blogserie auf qlikblog.at. Meine liebste Spaß-Extension findet sich im QlikMarket und auf unserer Demo-Seite.


Poor Man's Extensions

Ich weiß gar nicht ob es ein Feature ist, oder ein Bug. Ich weiß auch gar nicht wie ich auf die doofe Idee kam. Aber seit ich es in QlikView entdeckt habe, nenne ich es "Poor Man's" Extensions :)

Irgendwann in den 90er-Jahren, als viele Javascript noch nicht von Java unterscheiden konnten, fand man manchmal folgende verbrecherische Syntax um einen Messagebox bei Klick auf einen Hyperlink anzuzeigen:

<a href="javascript:alert('Hallo Welt!');">Dein Link</a>

Lang vergessen, kann man sich diese Syntax in QlikView zu nutzen machen. Wie? Das lesen Sie in den nächsten zwei Abschnitten!

Poor Man's JavaScript Print Extensions

In QlikView gibt es einige Aktionen die vom AJAX-Client ignoriert werden. Ein Beispiel ist die "Arbeitsblatt drucken"-Aktion.

QlikView Arbeitsblatt drucken|Print Sheet Aktion
Diese Aktion wird vom AJAX-Client ignoriert


Während im Fat-Client und im IEPlugin QlikView die Darstellung selbst in der Hand hat (und somit auch "selbst" drucken kann), ist im AJAX-Client das Rendering via HTML an den Browser ausgelagert. Somit kann man sich auch nur auf den "Druck" des jeweiligen Browser-Herstellers verlassen. Das führte wohl dazu, dass der QlikView AJAX Client diese Aktion gleich komplett ignoriert.


Dieses Verhalten ist natürlich nicht ganz zufriedenstellend für einen Anwendungsentwickler der beide QlikView-Clients (IE-Plugin und AJAX) für seine Analysten bereitstellen muss. Während die IEPlugin-User den Button benutzen können, muss man den AJAX-Usern erklären, dass sie umständlich im Browsermenü den Druck anstarten müssen, oder am einfachsten gleich einen Screenshot machen.

Gibt es einen Ausweg? Ja, man könnte eine "Button"-Extension programmieren die den Browser-Druck mittels Javascript "window.print()" aufruft. Geht es auch Quick and Dirty? Ja, denn QlikView lässt eine Syntax zu, die ich eben seit den 90ern nicht mehr gesehen hatte:

Es gibt eine QlikView Aktion "URL Öffnen". Ich nehme an, dass diese Aktion gedacht ist um externe URLs, webbasierte CRMs oder etwa Documentmanagement-Systeme anzuspringen, und gegebenenfalls die aktuelle QlikView-Selektionen als GET-Parameter zu übergeben.

Interessanterweise schluckt diese Aktion aber auch folgenden Befehl:  javascript:window.print()

Quick&Dirty: Javascript in Qlikview


Der Aufruf von JavaScript macht im QlikView-Fatclient keinen Sinn, da hier keine Interpretation des Befehls stattfindet. Um den Button wirklich nur im AJAX-Client anzuzeigen, benutzen wir die Clientplatform()-Funktion. Wer QlikView für das IPAD entwickelt hat, hat diese Funktion zum Erkennen der Browser-Plattform vielleicht schon benutzt:


 FatClient und IEPlugin liefern einen leeren  String für ClientPlatform(). Wir zeigen das Objekt also nur an wenn ein Browser kommt!

Kleiner Tipp am Rand
Hat man die Anzeigefunktion definiert, so verschwindet der Button natürlich sofort im QlikView-Developer. Wenn Sie den Button während der Entwicklung sehen möchten, zeigt der Shortcut CTRL+SHIFT+S alle Objekte (und damit auch den Button) an! Vor dem Speichern bitte wieder CTRL+SHIFT+S, damit das normale Verhalten wieder hergestellt ist.

Der Test auf unsere Demo-Seite funktioniert: In QV11.20SR5 mit Firefox 27 und IE11 funktioniert meine "Poor Man's Print Extension".

IE 11 Druckdialog öffnet sich
PS: Um das Druckergebnis im Browser zu verbessern, sollten Sie den Druck der Hintergrund-Graphik aktivieren. Das ist in jedem Browser (ja sogar Browser-Version) ein wenig wo anders versteckt, hier die Einstellungen für IE11 und Browser.
Firefox Hintergrund drucken

IE 11: Hintergrundfarben und -bilder drucken

Poor Man's JavaScript ScrollUp Extension

Vor kurzem erhielt wir eine weitere Anfrage: Ein Kunde hat eine Applikation die sehr viele Diagramme nach unten anzeigt. Daraus resultiert ein langer vertikaler Scrollbalken. Kann man es bewerkstelligen, dass der User mittels eines Buttons wieder ganz rauf zum Start der Applikation springt?

In JavaScript gibt es dafür eine Funktion: window.scrollTo(0,0). Es bietet sich also wieder an eine Poor Man's Extension zu schreiben :-)

Hier kommt aber nun leider ins Spiel, dass diese Vorgehensweise von Seiten der QlikTech natürlich nicht supported ist. window.scrollTo(0,0) funktionierte wunderbar im Firefox, doch IE11 wehrte sich standhaft dagegen, nach oben zu scrollen.

Ein bisschen Code-Analyse des AJAX-Clients später stellte sich heraus, dass QlikTech sich scheinbar die Scrollposition merkt. Um also die Poor Man's Extension auch im IE11 lauffähig zu machen, muss ich die Aktions-Definition erweitern auf:

javascript:Qva.binders[""].ScrollLeftToRemember=null;window.scrollTo(0,0);

Bisher konnte ich keine Nebenwirkungen unseres Hacks feststellen. Der Button funktioniert in Firefox 27, IE11, Chrome 33 und auch am IPAD mit Safari. Die Benutzung ist natürlich trotzdem auf eigenes Risiko! Zum Testen und gibt es die Applikation wie immer auf unserem Demo-Accesspoint demo.heldendaten.net




Die Aktion für ScrollUp im IE11, Firefox 27 und IPAD IOS7



Die ScrollUp-Applikation in ihrer vollen Pracht. Der Poor Man's ScrollUp Button ganz unten.

Dublicate Checker - Datenbereinigung mit QlikView

Unsere Kunden setzen QlikView gerne ein um die Datenqualität Ihrer Systeme zu sichten. Das Assoziative Grün-Weiss-Grau Datenmodell, und QlikView's Eigenschaft jeden distinkten Wert eines Feldes in einer Listbox anzuzeigen, hilft oft einen schnellen Überblick über den Datenbestand zu bekommen.

Typische Datenqualitätsprobleme in QlikView sichtbar gemacht:  Unterschiedliche Schreibweisen 

Auch bei Migrationen, Umstieg auf neue Systeme und Zusammenführung von Alt-Daten kommt QlikView immer wieder zum Einsatz. Zuletzt bekam ich eine interessante Anfrage von einem Kunden: Ist es mit QlikView einfach möglich Duplikate zu finden? Pflegt man etwa den Artikelstamm in zwei (oder vielleicht sogar mehr) Systemen, kann ich überprüfen ob die Artikel-Ausprägungen für eine ArtikelNr in beiden Systemen gleich ist?

In meinem kleinen Beispiel hat jede Artikel  (ID) drei Ausprägungen: Name, Preis, ShortName.
Aus diesen beiden Quellsystemen sollen Duplikate gefiltert werden


Ziel ist es nun zu überprüfen ob die Kombination aus "Name, Preis und ShortName" sich in den beiden Systemen unterscheiden. QlikView bietet dafür eine praktische Funktion: autonumberhash256. An dieser Funktion kann man eine beliebige Anzahl an Feldern übergeben. Für jede Wert-Kombination wird innerhalb eines QlikView Scripts ein eindeutiger Wert berechnet.

In unserem Beispiel rufen wir also die Funktion mit 
autonumberhash256(Name,Preis,ShortName) 
auf um ein neues Feld "hash" zu generieren.


Wie man sehen kann wird für die Ausprägung (1,Apple,10,A) in beiden Datenquellen der Hashwert 1 generiert. Dieser Datensatz ist also in beiden Quellsystemen gleich, somit keine Dublette. Im Gegensatz dazu liefert die Funktion für die Werte (2,Orange, 11, ORANG) und (2, Orange,11, O) zwei unterschiedliche Hashwerte. Damit hat die Artikel mit ID=2 eine Dublette.

Im nächsten Schritt des QlikView Scripts markiert man sich nun mittels eines group by und einem load above load alle IDs die mehr als einen unterschiedlichen Hashwert aufweisen --> denn genau das sind meine Dubletten. In unserem Fall sind es die zwei Produkte Orange und Banana.

Die zwei gefundenen Dublikate. Artikel 2 und Artikel 3

Die .qvw mit dem Dublicate Checker finden Sie unter diesem Link. Einfach die Felder der autonumberhash256()-Funktion an Ihre Datenquellen anpassen. Der Ansatz funktioniert übrigens auch mit mehr als 2 Source Systemen - autonumberhash256() sei Dank.

Weiters schlummert auf meiner Festplatte ein altes Beispiel (von einem unbekannten Author) mit einem phonetischen Dublettenchecker . Gelöst mit einem Macro das im Skript aufgerufen wird. Sicherlich sehr interessant wenn man mehrere Adressbestände abgleichen möchte. Vielleicht wird das ja mal ein eigener Blogeintrag ;-)





Karten in QlikView & A brief history of time

Landkarten in QlikView - eine historische Aufarbeitung

Benötigte man in QlikView 8 eine Kartendarstellung, dann war die Antwort recht einfach: Man nehme ein fixes Hintergrundbild und benutze ein Punktdiagramm (Scatter Chart) um die Punkte entsprechend darauf zu positionieren.  Die Punktgröße kann zusätzlich genutzt werden um die Kennzahl in Relation zu stellen.

Die Einwohnerzahlen auf der Weltkarte mittels Punktdiagramm

Ausgehend von diesem Grundgedanken gab es tolle Verfeinerungen dieses Verfahrens (Drilldown von Land auf Bundesländer indem man pro Bundesland ein verstecktes Chart vorbereitete; Kabinenbelegungen auf dem Grundrissplan eines Kreuzfahrtschiffes, etc.). Auf meiner Festplatte schlummern dazu noch einige Schätze :).

Kreuzfahrtschiff Kabinenbelegung mit einem Punktdiagramm

QlikView 9 beinhaltete dann die Google Maps Integration. Das ermöglichte den dynamischen Kartendrilldown bis auf Straßenebene, brachte aber auch die Problematik des Lizenzthemas mit sich: Google erlaubt zwar das Kartenmaterial gratis im Internet wiederzuverwenden; da viele QlikView Applikationen aber reine Intranet-Applikationen sind, sollte man hier die Google Lizenzvereinbarungen genauer studieren. Und natürlich benötigt der Anwender eine aktive Internetverbindung um das Kartenmaterial On The Fly von Google nachzuladen.

Rechts die "gezoomte" GoogleMaps Integration im Vergleich zur "starren" Punktdiagramm Lösung


Beschäftigt man sich heute mit Kartendarstellungen in QlikView, findet man mittlerweile eine Vielzahl von interessanten Beispielen in der QlikCommunity bzw. Lösungen von professionellen Anbietern im QlikView Market (inklusive unser eigenen HD Heatmap Extension :-)). Auch QlikTech selbst fördert dieses Thema im aktuellen Release QV11.20 SR5 mit einer weiteren Karten-Extension.

Wer noch keine Möglichkeit hatte einen Blick auf die neue QV11.20SR5 Extension zu werfen, findet das Beispiel auf unserem Demo-Accesspoint. Die neue Extension bietet 3 Möglichkeiten Informationen auf der Karte darzustellen:
  • Punktdarstellung
  • Routendarstellung
  • Polygondarstellung
Die Extension erlaubt das Einbinden von unterschiedlichen (freien) Kartenanbietern, Zoom bis auf Straßenebene sowie eine bidirektionale Kommunikation (Auswahl in der Karte, selektiert den Wert in der QlikView Applikation und vice versa).  Momentan noch "unfertig" sieht die Tooltip-Implementierung aus - da muss man manuell nachbessern.

Die verschiedenen Darstellungen der QV11.20SR5 Extension

Routen und Flächen im IEPlugin

Extensions sind nur im QlikView FullBrowser (AJAX) Client verfügbar. Benutzten die Endanwender das ActiveX/IE-Plugin, kann man also die neue Extension leider nicht einsetzen. Für die Darstellung von Punkten auf Landkarten funktioniert die genannte Punktediagramm-Methode mittels fixen Hintergrundbild bzw. Google Maps Integration. Die Frage ist nun: klappt es auch Routen und Flächen im IEPlugin darzustellen?

Für Routen kann man sich eine Eigenschaft des ScatterCharts zu Nutzen machen: Will man in QlikView etwa sehen, wie sich ein Produkt über die Jahre entwickelt, kann man das Jahr als erste Dimension im Chart hinzufügen. Stellt man dann unter "Präsentation" noch die Pfeildarstellung ein, erreicht man folgende Darstellung:

Punkdiagramm mit 2 Dimensionen: das Produkt Minnki Pälsii fällt beim Bruttogewinn seit 3 Jahren ab
Wenn man also Pfeile im Punktdiagramm darstellen kann, warum diese nicht auch für Routen benutzen? Bereitet man sich im Datenmodell ein entsprechendes Routen-Feld vor, kann man folgende Darstellung erreichen.

Routen im Punktdiagramm
Mit sehr vielen Routen wird die fixe Kartendarstellung mangels dynamischen Zooms etc. nicht alle Anforderungen erfüllen können. Für kleinere Anwendungsgebiete ist diese Möglichkeit jedoch schnell & einfach zu implementieren. Nutzt man das Diagramm in Kombination mit der Google Maps Integration, hat man sogar eine "zoombare" Lösung. Das gesamte Beispiel können Sie sich hier ansehen, bzw. über http://demo.heldendaten.net herunterladen

Für die Darstellung von Flächen kann man das QlikTech Punktdiagramm leider nicht nutzen. Punkte und Linien sind die einzigen beiden Darstellungsformen. Hier kenne ich lediglich die Möglichkeit, die Landkarte über die Google Chart API einfärben zu lassen. Exemplarisch sei hier ein Beitrag aus der QlikCommunity gezeigt:

Beispiel aus Rob Wunderlich's QlikView Cookbook

Spanische Provinzen Heatmap


Die Lösung setzt eine aktive Internetverbindung voraus, da bei jeder QlikView-Selektion eine URL bei Google aufgerufen wird, und das gerenderte Bild zurückkommt. Folgende zwei Dinge sollten bei dieser Lösung beachtet werden:
  • Bitte Vorsicht bei sensiblen Unternehmensdaten!  Diese Daten gehen an Google.
  • Meiner Erfahrung nach kann ein GET-Parameter nicht unendlich lang werden (zumindest war das in QV9 der Fall). Also für sehr viele Flächenfärbungen könnte man hier an Grenzen stoßen.



  





heldendaten GmbH,2020