Posts mit dem Label Developer werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Developer werden angezeigt. Alle Posts anzeigen

GetObjectDimension & GetObjectMeasure - undokumentierte Qlik Chart Funktionen

Qlik vergisst gerade gerne neue Funktionen in den Release Notes zu erwähnen. Barry Harmsen hat gerade das neue Autonumber Script Statement beschrieben. Die beiden Chart Funktionen getObjectDimension und getObjectMeasure werden zwar von der Qlik Code Completion vorgeschlagen, in der Dokumentation sind sie aber nur bei der Funktion "GetObjectField" angedeutet.

Die GetObject* Funktionen in der Qlik Auto Completion
Die GetObject* Funktionen in der Qlik Auto Completion


Seit einigen Versionen hat auch Qlik Sense die Funktionalität Spalten (Dimensionen und Kennzahlen) in Diagrammen dynamisch ein- und auszublenden.

Hier kann man sich die getObjectDimension und getObjectMeasure zu nutzen machen, um abzufragen was denn gerade der Titel der jeweiligen Spalte ist:

Ist die Spalte "Count" eingeblendet wird "Anteil der Firmen" angezeigt

Ist die Spalte "Revenue" eingeblendet wird "Anteil des Umsatzes" angezeigt

Die Funktionen können als Kennzahl genutzt werden


oder zur Definition der Hintergrund/Textfarben. Leider kann man momentan die Funktionen nicht für die Titelbeschreibung der Charts nutzen.



Die Funktionen liefern die Beschriftung der Spalten, und nicht deren Definition.  Fügt man also zb. das Feld "Region" als Spalte ein, ändert aber den Titel auf "State" so liefert GetObjectDimension(1) auch die Bezeichnung "State".


Ändert man die Spaltenreihenfolge mittels Drag&Drop ändern sich die Formelergebnisse ebenfalls nicht. Es scheint also so, als würden die beiden Funktionen auch interne Indexe zugreifen!


Mit GetObjectDimension() kann man auch auf Alternative Dimensionen zugreifen. Zum Beispiel könnte man sagen für "Kategoriename" macht man ein normales PieChart, wenn aber auf "Artikelname" geswitcht wird, nutzt man die Radius-Formel  für ein RoseChart. Damit kann man wieder einiges steuern, wo wir in QlikView die Zyklische Gruppe & getcurrentfield()-Funktion hatten.

GetObjectDimension für Alternative Dimensionen 1
PieChart mit "KategorieName" als Dimension und "Artikelname" als Alternative Dimension



GetObjectDimension für Alternative Dimensionen 2
Wenn man auf die Alternative Dimension "Artikelname" switcht, wird ein Rose Chart daraus.



GetObjectDimension in Formel nutzen
Hier die Radiusformel mit GetObjectDimension(0) um das Rose Chart zu generieren.




Die Beispiel .qvf finden Sie hier. Hier der Qlik Knowledge Base Artikel zu den Funktionen:
https://support.qlik.com/articles/000058438


Update 16.11.2020

Qlik nutzt in der Zwischenzeit die Expression GetObjectField() selbst gerne im "Modifier" Feature.

Aus

RangeSum(Above(If(Count([$(=Replace(GetObjectField(0),']',']]'))]) > 0,  ( sum(Anzahl*Einzelpreis) )  + 

Sum({1<[$(=Replace(GetObjectField(0),']',']]'))]={">=$(=Min([$(=Replace(GetObjectField(0),']',']]'))]))<=$(=Max([$(=Replace(GetObjectField(0),']',']]'))]))"}>}0), 0), 0, RowNo()))

wird zur Laufzeit für das Feld Bestelldatum dann

RangeSum(Above(If(Count([Bestelldatum]) > 0,  
( sum(Anzahl*Einzelpreis) )  + Sum({1<[Bestelldatum]={">=$(=Min([Bestelldatum]))<=$(=Max([Bestelldatum]))"}>}0), 0), 0, RowNo()))














