Information Density bei Concatinierter Faktentabelle

Zu jedem Feld kann man sich in QlikView und Qlik Sense die Information Density anzeigen lassen. Das ist eine wichtige Information, um die Datenqualität Ihrer App zu überprüfen.

Hier ein Beispiel: im Kundenstamm haben nur 75,8% aller Kunden eine Telefax Nummer gepflegt. Das könnte bei Ihrer nächsten Telefax-Marketing Kampagne (falls es soetwas noch gibt :-)) störend, für Ihre nächste Rechnungslegung unter Umständen sogar sehr ärgerlich sein!

Information Density in Qlik
Information Density - links in Qlik Sense, rechts in QlikView

Jedes einzelne Feld zu überprüfen ist einigermaßen zeitaufwendig, weswegen wir in unserem Heldendaten Applikationstemplate gerne den Data Profiler von quickintelligence.co.uk nutzen. Dort sieht man die "Null Values" eines Feldes auf einem Blick.

Telefax hat 22 Null Values, was die Information Density von 75,8% ergibt
Auch andere Felder im Kundenstamm haben eine Information Density < 100 %

Information Density bei Concatinierter Faktentabelle

Schwieriger wird es mit der Information Density-Kennzahl, wenn Sie ein Datenmodell mit mehreren Faktentabellen bauen. Das passiert sehr häufig: Ihre Applikation hat mehrere Faktentypen (IST-Zahlen und Budget-Zahlen) oder Sie verheiraten die ERP-Altdaten mit Daten ihres aktuellen ERPs. Steht ist es wichtig zu wissen, welche Spalten wie gut gefüllt sind. Vor allem wenn man sicherstellen möchte, dass der Anwender mit seinen Selektionen die Daten aus allen Quellsystemen wählt (also die Information Density 100% ist)


Zur Veranschaulichung, hier ein Beispiel wie in  Qlik solche Faktentabellen aussehen:

Concat Fakten in gemeinsame Faktentabelle
Für den Faktentype Procurement Cost gibt es das Feld Region  in der Quelle nicht. Damit ist die Information Density für diese Feld  jetzt nur noch 14 (befüllte Zeilen) /20 (Zeilen insgesamt) = 70%. Viel interessanter wäre es aber zu wissen, dass das Feld Region folgende Information Densities hat:

  • Sales: 100%
  • Plan Yearly: 100%
  • Procurement Cost: 0%
Wählt ein Anwender einen Eintrag im Feld Region an der Oberfläche, so sieht er keine Procurment Costs mehr. Das kann gewünscht sein, oder ein fehlerhaftes Mapping/fehlende Daten sein. Eine Information Density pro Faktentyp ist also Notwendig für eine umfassende Problemanalyse.
Dafür benötigen wir zuallererst ein Feld Source um zu wissen aus welcher Quelle welche Datensatzzeile ursprünglich kommt. Das Aufbauen Ihrer Faktentabelle Facts sollte also etwa so aussehen (je nachdem ob aus Datenbank/QVD/resident)

Facts:
load
*,
'Sales' as Soure
from/resident Sales;

concatenate (Facts)
load
*,
'Plan Yearly' as Soure
from/resident Plan Yearly;

concatenate (Facts)
load
*,
'Procurement Cost' as Soure
from/resident [Procurement Cost];
 
 
Als nächsten Schritt müssen NullCounts() für alle Felder im Script berechnet werden. Wenn Sie ein 3-Schichtenmodell nutzen, würde ich das Script im Datenmodell hinzufügen. Bei großen Datenmengen und vielen Faktenspalten kann das Skript schon mal länger rechnen - fügen Sie sich vielleicht einen Variablen-Schalter ein, damit das Skript beim Entwickeln nicht ständig ausgeführt wird.

//config
let tFactTableName = 'Facts';
let tSourceTable_Field = 'Source';


//Generate Fields that are in Facttable
let vAggregations = '';
for i = 1 to nooffields('$(tFactTableName)')

 let vField = Fieldname($(i),'$(tFactTableName)');
 if (vField <> '$(tSourceTable_Field)') then
   let vAggregations = vAggregations & 'nullcount([$(vField)])  as [$(vField)] ,';
 end if
 
 
 
next
trace *************** Check for fields: $(vAggregations);

ttFactsInfo:
load
   $(tSourceTable_Field), 
   $(vAggregations)
   1 as dummy
resident $(tFactTableName) group by $(tSourceTable_Field);

drop field dummy;


//Transform table to get all Fieldnames in a single column
tFactsInfo:
CrossTable (FieldName,NullCount,1)
load
  *
resident ttFactsInfo;
drop table ttFactsInfo;
 
  
//Check how many rows each "Source Table" has
MappingFactsSourceCount:
mapping
load
 $(tSourceTable_Field),
 count($(tSourceTable_Field))  as AllCount
resident $(tFactTableName) group by $(tSourceTable_Field);


//Generate FactsInfo
FactsInfo:
load
 $(tSourceTable_Field),
 FieldName,
 applymap('MappingFactsSourceCount',$(tSourceTable_Field), -99) 
           as AllCount,
 NullCount,
 applymap('MappingFactsSourceCount',$(tSourceTable_Field), -99)-NullCount 
          as FoundCount
resident tFactsInfo;

drop table tFactsInfo;

//optional drop table Facts;


let tFactTableName = ;
let tSourceTable_Field = ;


