What's new in November @ Qlik

Diese Woche war große Releasewoche bei Qlik: Qlik Sense, QlikView und NPrinting haben ein neues "November" Release bekomme.

Für Qlik Sense November 2017 gibt es ein  "What's New" Video:


QlikView November 2017 (oder vormals QlikView 12.20) hat als Hauptfeature sicherlich die Analytic Connections (Server Side Extensions) zu R und Python bekommen. Das ist nun der Vorteil der gemeinsamen Qix-Engine: Qlik Sense und QlikView profitieren beide von solchen Engine-Features!


In QlikView hat sich aber auch an der Oberfläche einiges getan. Vieles sind Gapfeatures zwischen IEPlugin und AJAX-Client. Hier einige Screenshots zu den wichtigsten Punkten:

Copy to Clipboard

Wer erinnert sich noch an meinen Post aus 2014 mit meiner Document Extension . Endlich kann man auch im AJAX-Client Zellenwerte in die Zwischenablage kopieren!Endlich kein Abtippen mehr!



 Attach/Detach Chart

Will man mehrere Selektionsstände gegenüberstellen, gab es in QlikView Desktop/IEPlugin immer die Möglichkeit ein Chart zu Detachen.  Wenn man danach eine Selektion tätigt, bleibt das Chart noch immer in der alten Selektion.

Funktioniert jetzt auch im AJAX Client. Wenn man Serverobjekte erlaubt, kann sich ein Analyst das Chart kopieren, detachen, und dann der aktuellen Analyse gegenüberstellen

Set Reference

Ähnliche Funktion wie Detach/Attach die auch aus QlikView Developer/IEPlugin bekannt ist. Sagt man in einer Graphik "Set Reference" wird im Hintergrund transparent der aktuelle Stand angezeigt. Ändert man die Selektion, hat man weiterhin den fixierten Wert als Referenz. Zum Löschen dann wieder "Clear Reference" klicken.


Language in AJAX Client

Sprache war bisher ein Serverweites Setting für den AJAX Client. Jetzt kann jeder User am Accesspoint rechts oben unter "Favorites & Profile" seine Menüsprache umstellen.


Send to Excel erzeugt .xlsx

Bisher hat Qlik nach .xls exportiert und alle 65k Datensätze ein neues Arbeitsblatt angelegt. Wir haben es getestet: Export von 1.000.000 Zeilen mit 2 Spalten hat als .xls funktioniert!


Der Beweis: Export von 1.000.000 Zeilen in ein .xlsx mit QlikView Nov 2017



 QMC Document Log und .qvw Name

Das gab es schon mal in QlikView 8.5! Jetzt endlich zurück: der Document Log des Tasks ist wieder in der QMC ersichtlich. Zum Taskname steht im Klammer jetzt auch noch der Pfad zur .qvw!


Set Analysis - Warum geht meine Day to Day Comparison nicht?

Einer der wiederkehrenden Fragen bei Set Analysis - neben der allgemeinen Syntax - ist ein Thema, bei dem unsere Kunden gerne die Dimension des Charts in Set Analysis überschreiben wollen. Ein typischer Fall ist die Day to Day Comparison der Umsätze zwischen zwei Jahren.

Für das  folgendes Beispiel haben wir zwei vollkommen valide Set Analysis Expressions definiert:

//Aktuelles Monat
sum({<Bestelldatum={">=01.07.2017<01.08.2017"}>} Anzahl*Einzelpreis)

//Gleiches Monat Vorjahr
sum({<Bestelldatum={">=01.07.2016<01.08.2016"}>} Anzahl*Einzelpreis)


Die Expressions funktionieren wunderbar für alle möglichen Dimensionen: Produkte, Länder, Kunden. Benutzt man aber ein Kalenderfeld als Dimension des Charts, sind die Leute meist enttäuscht! Qlik packt die Ergebnisse pro Jahr in getrennte Zeilen wenn man etwa das Bestelldatum selbst als Dimension wählt.

Vorjahres Vergleich funktioniert hier nur in der Gesamtsumme

Ja, warum denn? Wie kann ich jetzt den 31.07.2016 mit dem vom 31.07.2017 vergleichen?