Qlik Sense - QMC und Hub CSS Farbe setzen

Wer viele Tabs in seinem Browser offen hat, und zudem noch mehrere Qlik Sense Systeme (DEV, TEST, PROD) sein Eigen nennt, ist wohl manchmal verwirrt welche Qlik Sense Umgebung er gerade nutzt.

Leider gibt es kein direktes Feature um die verschiedenen Umgebungen farblich klar zu trennen, aber man kann sich die .css von QMC und HUB mal genauer ansehen.

Qlik Sense Hub und QMC in rot gefärbt

Als Helferlein dient hier am besten das Dev Tool in Chrome, welches man mittels F12 einblenden kann. Mit dem DOM-Inspektor sieht man, dass etwa die qmc.css den Style "qmc-toolbar" setzt.


Nicht ganz offensichtlich ist, wo denn die qmc.css im Filesystem liegt. Das war in Qlikview einfacher, weil wir den IIS/QVWS mit klaren Mountpoints hatten. Für den Qlik Sense Proxy Service findet man die Datei unter: C:\Program Files\Qlik\Sense\Client\qmc.css

Dort kann man zum Beispiel "Background-color: red;" für den Style "qmc-toolbar"einfügen.


.css Änderung bewirkt roten Balken in QMC



Für den Hub liegt die Datei unter C:\Program Files\Qlik\Sense\Client\hub\hub.css.  Dort ist es der Style "hub-toolbar".


Die .css ist komprimiert, und somit unangenehmer zu editieren. Wer aber zum Beispiel mit notepad++ nach "hub-toolbar{" sucht, sollte auch schnell fündig werden.





.css Änderung bewirkt roten Balken in Hub


QlikView 12 - Offline Hilfe als PDF

Als ich 2008 bei QlikTech begann, gab es noch Software auf CD und gedruckte Handbücher. Zeiten ändern sich! Auf die CD kann man mittlerweile getrost verzichten, mit den Handbüchern ist das so eine Sache...

Qlik gibt sich ja wirklich viel Mühe bei Ihrer neuen Online-Hilfe auf help.qlik.com! Es scheint gerade wieder ein neues Facelift bekommen zu haben.


help.qlik.com
help.qlik.com


Wer die Hilfe im QlikView 12 Developer aufgerufen hat, hat sicher schon bemerkt, dass - anstatt des bisherigen lokalen .chm-Files - nun direkt auf die Onlinehilfe verwiesen wird. Ich würde mir noch wünschen, dass man bei den einzelnen Script-Befehlen noch ein Messageboard integrieren würde, dann könnte man da direkt mit dem Qlik Support kommunizieren.


Schlecht jedoch, wenn man auf einem Entwicklungsserver ohne Zugang zum Internet arbeitet. Dann bekommt man nämlich gar keine Hilfe mehr zu sehen. Der Ärger ist groß bei Parntern & Kunden.

Letztens in der Knowledge Database habe ich es aber in einem Artikel entdeckt: Gut versteckt gibt es jetzt doch wieder PDF Handbücher zum Offline Arbeiten in Deutsch und Englisch:


QlikView PDF Guides



Schlanke 2039 Seiten sind es momentan beim "Arbeiten mit QlikView.pdf"! Ausdrucken werden wir es also wohl nicht :-)






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









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

Vertikale Labels in QlikView

Kompakte Dashboard benötigen immer wieder vertikale Überschriften oder Beschriftungen. Man sieht öfters QlikView Applikationen bei denen diese "Texte" in Wahrheit eingebundene Graphiken sind. Bei mehrsprachigen Dashboards führt das sehr schnell zu einem hohen Wartungs- & Implementierungsaufwand, den wir gerne vermeiden möchten.