Das Skript erzeugt einen neue Tabelle FactsInfo mit den Feldern NullCount und FoundCount für jeden Fieldname pro Source-Tabelle. Damit lässt sich dann eine Pivottabelle bauen, die Ihnen die Information Density pro Feld zeigt. Unterhalb sehen Sie ein beladenes Beispiel in Qlik Sense
Information Density Example Concat Facts
Information Density für die Fakten: Buget, ORDERS und VBRP
Die Gesamtwerte-Spalte zeigt die Information Density wie sie Qlik im Datenmodell anzeigen würde. Daneben sehen wir die Befüllung in den Faktenquellen. Man sieht zum Beispiel auf einen Blick, dass das Feld PRODH (Produkthierarchie) in einigen ORDERS-Faktenzeilen nicht befüllt ist, da die Information Density dort nur 99,98% ist. Das Feld %KUNNR hat leere Einträge in ORDES und VBRP. Die Spalte NetSalesBudget hat nur eine Information Density von 1,94% - das ist aber OK weil es nur in der Source-Tabelle Budget befüllt ist (und dort dafür mit 100% immer einen Wert hat)

Als keines Gimmick sei auch noch das Sortieren der Pivot-Tabelle genannt. Sowohl die Sortierung nach Information Density, als auch eine alphabetische Sortierung der Feldnamen kann Sinn machen. Mit einer Variable kann die Sortierung hin- und hergeschalten werden. Siehe Screenshot mit alphabetisch sortierten Feldnamen - jetzt mit QlikView:

Information Density alphabetisch sortiert

Das komplette Beispiel für QlikView und Qlik Sense finden Sie unter content.heldendaten.eu/InformationDensity.zip









Automatische Email Benachrichtigung - Notification Connector For QlikView & Qlik Sense

Zuletzt habe ich auf einem Projekt gearbeitet, bei dem die QlikView Dashboards "Near Realtime" kontinuierlich geladen werden. Das funktioniert sehr gut - außer wenn der QlikView Publisher auf einen dauerhaften Fehler läuft - denn dann wird man mit Alert-Emails nur so zugespammt. Jeder fehlgeschlagener Reloadtask schickt eine eigene Email. Da kommen in der Stunde schnell 300 Emails zusammen.

Notification Connector For QlikView & Qlik Sense

Um die Emailflut einzudämmen, aber trotzdem über Fehler informiert zu werden, haben wir den Notification Connector For QlikView & Qlik Sense benutzt. Ende des Sommers hat Qlik unsere alten Freunde von qvsource.com übernommen, und dankenswerterweise einige Konnektoren zur freien Benutzung bereitgestellt. Darunter eben auch den Notification Connector, der es erlaubt, aus dem QlikView-Script heraus Emails zu verschicken.

Die freien, ehemaligen QVSource Connectoren, die Sie aus dem Qlik Market herunterladen können


Prinzipiell war der Emailversand auch mit den QlikView Alerts schon immer möglich. Aber die hübsche Formatierung in HTML, und die Flexibilität des QlikViewScripts ist  mit dem Notification Connector doch besser. In Qlik Sense ist der Connector überhaupt die erste Wahl um automatisiert Emails zu senden.

Fehlgeschlagene Tasks erkennen


Um Fehler aus den Publisher Logs zu lesen, haben wir uns bei den Skripten aus dem QlikView Governance Dashboard 2.0 bedient. Dort ist das Skript im versteckten Scriptreiter sichtbar, wenn man das Passwort "QVGD2.0" eingibt.

Das Hidden Script des Governance Dashboards

 Email Versand


Die .qvw  wird in unserem Projekt jede Stunde vom Publisher angestoßen, und sucht nach allen Taskfehlschlägen die seit dem letzten Run passiert sind.  Findet es Fehler, so schickt es eine Email mit allen betroffenen Applikationsnamen und den Log-Pfaden. So hat man mit einem Klick die Möglichkeit den Grund des Fehlers zu analysieren.

Email des Notification Connetors, insgesamt sind in der letzten Stunde 7 Tasks fehlgeschlagen

Einmal am Tag schickt die Applikation außerdem eine "Alive"-Email und sagt wie viele Reloads erfolgreich durchgeführt wurden. 

Email des Notification Connectors: von den 137 Reloads in der letzen Stunde waren alle erfolgreich. Kein Grund zur Sorge

Auch wenn Sie keine häufigen Reloads haben, so ist der Notification Connector hilfreich. Anstatt morgens in die QMC zu sehen, können Sie sich hier beliebige Informationen der nächtlichen Beladung zukommen lassen. Natürlich können Sie sich mit dem Notification Connector alle möglichen Informationen&Alarme versenden (Umsatzgrenze unterschritten, Datenqualitätsprobleme, etc.). Ihrer Phantasie ist da im QlikView Script keine Grenze gesetzt.

Die .qvw finden Sie zum Download hier. Sie müssen den Notification Connector am gleichen Rechner wie den Publisher auf Port 5555 installiert haben. In der .qvw müssen Sie am Reiter "Main" Ihre Einstellungen in den Variablen vornehmen. Bei Fragen stehen wir gerne zur Verfügung!


 

Search in Qlik Sense

Die Kollegen vom Qlik Design Blog haben einen schönen Artikel über die Suchmöglichkeiten in Qlik Sense verfasst. Das Cheat Sheet welches dabei herausgekommen ist, sollte man am besten jedem Anwender zur Verfügung stellen.