Die Erklärung findet sich in dem Weg wie Set Analysis von der QIX Engine abgearbeitet wird: Bevor das Chart zum Rechnen anfängt, werden für jedes SET die relevanten Zeilen aus dem Datenmodell "markiert". Diese Zeilen werden dann dem jeweiligen Dimensionswert zugeordnet, und dann dort aggregiert (in unserem Fall summiert). Im Screenshot oberhalb werden also die relevanten Faktenzeilen

  • für die erste Expression auf die Dimensionsausprägungen 01.07.2017 bis 31.07.2017, 
  • für die zweite Expression auf die Dimensionsausprägungen 01.07.2016 bis 31.07.2016
aufgeteilt. Damit entstehen insgesamt 62 Zeilen.

Die SET Analysis wird nicht für jede Zeile neu interpretiert, sondern einmal global für das Chart gerechnet.  Das ist auch der Grund warum ich nicht am 31.07.2017  eine Set Analysis <Datum={Datum-1}> stehen haben kann um auf den Vortag zuzugreifen.  Da funktioniert tatsächlich manchmal ein IF-Statement mit Total-Qualifier besser, weil das If-Statement für jede Zeile des Datenmodells geprüft wird.

Können wir also unsere beiden Expressions nutzen, um eine Day to Day Comparison zu machen? JA, man benötigt aber ein Feld im Datenmodell, welches für beide Jahre den gleichen Wert liefert.

    
dual(
            num(day(Bestelldatum),'00')&'.'&num(month(Bestelldatum),'00'), 
           (month(Bestelldatum)*10000)+day(Bestelldatum)
) as TagMonat


Das Feld entledigt sich des Jahres, und hat intern für 31.7.2016 und den 31.07.2017 den numerischen Wert   70031. Man könnte wohl auch die daynumberofyear() Funktion nutzen, aber irgendwie vertraue ich da dem Schaltjahr trotz Dokumentation nicht.

Was passiert also jetzt im Chart wenn wir dieses Feld als Dimension nutzen? Die Set Expressions liefert den gleichen Dimensionswert für beide Jahre. Damit ist es für Qlik eine gemeinsame Zeile, mit der man dann mittels column(1)-column(2) die Day to Day Comparison machen kann.


Das neue Feld "Tag Monat" läßt den Vergleich zu

Auch in Line-Charts sieht man den Unterschied gut. Links das normale Bestelldatum: hier sind die Linien nacheinander, weil ja ein Jahr vergangen ist (noch klarer mit einem kontinuierlichen Linechart). Mit dem Tag Monat Feld haben wir die Linien übereinander.


Auf Tagesebene ist das meist nur die halbe Wahrheit, weil Handelsunternehmen meist den ersten Verkaufstag im Jahr mit dem ersten Verkaufstag des Vorjahres vergleichen wollen. In dem Fall wird man überhaupt ein eigenes Feld im Datenmodell benötigen.


Beispiel zum Downloaden gibt es hier.




PS: wer rasch auf QlikView November 2017 oder QlikSense Sept 2017 möchte, bitte folgenden Artikel nicht übersehen. Die Syntax für Set Analysis mit Single/Doublequotes wird in diesem Releases nachgeschärft! https://community.qlik.com/blogs/qlikviewdesignblog/2017/09/11/quotes-in-set-analysis




From IFrame to API - using the Qlik Sense Platform

Einige Tage nachdem Qlik Ihren Chatbot vorgestellt hat, habe ich Ende Juni einen Vortrag bei der Qlik Dev Group Austria geben dürfen, um die Grundlagen hinter einer solchen Qlik Sense Integration ein wenig zu erklären!

HIC @ Dev Group inVienna
Qlik Sense große Stärke im Hintergrund ist die Vielzahl an APIs um Qlik zu erweitern, bzw. in andere Produkte einzubinden oder gar ganz neue Clients zu schaffen. Siehe Sense Excel oder eben den Chatbot.  Während sich die meisten Leute auf Extensions konzentrieren, sind die Ansätze bei denen man  programmatisch auf die Qlik Sense Engine zugreift, eigentlich die interessanteren. Die Qlik Engine ist der Datenlieferant den man beliebige "Fragen" mittels "Hypercubes" stellt. Um das Medium der Präsentation kümmert sicher der Entwickler selbst je nach Anwendungsfall - sei es eine einfache Email bis hin zu einem komplett eigenem Client.