Vertikale Beschriftung auf einem Dashboard
Leider unterstützt die normale Textbox in QlikView keine vertikalen Ausrichtung der Schrift. Deshalb muss man zu einem Trick greifen: Die Diagramme in QlikView bieten die Option "Freier Text". Für diese freien Texte kann man die Neigung der Schrift definieren.


Eigentlich ist dieses Feature gedacht, um Achsenbeschriftungen an der Y-Achse eines Charts vertikal anzuordnen. Wir wollen aber nur den Text nutzen, und gar kein Chart! Deswegen müssen wir es schaffen das Chart unsichtbar zu machen!

Um also das eigentliche Chart "loszuwerden" eignet sich am besten ein Messzeiger.



Ein Messzeiger hat keine Dimension, und eine Dummy-Expression mit "0". Deaktivieren Sie "Text als Quick-Info" damit das Objekt keine Tooltip anzeigt.


Unter "Präsentation" fügen Sie dann Ihren freien Text ein, und geben die Neigung an.


Jetzt ist der Shortcut STRG+SHIFT Ihr Freund um mit der Maus das Label zu positionieren. Im Endausbau blendet man dann die Titelleiste und Rahmen komplett aus.



Die Mehrsprachigkeit funktioniert dann wie gehabt am besten über eine Variable der man einen Language-Key übergibt.

=$(vHD_Translate('l.Dashboard.Section2.HeadlineB'))

Die Flaggen schalten die Sprache hin- und her. Fertig ist die mehrsprachige Beschriftung!

Die vertikale Beschriftung auf Deutsch

Die vertikale Beschriftung auf Englisch

Die Applikation zum Herunterladen finden Sie hier.









QlikView 12 ist da - Mit aktualisiertem Bild der Entwicklungsmannschaft

QlikView 12 ist Ende 2015 auf der Download-Seite verfügbar gemacht worden. Und endlich (erstmals seit QlikView 9) wurde auch das Entwickler-Team Bild wieder aktualisiert! Schön die alten (und viele neue) Kollegen mal wieder zu Gesicht zu bekommen :-)

QlikView 12 Development Team
In QlikView 12  GA wurde das DevTeam.jpg EasterEgg aktualisiert


Wie man bei unseren altem Blogpost von März 2013 nachlesen kann, war das versteckte Bild jetzt einige QlikView Versionen gleich geblieben. Nutzt man die .qvw Applikation in QlikView 12, sieht man jetzt das aktualisierte Bild. Danke an Johan Asplund, der diese alte Tradition scheinbar wieder zum Leben erweckt hat :-)

Erste Reviews und Änderungen findet man zB bei Rob Wunderlich. Bei einer Serverinstallation bitte momentan noch mit Bedacht vorgehen! Die Publisher Reloads dürften in einigen Fällen langsamer laufen als in QlikView 11.20SR13. Ein Workaround ist bekannt, wir raten unseren Kunden aber vorerst noch auf Version 11 zu bleiben.

Dynamische Kundenklassifizierung mit QlikView

Es gibt viele graphische Hilfsmitteln in QlikView um seine Kunden zu klassifizieren. Sei es die Anzeige einer fix gerechneten Klassifizierung aus dem Quellsystem, ein Balkendiagramm in dem man mit der Maus die relevanten Kunden selektiert, oder eine ABC-Analyse. Manchmal möchte der Anwender die Kunden aber erst an der Oberfläche anhand von dynamischen Grenzen auswählen können.

Das Schöne an QlikView ist, dass es die Detaildatensätze im Arbeitsspeicher hält. Anstatt also nur eine vorberechnete Klassifizierung aus dem Quellsystem anzeigen zu können, kann man anhand der aktuellen Selektion dynamisch Kunden wählen. Unterhalb zwei Beispiele wie man solche Anforderungen in QlikView userfreundliche lösen kann.

1. Selektiere Kunden anhand eines Umsatzbereiches