Qlik Sense Search Cheat Sheet
Suchen in Qlik
In QlikView sind die Suchmöglichkeiten leichter zu finden, weil der Anwender einige davon mit einem Rechtsklick auswählen kann. Dienlich ist das Cheatsheet aber sicherlich auch für QlikView-Anwender, da alle angeführten Suchen ebenfalls existieren.

Als Alleinstellungsmerkmal hat Qlik Sense 3.0 in der globalen Suche ein neues Feature, bei dem der Suchbegriff auch in den Diagrammen gesucht wird. Wenn Sie etwa in der Helpdesk Application nach "Infra" suchen, liefert die globale Suche direkt ein Preview auf ein Balkendiagramm und ein Liniendiagramm, in denen der Suchbegriff als "IT Infrastructure" und "Web Infrastructure" vorkommt.

Qlik Sense 3.0 Search Expression in Charts
Qlik Sense 3.0 Suche in Charts

Das Feature ist sehr prominent platziert. Manchmal geht dabei fast die normale Feldsuche ein wenig unter. Wir sind gespannt wie diese Feature von den Anwendern adaptiert wird.

Wozu ich in der Qlik Sense Dokumentation  leider nichts finden konnte, sind dynamische Bookmarks. Zum Bespiel benötigen wir öfter einen Button der das aktuelle Datum auswählt. Die Syntax dafür ist leider nicht so simple, dass jeder Anwender ohne weiteres die entsprechende Expression aus dem Ärmel schüttelt: man muss den Feldnamen und die Funktion tippen. =today() alleine greift leider nicht.

Qlik Sense Dynamische Suche in Feld
Eine Suche nach "heute" im Feld Date - ausgeführt am 16.09.2016

Soweit so "QlikView" könnte man sagen. Dort ist es die gleiche Syntax! Der Unterschied zeigt sich aber in der Auswahlbox. In QlikView steht dort der Dynamische Ausdruck, in Qlik Sense jedoch das Ergebnis der Suche: "9/16/2016".

QlikView Auswahlstatus dynamische Suche
In QlikView sieht man den dynamischen Ausdruck


Damit hatte ich eigentlich angenommen, dass es momentan keine dynamischen Lesezeichen in Qlik Sense gibt. Auch in der Lesezeichen Definition kann man leider nicht erkennen, ob es ein dynamischer Ausdruck gespeichert wird, oder das Ergebnis der Suche...

Qlik Sense Bookmark Dialog


Legt man jedoch das Lesezeichen auf einen Button, wartet mal kurz einen Tag und klickt diesen dann, so merkt man, dass auch in Qlik Sense das Lesezeichen die dynamische Suche (und nicht den 16.9.2016) speichert.

Qlik Sense Button Apply Bookmark
Button mit "Apply Bookmark"


Qlik Sense Dynamic Bookmark
Der Klick auf den "Select Today" Button am 17.09.2016



Wer sich selbst überzeugen möchte, die Applikation ist online auf demo.heldendaten.net zu finden! Dynamische Bookmarks funktionieren also auch in Qlik Sense. Wer die Applikation vor dem Jahr 2029 testet, sollte mit dem Button immer den aktuellen Tag gewählt bekommen. Danach müsste ich das Skript anpassen ;-)

QlikView und Windows 10

Mit dem heutigen Tag endet das Gratis-Update auf Windows 10. Auch in vielen Firmen sind zumindest neu angeschaffte Geräte bereits mit Windows 10 ausgestattet. Da viele Kunden noch auf QlikView 11.20 setzen, war in letzter Zeit folgende Fehlermeldung beim QlikView Developer/Plugin Setup die häufigste Anfrage, die wir über unseren Support-Kanal bekommen haben: "Das Betriebssystem ist zum Ausführen von QvPluginSetup nicht geeignet".

QlikView 11.20 SR15 Fehlermeldung bei der Installation unter Windows 10


QlikView 11.20 SR15 lässt sich also nicht unter Windows 10 installieren. Das ist korrekt, denn der offizielle Support für Windows 10 ist erst mit QlikView 12 hinzugekommen. Siehe System Requirements für QlikView 12.

In unseren Test hat sich gezeigt, dass es beim Zugriff mit QlikView 12 Client auf einen QlikView 11.20 Server zu Problemen kommen kann: wir hatten etwa den Fall wo sich Buttons im IEPlugin nicht mehr klicken ließen, wodurch das Ein/Ausblenden von Objekten nicht mehr funktioniert hat. Außerdem ist dieses Mixed-Deployment von Seiten Qlik eigentlich nicht supported, da unterschiedliche Programmversionen auf Client und auf Server installiert sind.

Ein überstürzter Upgrade auf QlikView Server 12 sollte jedoch nicht ganz auf die leichte Schulter genommen werden. Wie Rob Wunderlich in seinem Post "Preparing your script for QV12" zusammengefasst hat, verhält sich die neue Qlik-Engine, welche in Qlik Sense und QlikView Version 12 zum Einsatz kommt, bei manchen Script-Befehlen unterschiedlich zu QlikView 11.20.  Mittelfristig müssen wir uns aber alle mit diesen Änderungen auseinandersetzen, da der End Of Life für QlikView 11.20 mit 8. Dezember 2017 definiert ist.