Wer sich für die Präsentation interessiert, findet diese unter: http://content.heldendaten.eu/IFrameToAPI.zip . Einfach bei folgender Folie im PDF auf die Bilder klicken, um Beispiel für die einzelnen Integrationsmöglichkeiten zu sehen. Von der ersten Spalte zur zweiten Spalte werden die Integrationen immer komplexer, aber auch mächtiger!
 

PDF herunterladen und Beispiele ansehen.

Will man Qlik Sense für diese Integrationen nutzen, so nennt das Qlik selbst die "Qlik Analytic Platform". Das sorgt immer mal wieder für Verwirrung, ob es sich dabei denn um ein eigenständiges Software-Produkt handelt. Nein, tut es nicht! Leider ist hier die Hilfe mangels Screenshots auch nicht sehr aufschlussreich!


Qlik Analytic Platform ist genau das gleiche Qlik Sense Setup Executable, welches man auch für jede "normale" On-Premise Installationen nutzt. Erst die Lizenz macht den Unterschied: die Qlik Analytic Platform lässt in QMC bei den Engine-Settings einen neuen Reiter "Capacity-based licensing" erscheinen. Dort weist man die Anzahl der CPUs zu, die die jeweilige Engine nutzen soll. Im Gegensatz zu einer "normalen" Qlik Sense Installation, nutzt man hier ausschließlich den Qlik Dev-Hub um seine Integrationen zu implementieren!



Qlik Analytic Platform - nachdem man die Lizenz zugewiesen hat


QlikView Multidimensionales Kombichart austricksen!

Während alle auf das Qlik Sense June 2017 Release schauen, hier ein kleines Problem, welches vielleicht genauso alt wie QlikView selbst ist:

In einem Kombidiagramm mit zwei Dimensionen zum Beispiel "Jahr" und "Bestimmungsland" will ich zwei Expressions auftragen: einmal die durchschnittlichen Frachtkosten als Balken, und darüber die maximalen Frachtkosten als Punkt!

Das sieht in QlikView 12 leider genauso aus wie in QlikView 11 und vielen Versionen davor:

Zentrierte Punte? Warum das?
Die Punkte von max(Frachtkosten) werden alle über den mittleren Balken gesetzt. Jetzt kann man dann raten welches Land zu welchem Punkt gehört :-(

Der Versuch die Sache mit Errorbars zu lösen, scheitert in diesem Fall leider ebenfalls. Zudem verhält sich QlikView 11.20 hier anders als QlikView 12.10 SR6, also besser nicht nutzen!  Was bleibt, ist eine Lösung via "Bar Offset", der sonst für Wasserfalldiagramm benutzt wird. Punkte sind es leider keine, aber man sieht pro Land die maximalen Frachtkosten!

Bar Offset statt Punkten

Entscheidend ist, die eigentliche Kennzahl als "Bar Offset" zu definieren ...


.. und der Expression selbst nur einen Dummy-Wert (als Höhe des Balkens) zu setzen


Weil der Tooltip dann aber irreführend wäre, diesen auch noch explizit als dritte Expression definieren, und den default Tooltip unter "Presentation"-"PopUp" Labels deaktivieren.



Voila - Problem gelöst. Jetzt können wir uns dem Qlik Sense Release zuwenden! Ups, dort geht die Darstellung gar nicht? Ein Kombi-Diagram kann nur eine Dimension? Naja, vielleicht gibt es mal einen Blogpost über das Extension Programmieren!

Download der .qvw gibt es hier!



QlikView Server - Das Gerücht vom Memoryleak und wie man den Cache zurücksetzt

Über das Memory & Cache-Verhalten des QlikView Servers wurde schon viel geschrieben. Trotzdem bleibt das Gerücht hartnäckig, dass der QlikView Server ein Memory Leak hat.



Wenn man sich jedoch einmal mit dem WorkingSetLimit-Setting in der QMC beschäftigt hat, wird einem  klar, dass der QlikView Server einfach gerne aggressiv cached. (Fast) jedes gerechnete "Chart", welches sich aus einer Userselektion ergibt, will der QlikView Server cachen, sofern er noch Memory (<= WorkingSetLimit Low) dafür zur Verfügung hat. Damit braucht ein QlikView Server immer weniger CPU-Zeit, "frisst" aber für gewöhnlich im Verlaufe eines Tages das Memory des Servers auf (und gibt es auch nicht mehr frei, sofern er das WorkingSetLimit Low getroffen hat).

Dieses Verhalt kann nerven - speziell wenn man am gleichen Server auch noch den Publisher/ServerReload laufen hat, und jemand zusätzlich mit dem QlikView Developer entwickelt. Dieses Deployment trifft auf  viele Testserver bei unseren Kunden zu!

Abhilfe kann ein Easteregg schaffen, das in der settings.ini des QlikView Servers gesetzt werden kann.

ClearCacheTimesPerDay=1

Das Setting löscht um Mitternacht den Cache des QlikView Server Services. Das bedeutet:
  •  Memory das von den Daten der .qvws belegt wird, bleibt belegt
  • Alle  gecachten Berechnungen werden gelöscht, und der QlikView Server gibt diesen Teil des Memorys wieder an das Betriebssystem frei.

Das Interessante an diesem Setting: man kann definieren wie oft der Cache geleert werden soll. Immer ausgehend von Mitternacht ergibt sich somit:

ClearCacheTimesPerDay=1Einmal am Tag um Mitternacht 00:00
ClearCacheTimesPerDay=200:00 und 12:00
ClearCacheTimesPerDay=300:00 08:00 16:00
...usw.
ClearCacheTimesPerDay=24jede Stunde 


Die Teststellung

Wir haben ClearCacheTimesPerDay=24 auf einer Teststellung bei uns überprüft.Und tatsächlich - zu jeder vollen Stunde wurde wieder das Memory des Caches freigegeben! Unterhalb unsere Vorgehensweise.

Server

Wir haben auf einem Win2016 Server mit 8GB RAM getestet. Das Workingset des Serves ist auf  50% beschränkt, damit sollte der QlikView Server Prozess bis maximal 4GB Daten cachen.

Workingset des QlikView Server Service auf 50% = 4GB

Das Testscript

Die .qvw für den Test ist recht simple. Das Script lautet:

load
  'A'&rowno() as row,
  rand() as value
autogenerate(1000000)

Im Layout gibt es eine einfache Tabelle. Wenn man einige Werte auswählt und dann Rechtsklick "Select excluded" wählt, füllt man mit jeder neuen Selektion den Server-Cache mit einigen Dutzend Megabytes.

Viele distinkte Daten füllen den Cache ganz gut!


Konfiguration & Test

  1. QlikView Server Service stoppen. Settings.ini ändern, Service starten
  2. Bis 09:43 haben wir den Cache des Servers durch "Klicken" in unserer Testapplikation  auf  2 Gigabyte hochgetrieben
  3. Um 10:00 sieht man im Performance Monitor eine steile Flanke nach oben. Memory wird also freigegeben!  Die Größe des QlikView Server Prozesses ist im Taskmanager auf 192 Megabyte gefallen! Das Setting hat also 1,98 GB Cache geleert! Die restlichen 192 MB sind die Daten in unserer Testapplikation plus ein wenig Overhead des QlikView Server Prozesses.
  4. Gleiches Spiel bis 10:40, nur dass wir mehr Zeilen im autogenerate()-Script der .qvw generiert haben  (ca 900 MB Daten im Memory). Damit füllt sich mehr Cache mit weniger Klick ;-)

    Diesmal haben wir den Cache bis an das Maximum von 4 Gigabytes hochgetrieben (wegen des definierten Workingset Low 50% von 8GB geht auch nicht mehr).

  5. Um 11:00 dann wieder der Drop auf 900 MB

Conclusio

Das Setting ClearCacheTimesPerDay funktioniert, und ist eleganter als ein net stop/start des QlikViewServer Services (bei dem alle Online-User aus ihrer QlikView Session fliegen). Für den Testserver kann es also sehr nützlich sein. Für den Produktiven Server ist es nicht zu empfehlen - da muss man schon ein sinnvolles HardwareSizing durchführen (gerne auch mit uns!).





heldendaten GmbH,2017