Will der Anwender also alle Kunden filtern, die im August 2015 zwischen 1.500 und 5.000€ Umsatz gemacht haben, kann er das prinzipiell mit dem Feature "Erweiterte Suche" tun. Jedoch ist einiges an Tipparbeit nötig und auch die Formel-Syntax ist oft nicht ganz einfach. Deswegen stellen wir unseren Anwendern hierfür zwei Inpuvariablen (für die Umsatzgrenzen) und eine Schaltfläche bereit, welche die Drecksarbeit übernehmen:

Ein Klick auf den Button selektiert Kunden mit Umsatz im Aug 2015 zwischen 1,500 und 5,000€
Nach dem Klick sieht man die Syntax der Erweiterten Suche in der Auswahlstatus-Box. Es wurden acht Kunden selektiert.


Mit dieser Auswahl an Kunden kann der Anwender nun weiter analysieren: Wählt er zum Beispiel den September, sieht er, dass erst zwei der acht Kunden im aktuellen Monat Umsatz generiert haben.


Die Syntax der dynamischen Suche auf das Feld "Firma" wird in der "Auswahl in Feld"-Aktion der Schaltfläche weggekapselt:

='=sum(Umsatz) >= $(vSuchwertMin) and sum(Umsatz) <= $(vSuchwert)'

2. Klassifiziere Kunden anhand eines durchschnittlichen Bestellwertes

Abhängig von z.B. der Produktkategorie kann der durchschnittliche Bestellwert eines Kundens stark variieren: der Bestellwert bei Ersatzteilen ist niedriger, als wenn man eine ganze Maschine kauft. Insofern ist eine vorberechnete Klassifizierung im Vorsystem oft nicht ausreichend, da dort die Klassifizierung zumeist über alle Bestellungen des Kunden vorgenommen wird.

In unserem Beispiel sehe wir, dass im Jahr 2015 in der Kategorie "Milchprodukte" neun Kunden existieren, die einen durchschnittlichen Bestellwert größer 700€ haben. Das sind für den Anwender die "A Kunden" in dieser Kategorie. Die Grenzen für die ABC-Kunden kann über die Inputbox frei definiert werden.

9 Kunden haben einen durchschnittlichen Bestellwert von mehr als 700€ im Jahr 2015 für Milchprodukte

Eine Auswahl in der Listbox liefert uns die "A Kunden". Man sieht auch, dass nach Klassifizierung des Vorsystems zwei dieser Kunden eigentlich als "B Kunden" firmieren. Klar, denn diese Klassifizierung ist nicht dynamisch anhand der aktuellen Userselektion und Umsatzgrenzen.
 

Ändert man die Produktkategorie nun auf "Getränke", sieht man, dass hier die Klassifizierung anders aussieht: wir hätten bei gleicher 700€-Grenze mit "QUICK-Stop" nur einen der neun Kunden als "A Kunden"! Vier der anderen Kunden sind in dieser Kategorie überhaupt nur C-Kunden.



Die Implementierung der Selektion ist mit einer dynamische Listbox gelöst. Die AGGR-Funktion berechnet dynamisch anhand des Feld Firma und der Bestell-Nrs die ABC-Klassifizierung.

=aggr(
 if(
  avg(
   aggr(
    sum(Umsatz),Firma,[Bestell-Nr]
   )
  ) < $(vSmall), dual('C Kunde: Umsatz <$(vSmall)',1),
  if(
   avg(
    aggr(
     sum(Umsatz),Firma,[Bestell-Nr]
    )
   )< $(vMedium), dual('B Kunde: $(vSmall) < Umsatz < $(vMedium)',2), 
   
   dual('A Kunde: Umsatz >= $(vMedium)',3))
  ) 
  
  
,Firma)

Das gesamte Beispiel finden Sie hier.

PS: die AGGR in AGGR wäre hier nicht unbedingt notwendig. sum(Umsatz)/count(Distinct Bestell-Nr) ginge auc; aber schön das zu zeigen :-)

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 :)
heldendaten GmbH,2020