Aus den oben genannten Gründen, schlagen wir momentan folgende Vorgehensweise vor:

  • Stand heute sind die meisten unserer Kunden auf QlikView 11.20
  • Wenn Sie vorhaben in Ihrem Unternehmen Windows 10 großflächig auszurollen, bitte nehmen Sie mit uns Kontakt auf, damit wir ein Upgrade auf QlikView 12 planen können

  • Wenn Sie vereinzelte Windows 10 Rechner haben, dann gibt es die Option den QlikView Developer 11.20 bzw. das QlikView Plugin 11.20  im Kompatibiltätsmodus für Window 7 zu installieren.

    Soweit wir sehen, funktioniert sowohl der QlikView Developer als auch das QvPlugin für Internet Explorer (nicht für Edge!) mit diesem "Trick". Dieses Vorgehen ist wohl auch nicht supported, aber zumindest hat man QlikView in der gleichen Version wie am Server am Laufen!

Kompatibilitätsmodus für Win 7 aktivieren und dann Setup starten

Der Beweis: Windows 10 Pro mit einem 11.20 SR15 QlikView Internet Explorer Plugin


  • Mittelfristig planen Sie bitte den Upgrade auf QlikView 12 ein. Heldendaten steht Ihnen hierfür natürlich gerne zu Verfügung!

    Dafür werden wir zuersten den Testserver auf QlikView 12 aktualisieren, um zu Überprüfen, ob alle Skript wie gewünscht durchlaufen. Wenn diese Tests erfolgreich abgeschlossen sind,  sollten wir den Upgrade der Produktivumgebung einplanen. Bitte kommen Sie dafür vor Herbst/Winter 2017 auf uns zu, da Sie sonst erst wieder mit einer nicht mehr supporteten Verison QlikView 11.20 da stehen!





Qlik SAP Connector - Fallstricke beim Update

Bei Connectivity gilt für viele Leute das alte Sprichwort "Never touch a running system". Das gilt auch sehr stark für den Qlik SAP Connector. Einmal installiert, liefert er zuverlässig die Daten an die Qlik Platform - über ein Upgrade denken da die wenigsten nach.

Ab und zu einen Blick auf die aktuellen Releasenotes zu werfen, schadet aber nicht! Zuletzt kam mit Version 5.9 der neue BEx Connector hinzu, und auch sonst beinhaltet der aktuelle Connector einige Neuerungen. Unterhalb sehen Sie die aktuellen Zugriffsmöglichkeiten auf Ihr SAP System.

Zugriffe auf SAP ERP
Zugriffe auf SAP BI/BW


Seit Frühjahr 2016 liegt der  "Qlik Connector for use with SAP 6.1.2" vor. Die ReleaseNotes beinhaltet eine verlockende Aussage, gerade für Kunden die noch die Versionen 5.80 oder 5.90 im Einsatz haben:

  • SQL Connector: Significant performance improvement for reload times

Das Upgrade will aber gut geplant sein, beinhaltet es doch einige Fallstricke!

Änderung des Connection Strings

Mit dem Support von Qlik Sense, hat sich auch der Connection String des SAP Connector ab Version 6.1 geändert. Wenn Sie den Connection String ordentlich in einem Include File pflegen, sollte das Umstellen mit einem geringen Aufwand verbunden sein. Ändern Sie einmalig .dll in .exe und beim OpenSQL Connector müssen Sie "Sql" einfügen!

Old connection string for QlikView:
CUSTOM CONNECT TO "Provider=QvSAPConnector.dll;…

New connection string for QlikView:
CUSTOM CONNECT TO "Provider=QvSAPSqlConnector.exe;…

Falls Sie den Connectionstring in mehreren Applikationen stehen haben - spätestens jetzt wäre der Zeitpunkt für ein Include-File!

Aktuelle Transporte

Mit jeder Version des SAP Connectors werden auch SAP-seitige Qlik Module ausgeliefert. Diese Transporte sollten eigentlich immer gleichgezogen mit der aktuellen Connector-Version auf Ihrem Windows-Server werden. Seit dem Release 5.80 SR2 gab es da eine gewisse Abwärtskompatibilität, weswegen das gerne vernachlässigt wurde. Der Einzige der sich beschwert hätte, ist der Qlik SAP Log! Den finden Sie unter C:\ProgramData\QlikTech\CustomData\QvSAPConnector\Log


Mit der Version 6.1.2 sind die Transporte auf jeden Fall wieder hochzuziehen, wenn Sie den SQL Connector oder den BEx Connector im Einsatz haben. Siehe die Tabelle aus den Releasenotes, die neue Kompatibilität für SQL+BEx Connector beginnt mit 6.1.1.




Einen Überblick welcher Transport in welcher SAP Basis Version zu welcher Connector-Version passt, finden Sie im QlikSupport hier.


Änderung der Datenanlieferung - Führende Nullen

Die größte Änderung verbirgt sich in einem unscheinbaren Satz in den Release Notes zu Version 6.1 IR.

The SAP data types CHAR (character) and NUMC (numeric character) were previously interpreted (in the Qlik script) as ‘numeric’ if they contained only digits. Leading zeroes were removed. (0000141000 became 141000).

Diese Änderung hat aber gravierende Auswirkungen auf bestehende Skripte. Wir haben Fälle gesehen, wo als Folgewirkung die Datenmodell keine Daten mehr aus den .qvds geladen haben. Zum Beispiel lieferte folgender Pseudocode


from .qvd
where MANDANT = '10' 

plötzlich nur noch 0 Zeilen!

Alle Skripte mussten auf

from .qvd
where MANDANT = '010' 

geändert werden.

Manche Schlüssel und Datenfelder änderten ihren Typ von Zahl auf Text, was in den Layouts zu "unbrauchbaren" Applikationen führte. Wir konnten nur mittels Informationen im QVD Header rausfinden, welche Felder alle betroffen sind.

Das Verhalten ist ebenfalls problematisch, wenn Sie bestehende .qvds haben und nur einen Delta-Load durchführen. Alte .qvds, erzeugt mit einer Version vor 6.1 IR, sind sozusagen nicht kompatibel. Sie müssten einen Fullload machen. Also alles Punkte die mit sehr viel Aufwand verbunden sind.

Nach Rückfragen beim Qlik Support gibt es mit 6.1.2 nun jedoch ein undokumentiertes (aber supportetes!) Connectionstring-Setting DataTypeLegacyMode=1. Wir hatten noch nicht die Möglichkeit es zu testen, aber ich hoffe damit bleiben uns viele Skriptumstellungen erspart.

Zusammenfassung

Egal von welcher Version des Connectors Sie updaten, ein Upgrade will geplant sein! Bitte zuerst die Transporte am SAP Testserver updaten, und dann das Qlik Setup auf dem Windows-Server durchführen. Wenn dann alle Qlik Skripte sauber durchlaufen, können Sie das Update der Produktion in Angriff nehmen!

Nachtrag 24.03.2017

Folgenden Knowledgebase Artikel gibt es nun von der Qlik bezüglich Datumsfeldern zu beachten:




QlikView Publisher in a nutshell

Oft werden wir gefragt, welche Funktionalität der QlikView Publisher umfasst. Leider kenne ich keine gutes Dokument, das alle Features übersichtlich listet. Unterhalb also mein Versuch die wichtigsten Punkte kurz zu beleuchten.


QlikView Server & Publisher auf zwei getrennte Maschinen

Kleine QlikView Installationen starten gerne mit einer Maschine die gleich zwei Aufgaben übernehmen muss: Das Beladen der QlikView Applikationen sowie die In Memory-Analyse über den QlikView Accesspoint.

Technisch übernehmen diese beide Aufgaben einerseits das QlikView Distribution Service (Beladung) und andererseits das QlikView Server Service (In Memory Analysen). Meist geht das eine Weile gut, doch eigentlich sind sich die beiden Services spinnefeind! Beide Services sind sehr Memory- und CPU-intensiv und wollen eigentlich alle Ressourcen für sich alleine!

Kastriert man den QlikView Server über seine WorkingSet-Limits, kann das Service weniger Cachen und die QlikView Anwendungen werden CPU-intensiver. Nutzt der QlikView Server alle Ressourcen um die Useranfragen schnellst möglich bereitzustellen, bleibt kein "Platz" mehr für die Beladung der Applikationen.

Wenn also über die Jahre die Datenmengen in den Applikationen wachsen, die Beladungen auch untertags stattfinden sollen oder immer mehr Kunden auf die Applikationen zugreifen - kurz gesagt wenn das Qlik Projekt ein Erfolg ist - dann streiten sich die beiden Services immer mehr um die beschränkten Rechner-Ressourcen, worunter die Gesamtperformance leidet. Am Sinnvollsten ist es dann,  die Services auf zwei getrennten Servern zu konfigurieren. Lizenztechnisch ist das aber nur mit einer Publisher Lizenz möglich.

Aus unserer Erfahrung schlagen wir immer folgendes Deployment vor, welches auf Dauer viel stabiler als eine "Single Server"-Lösung läuft, die Ressourcen besser nutzt und leichter zu Warten ist.

QlikView Deployment
Empfohlenes Deployment: Publisher und QlikView Server auf zwei Maschinen trennen


Cluster Publisher

Haben Sie eine Publisher-Lizenz, so dürfen Sie damit einen Server betreiben. Benötigen Sie eine Lastverteilung der Beladungen über mehrere Server, so können Sie das Distribution Service clustern. Die Taskdefinition in der QMC bleibt gleich, und Qlik entscheidet aufgrund eines Loadbalancing-Algorithmus auf welchem Reload-Server der Task dann tatsächlich ausgeführt wird.

QlikView Cluster Distribution Service
Mehrere Distribution Services sind sinnvoll, wenn sehr viele Beladetasks vorhanden sind

And Trigger - On Multiple Events completed

Sehr häufig sehen wir bei  Nicht-Publisher Kunden ewig lange Taskketten, da die QVD-Generatoren "seriell" nacheinander angestoßen werden. Das ist weder bezüglich Übersicht in der QMC, noch von der Laufzeit ideal.

Mit der Publisher-Lizenz wird ein weiterer Trigger-Typ freigeschalten: der "On Multiple Events Completed" oder auch "AND"-Trigger.

Typischerweise benötigt ein QlikView Datamart (Datenmodell) mehrere QVD-Generator als Vorgänger, da man oft pro Quellsystem einen eigenen QVDGenerator anlegt. Anstatt diese QVD-Generatoren seriell nacheinander laufen zu lassen, können Sie alle gleichzeitig wegstarten. Sobald der Langsamste fertig wird, startet der Datenmodell-Task. So lässt sich die Durchlaufzeit erheblich reduzieren.

QlikView AND Trigger on multiple events completed
Der Task startet, wenn der "langsamste" der drei  (parallel laufenden) Vorgängertasks fertig ist

Simple Reduce  und Loop&Reduce

Sie haben eine große Applikation, die Sie in mehrere kleine Tortenstücke "schneiden" möchten? Mit der Publisher-Lizenz erhalten Sie den Menüpunkt "Reduce".

Typisches Anwendungsgebiet ist, dass Sie für Ihre Niederlassungen (US, EU, Asia) getrennte Applikationen berechtigen möchten, während die User im Stammhaus weiterhin alle Daten in einer großen Applikation im Zugriff haben sollen. Aus der Gesamtapplikation lässt sich in der QMC manuell oder als "Seriendruck" mehrere kleinere .qvws schneiden und automatisch für die User berechtigen.

QlikView Publisher Simple Reduce
Simple Reduce über Land=Deutschland, Österreich und den Kategorienamen=Getränke


Qlikview Publisher Loop and Reduce
Loop&Reduce über das Feld "Land"  erzeugt und berechtigt pro Land eine Applikation


Distribute zu Email/Netzlaufwerk/Accesspoint

Ohne Publisher Lizenz muss die .qvw immer am Ort beladen werden, wo auch der User via Accesspoint darauf zugreift. Mit dem Publisher sind Sie hier flexibler: Sie können QlikView Auswertungen via Email verschicken, auf einem Netzlaufwerk bereitstellen, oder auf einen Ihrer Accesspoints verteilen. Der Menüpunkt "Distribute", über den Sie auch die Userberechtigungen steuern, wird mit der Publisherlizenz freigeschalten.

QlikView Publisher Distribute
Der Distribute Reiter verteilt und berechtigt die QlikView Applikation

Notify

Ein kleines Feature, aber nicht unwichtig: Sie wollen Ihre Mitarbeiter informieren, dass eine aktualisierte Version der Qlik Applikation am Accesspoint bereitsteht: setzen Sie den Haken "Notify" um alle Berichtsempfänger zu informieren. Unter "System" können Sie das Notify-Emailtemplate bearbeiten.

QlikView Publisher Notify
Allen Empfängern eine Email schicken wenn QlikView Applikation frisch beladen wurde

Mehr als ein Task pro .qvw möglich

Oft ärgerlich ohne Publisher-Lizenz: man kann pro .qvw nur einen Task anlegen. Manchmal möchte man aber den Task jeden Montag und am Monatsende laufen lassen. Oder man möchte neben einer zeitgesteuerten Ausführung den Task auch von einem externen System angestoßen lassen.

Mit der Publisher Lizenz können Sie pro .qvw beliebig viele Tasks anlegen.

QlikView Publisher Multiple Tasks
Mehrere Tasks auf einer .qvw


EDX (über schönen Tasknamen ansprechbar)

Hier geht es darum, die QlikView Tasks von extern anzustoßen. Ein Beispiel wäre, dass ein externer Scheduler den QlikView Task erst startet, nachdem das Data Warehouse fertig beladen wurde (da dies zu unterschiedlichen Uhrzeiten eintreten kann).

EDX oder "Event Driven Execution" geht genaugenommen auch ohne Publisher Lizenz. Aber man muss schon ziemlich gut im "Tasknamen Raten" sein, um den Task von einem Vorsystem anstoßen zu können. Mit der Publisher-Lizenz können Sie jedem Task einen Namen und eine Description geben, damit wird das Anstoßen der QlikView-Tasks durch das Vorsystem deutlich komfortabler.

QlikView Publisher EDX Trigger
Ein externer Scheduler kann den Publisher Task mit dem Namen anstarten


Supporting Tasks

Neben dem reinen Beladen von QlikView Applikationen, können Sie mit dem Publisher auch weitere Tasks durchführen. Dazu zählt:

  • Das Ausführen von External Programs (zB Powershell/Batch-File um Daten zu löschen/kopieren, CacheWarming, etc.)
  • Database Command Tasks (zB Inserts in Log-Datenbank wenn alle Tasks erfolgreich durchgelaufen sind)
  • QVD Creation Tasks: Erzeugen und Berechtigen von .QVD Datentöpfen auch ohne QlikView Applikation. Berechtigte Self Service BI-User können dann diese .qvds nutzen um Ihre eigenen Applikationen aufzubauen
  • Pause Task: Dieser Tasktyp macht einfach mal Pause :-)

QlikView Publisher Supporting Tasks
Supporting Tasks  unabhängig von .qvws

Document Administrator

Sie haben Fachabteilungen die sich Ihre Dashboards selbst beladen/schedulen und berechtigen können? Gleichzeitig wollen Sie aber vermeiden, dass diese User Systemeinstellungen Ihrer QlikView Umgebung ändern können!

Der Publisher erlaubt mit dem Document Administrator Feature, dass bestimmte User nur bestimmte Applikationen in der QMC verwalten dürfen. Typischerweise definiert man pro Fachabteilung einen Mount-Point in dem alle Applikationen sind, die die Document Adminstrators selbst verwalten sollen. Die anderen Abteilungs-Applikationen sowie der Reiter "System" bleiben für diese Document Administrator verborgen.

QlikView Publisher Document Administrator
Dieser Document Administrator sieht nur seine Tasks im Mountpoint Default und HR. Der Reiter "Users" und "System" ist ebenfalls ausgeblendet

User Suche und Section Access Management

Wenn  die Berechtigungen nicht aus dem Vorsystem übernommen werden können, dann können Sie diese mit der Publisher-Lizenz zentral in der QMC managen. Benötigen Sie applikationsspezifische Berechtigungen (User X darf nur Kostenstelle Y sehen) so steht Ihnen hierfür der Menüpunkt "Section Access Management" zur Verfügung.

QlikView Publisher Section Access Management
Zentrales Management von User Rollen für Section Access
  

Parameter

Ähnlich gelagert wie "Loop & Reduce" können sie mittels Scriptparameter eine Variable an das QlikView-Skript übergeben. Wenn Sie  im QlikView Script etwa eine Variable vMandant haben, die im Skript wiefolgt genutzt wird
 
Select

*

from Fakten where MANDANT = $(vMandant); 

so können Sie die Variable in der QMC als Script Parameter setzen. So können Sie eine .qvw als Vorlage benutzen, um mit dem Publisher mehrere Varianten der Applikation zu verteilen.

QlikView Publisher Script Paramenter
Das Script in der .qvw würde dreimal ausgeführt werden: für den Mandanten 200, 300 und 500.

Remote Management Service

Wenn Sie in Ihrem Test/Quality System ebenfalls eine Publisher Lizenz haben, so können Sie in der Produktivumgebung dieses System als "Remote Distribution Service" eintragen. Damit können Sie die Taskdefinitionen aus dem Test/Quality System in die Produktivumgebung übernehmen.

QlikView Publisher Remote Management Service
Remote Management Service am Server "testsystem"


Backup QVPR einstellbar

Die Taskdefinitionen der QMC werden defaultmäßig in einem XML-Repository abgelegt. Dieses liegt für gewöhnlich unter  C:\ProgramData\QlikTech\ManagementService\QVPR. Dort wird auch täglich ein Backup angelegt. Mit der Publisher-Lizenz können Sie diese Backups auch in einem Ordner ablegen, der sowieso schon in Ihrem Backup-Plan enthalten ist.

QlikView Publisher QVPR Backup
QVPR Einstellungen für Pfad + Backup

Supervisor User

Anstatt die Administratoren (zB die User der IT-Abteilung) in jeder einzelnen Applikation zu berechtigen, gibt es das Konzept der Supervisor User. Diese User werden automatisch in jedem Distribution Task angehängt und dürfen alle QlikView Applikationen sehen.

QlikView Publisher Supervisor
Supervisor User für "Whole Server" definiert


Number of Task Attempts  bei Taskdefinition einstellbar

Leider laufen Beladetasks manchmal auf einen Fehler. Weil das Quellsystem nicht da ist, weil die Netzwerkverbindung weg ist, oder weil am Server nicht genügend Ressourcen bereit stehen. Viele Administratoren starten dann den Task frühmorgens nochmal, und dann läuft er plötzlich durch. Mit der Publisher-Lizenz können Sie die Tasks so definieren, dass der Publisher nach einem "Fehlschlag" die Beladung nochmal versucht. Oft klappt es dann beim zweiten Mal!

QlikView Publisher Task Number of Tries
Number of tries bevor der Publisher den Task "aufgibt"


 Audit 

Vertrauen ist gut, Kontrolle ist besser. In manchen Anwendungsgebieten muss man einfach nachvollziehen können, welcher User wann welche Änderungen durchgeführt hat (Task Trigger geändert, User berechtigt). Mit der Publisher Lizenz haben Sie die Option einen Audit-Log für die QMC zu aktivieren. Das Logfile kann dann natürlich mit QlikView ausgewertet werden.

QlikView Publisher Audit Log QMC
Audit Log für Änderungen in QMC kann in Config File aktiviert werden

Qlik ETL Script - Kann man diese Datei einlesen?

Vor Kurzem hat uns ein Kunde eine "eigenwillig" formatierte Datei zukommen lassen, mit der Bitte diese in eine Qlik Analyse einzubauen. Jedes BI-Tool kann wohl Excel, .csv oder XML-Daten laden. Aber so simpel war diese Datei leider nicht gestrickt. Dass wir für solche Fällen die Qlik ETL Skriptsprache zur Verfügung zu haben, ist natürlich äußerst dienlich!

Die Datei hatte folgende Struktur

CreationTime   : 16.03.2015 10:21:39
LastWriteTime  : 15.11.2014 14:28:45
LastAccessTime : 16.03.2015 10:21:39
Length         : 3512312
FullName       : \\MyComputer\Pics\P101.JPG

CreationTime   : 16.03.2015 10:21:39
LastWriteTime  : 15.11.2014 14:28:45
LastAccessTime : 16.03.2015 10:21:39
Length         : 2794726
FullName       : \\MyComputer\Pics\P104.JPG

CreationTime   : 16.03.2015 10:21:40
LastWriteTime  : 15.11.2014 14:35:02
LastAccessTime : 16.03.2015 10:21:40
Length         : 3151733
FullName       : \\MyComputer\Pics\P107.JPG

CreationTime   : 16.03.2015 10:21:41
LastWriteTime  : 15.11.2014 14:35:02
LastAccessTime : 16.03.2015 10:21:41
Length         : 3451760
FullName       : \\MyComputer\Pics\P108.JPG.JPG


und sollte in diese Struktur gebracht werden:

Um die Daten in diese tabellarische Form zu bekommen, sind einige Transformationsschritte notwendig.

Feldspalten trennen

Die Tabelle  lässt sich nicht gut anhand eines Trennzeichen teilen, weil das vermeintliche Trennzeichen "Doppelpunkt" zwischen den Wert-Paaren genauso vorkommt wie als Trennzeichen von Stunden, Minuten und Sekunden.

CreationTime   : 16.03.2015 10:21:41

In Qlik kann man stattdessen beim Einlesen der Datei auf die Option "Fix-Record" setzen. Nach 17 Zeichen hätten wir gern eine neue Spalte um Attribut-Felder von Wert-Feldern zu trennen.



Qlik generiert daraus folgendes Skript für die Spalten "Feld" und "Wert"

LOAD [@1:16] as Feld, 
     [@17:n] as Wert
FROM
[.\data.txt]
(fix, codepage is 1252);

Daten bereinigen

Für die weitere Transformation  benutzen wir einen Load above Load Befehl. Die Leerzeile die die  Originaldatei nach je 5 Zeilen enthält, laden wir danke len(Feld) > 0 nicht mehr mit. Den Doppelpunkt in der Spalte "Feld" entfernen wir mittels String-Befehl purgechar. Die leading und trailing Spaces, löschen wir mit trim().


DataTemp:
Load
ceil(rowno()/5) as ID,
trim(PurgeChar(Feld,':')) as Feld,
trim(Wert) as Wert
where len (Feld) > 0;
LOAD [@1:16] as Feld, 
     [@17:n] as Wert
FROM
[.\data.txt]
(fix, codepage is 1252);
 

Nach den bisherigen Transformationsschritten sind Attribute und Werte fein säuberlich getrennt. Sie stehen jedoch weiterhin in mehreren Zeilen untereinander.

Zeilen in Spalten transponieren

Um die fünf zusammengehörigen Attribute nun in eine gemeinsame Zeile mit mehreren Spalte zu transponieren, würde mancher QlikView-Kenner an den Generic-Load denken. Wir machen es hier aber selbst. Der Trick verbirgt sich hinter dem Feld (ceil(rowno)/5) as ID welches wir im vorherigen Skriptabschnitt eingebaut haben. Durch die Division&Aufrunden wissen wir immer welche fünf Zeilen in eine gemeinsame Zeile zusammengejoint werden müssen.

Die For-Schleife übernimmt dann den Join, und liefert uns das finale Ergebnis.



Voilà! Transformation geschafft! Auch wenn die meisten Daten nicht so "gemein" formatiert sind, ist es immer gut zu wissen eine mächtige Skriptsprache zur Verfügung zu haben! Also: Viel Spaß beim Qlik Skript schreiben!

Cycle Groups in Qlik Sense

Cycle Groups oder "Zyklische Gruppen" sind wohl eines der meist genutzten Features in QlikView. Ich kenne eigentlich keinen Kunden, bei dem das schnelle Wechseln von Dimensionen nicht zum Einsatz kommt. Das Gute an Zyklischen Gruppen ist, dass alle Charts, die die gleiche Zyklische Gruppe nutzen, gemeinsam die Dimension wechseln - so wird für den User mit einem Klick aus einem "Kundendashboard" mal schnell ein "Produktdashboard".


"Alternative Kennzahlen" und "Alternative Dimensionen" in Qlik Sense sind ganz nett, haben aber drei große Nachteile:

- Die "Alternativen" müssen in jedem einzelnen Chart hinzugefügt werden.
- Die Anwender finden die Funktionalität häufig einfach nicht, weil sie im "Untersuchungsmenü" sehr gut versteckt ist.
- Jedes Chart schaltet einzeln um. Oft will der Anwender - wie oben beschrieben - mehrere Darstellungen gleichzeitig umschalten, um etwa ein Balkendiagramm gemeinsam mit einer Zahlentabellen betrachten zu können.

Das "Untersuchungsmenü" mit Alternativen Dimensionen und Kennzahlen


Um Zyklische Gruppen in Qlik Sense zu nutzen, müssen wir im Moment also ein wenig tricksen. Dafür benötigt man eine Extension, die meiner Meinung nach sowieso unentbehrlich ist: qsVariable!

Darstellungsformen von qsVariable

Mit dieser Extension kann ein Anwender den Wert einer Variable setzen. qsVariable haben wir immer im Einsatz um etwa Sprache oder Währung durch den Benutzer setzen zu lassen. Hier benutzen wir die Extension jedoch, um sowohl unsere zyklische Dimensionen als auch umschaltbare Measures definieren zu können.

Die Vorgehensweise ist ganz einfach:

  1. Lege ein neues qsVariables Objekt an, und definiere die Einträge für die Variable vDimension. "Label" ist hierbei die sichtbare Beschriftung, "Value" das Feld im Datenmodell. In unserem Beispiel sind das die Dimensionen: Company Country, Company und Category



  2. Benutze die Variable vDimension als Chart Dimension




  3. Fertig ist die Zyklische Gruppe. Wenn man das qsVariable Objekt nun auch noch in die Masteritems hinzufügt, kann man es auf jedem relevanten Sheet wieder verwenden.

Die Vorgehensweise für die Kennzahlen ist ganz ähnlich. Hier ist der Style auf "Button" gestellt. Damit kann der User mit einem Klick zwischen den beiden Measures Revenue und Shipping Costs hin und her schalten.



Balkendiagramm und Tabelle nach Country und Revenue

Balkendiagramm und Tabelle nach Category und Shipping Costs

Die Qlik Sense Applikation (ohne Extension) finden Sie hier zum Download! Viel Spaß beim Testen!










heldendaten GmbH,2017