Quantcast
Channel: QlikView + Qlik Sense Blog von Heldendaten
Viewing all 102 articles
Browse latest View live

Auf in eine transparente Zukunft

$
0
0
Vor einigen Wochen hatte ich die Anfrage alle "zukünftigen" Balken in einem gestapelten Balkendiagramm transparent darzustellen. Konkret ging es um Lagerbewegungen die bis in die Zukunft projiziert werden. Die Transparenz soll dem Anwender helfen zu sehen, ab welchem Monat es sich um "Forecast"-Zahlen handelt.

Aufgrund der Vielzahl an Produkten war es nicht gewünscht bereits im Skript Farben für jedes Produkt zu hinterlegen. Deswegen wollten wir die Standardfarben von QlikView benutzen.

Die Aufgabenstellung: Ab November (aktuelles Monat) die Balken transparent darstellen)

Mein erster Ansatz funktionierte, verlangt aber viele unschöne Stringoperationen:

if(Month >= month(today()),
argb(120,
mid(color(rowno()),5,3),
mid(color(rowno()),9,3),
mid(color(rowno()),13,3)
)
,
color(rowno())
)

Aus der aktuellen Farbe des Balkens color(rowno()) schneidet die Formel die Stellen für RGB aus, und füge Sie mit Transparenz 120 wieder in die ARGB()-Formel ein.

Farben in QlikView

Für eine bessere Lösung muss man sich zuerst klar werden, wie Farben in QlikView funktionieren. Jede Farbfunktion in QlikView liefert eine Zahl zurück. Ruft man etwa =num(black()) auf, bekommt man folgenden dezimalen Output:

Was auf den ersten Blick nach einer zufälligen Dezimalzahl aussieht, ist bei näherer Betrachtung eine Bit-Darstellung einer ARBG-Farbe. QlikView bietet fertige Funktionen um Zahlen in beliebigen Zahlenbasen darzustellen. Mit der Funktion =num(black(),'(hex)') bekommt man den aussagekräftigeren Hexadezimalen-Wert für die Farbe Schwarz: ff000000!

QlikView liefert also für jede Farbe einen ARGB-Wert zurück. Insgesamt haben wir als für jede Farbinformation 1 Byte = 8 Bit zur Verfügung. black() ist also nichts anderes als Rot=0, Grün=0, Blau=0 mit einer vollen Deckkraft von A=FF(hex)


Die Farbe Schwarz binär dargestellt liefert QlikView mit der Funktion =num(black(),'(bin)').
Man erinnere sich an seine Informatik-Ausbildung: 1Hex-Stelle sind 4 bit!

 

Transparent rechnen

Mit diesem Wissen lässt sich nun die Transparenz viel einfacher manipulieren.  Um den Transparentwert beispielsweise zu "dreivierteln" könnte man das 30. bit auf 0 setzen. Um das zu erreichen, kann man von der Farbe  2 hoch 30 abziehen: =num(black() - pow(2,30),'(bin)')

Zurückkommend auf die ursprüngliche Fragestellung, kann man jetzt komplett ohne String-Operationen auskommen. Die Formel um die Balken halb-transparent darzustellen lautet nun

if(Month >= month(today()),
color(rowno()) - pow(2,31)
,
color(rowno())
)

Das fertige Chart

Download Beispiel

The Lost Datarows: DISTINCT - Verhalten bei Join, Concatenate

$
0
0
Normalerweise erzähle ich meinen QlikView-Novizen immer, dass man ein QlikView Skript von oben nach unten (und - falls Reiter vorhanden - von links nach rechts) liest. Innerhalb eines Load&Select-Statements gilt die Ausnahme, dass man diesen Statement-Block von unten nach oben lesen muss. Zuerst kommen die Daten aus einer Datenquelle (unten), dann werden sie mit einem (oder mehreren) Load-Statement weiterverarbeitet.

Hier ein einfaches Beispiel - aus der Ursprungstabelle lade ich mit einem oberhalb liegenden LOAD DISTINCT die eindeutigen Preise für die 3 Produkte. Das Statement muss von unten (Inputtabelle hat 4 Zeilen*3 Spalten) nach oben  (Ergebnistabelle hat 3 Zeilen*2 Spalten) gelesen werden.

Es gibt jedoch einen Fall den man genauer betrachten muss: LOAD DISTINCT in Kombination mit JOIN bzw. CONCATENATE:

Ergänzt man das Skript um einen Left Join auf die Faktentabelle, sieht das Skript folgendermaßen aus:

Facts:
LOAD * INLINE [
Year, Product, Quantity
2013, ProductA, 500
2013, ProductA, 500
2013, ProductB, 300
2012, ProductA, 700
2012, ProductB, 400
];

left join (Facts)
Load
Distinct
Product,
Price;
LOAD * INLINE [
Product, Price, Variante
ProductA, 100, X
ProductA, 100, Y
ProductB, 10, A
ProductC, 700, A
];


Liest man das Skript nach den genannten Regeln, würde man folgendes Join-Verhalten erwarten:
  • (Schritt -1: Die Faktentabelle wird  mit 5 Zeilen geladen)
  • Schritt 0: Die Produkttabelle wird mit 4 Zeilen INLINE geladen
  • Schritt 1: Load Distinct reduziert die Produkttabelle auf 3 Zeilen
  • Schritt 2: Der Left Join beläst per Definition die Faktentabelle (linke Tabelle) gleich und ergänzt die passenden Preise aus der Produkttabelle (rechten Tabelle).
Symbolische Darstellung des "zu erwartenden" Verhalten

Als Ergebnis würde man sich also eine Quantity von (500+500+300+700+400) = 2400 erwarten.

Lässt man das Script aber in QlikView laufen, erhält man überraschenderweise ein Chart mit der Quantity 1900:


Quanity für ProductA ist 2013 nur 500
Was ist passiert? Die Quantity für ProductA ist im Jahr 2013 nur 500, statt der ursprünglichen 1000 aus der Faktentabelle. Die Faktentabelle enthält auch nur 4 statt der ursprünglichen 5 Zeilen. Es scheint also, als ob der LEFT JOIN Einfluss auf unsere Faktentabelle genommen hat.

Betrachtet man das Ergebnis genauer, so ist es nicht der LEFT JOIN, sondern vielmehr das Keyword DISTINCT auf der Produkttabelle das Schuld an unserem fehlenden Datensatz ist. Das DISTINCT hat nicht nur Einfluss auf die geladene Produkttabelle, sondern reduziert auch alle Einträge in der Faktenabelle auf eindeutige Werte.  


Beim Lesen eines QlikView Skrips muss also folgende zusätzliche Regel beachtet werden:


DISTINCT wird in QlikView nicht auf die Inputtabelle angewandt, sondern am auf die gesamte, geladene Tabelle! Wird eine Tabelle also einmalig als DISTINCT markiert (direkt oder indirekt [durch Join/Concatenate]) sind die Zeilen diese Tabelle in allen weiteren Operationen IMMER DISTINCT!

Um aus der ursprünglichen Faktentabelle nicht "versehentlich" Zeilen zu entfernen, benötigen wir somit eine Zwischentabelle. Das Skript sieht dann folgendermaßen aus

FixFacts:
LOAD * INLINE [
FixYear, FixProduct, FixQuantity
2013, ProductA, 500
2013, ProductA, 500
2013, ProductB, 300
2012, ProductA, 700
2012, ProductB, 400
];

Temp:
Load
Distinct
FixProduct,
FixPrice;
LOAD * INLINE [
FixProduct, FixPrice, FixVariante
ProductA, 100, X
ProductA, 100, Y
ProductB, 10, A
ProductC, 700, A
];

left join (FixFacts)
load
*
resident Temp;

drop table Temp;
 
 



Quantity 2400 als korrektes Ergebnis


Hier klappt es nun wie erwartet, weil nur die "Temp"-Tabelle mit dem Keyword DISTINCT markiert wurde. Die "FixFacts" Tabelle ist an keiner Stelle mit dem Keyword DISTINCT versehen. Somit bleibt das ProduktA im Jahr 2013 mit einer Quantity von 500 zweimal in der Tabelle erhalten.

Ein zweites Szenario wo man dieses Verhalten manchmal unabsichtlich auslöst, ist der Befehl CONCATENATE. Das Skript unterhalb löscht Zeilen aus meiner Istdaten-Tabelle "ConcatFacts", obwohl ich eigentlich nur die Plandaten DISTINCT daran "anhängen" wollte:

ConcatFacts:
LOAD * INLINE [
CYear, CProduct, CQuantity
2013, ProductA, 500
2013, ProductA, 500
2013, ProductB, 300
];

//Append Plan Data
concatenate(ConcatFacts)
LOAD distinct * INLINE [
CYear, CProduct, Plan
2013,ProductA, 900
2013,ProductA, 900
2013,ProductB, 200
]; 
 
Ist-Quantity von ProduktA ist nach CONCATENATE & DISTINCT nur 500

Auch hier hilft wieder der Umweg über eine temporäre "DISTINCT"-Tabelle
FixConcatFacts:
LOAD * INLINE [
CCYear, CCProduct, CCQuantity
2013, ProductA, 500
2013, ProductA, 500
2013, ProductB, 300
];

//Append Plan Data
Tmp:
LOAD distinct * INLINE [
CCYear, CCProduct, CCPlan
2013,ProductA, 900
2013,ProductA, 900
2013,ProductB, 200
];

Concatenate(FixConcatFacts)
load
*
Resident Tmp;

drop table Tmp;


Quantity 1000 für ProductA als korrektes Ergebnis


Zuletzt hatten wir dieses "Phänomen" am MasterSummit for QlikView diskutiert. Das Verhalten ist zumindest seit QlikView 8.* (meiner ersten QlikView Version) konsistent. Falls Sie diese Eigenschaft von DISTINCT noch nicht kannten, und Ihnen in Ihren Skripten Datenzeilen abgehen, durchsuchen Sie Ihre QlikView Applikationen nach den beschriebenen Mustern! Das komplette Beispiel zu diesem Blogeintrag findet sich unter http://www.heldendaten.eu/blog/DistinctVerhalten.zip




Karten in QlikView & A brief history of time

$
0
0

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.



  





Dublicate Checker - Datenbereinigung mit QlikView

$
0
0
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 ;-)





Qlikview - Poor man's Print & Scroll Up Extension

$
0
0
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.

QlikView /NoData im Contextmenü - Rightqlik

$
0
0
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




Gaps und Abweichungen in QlikView - Zwei Darstellungen

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

Bessere Publisher Alarme & neuer "Getting Started Excel Wizard" in QlikView 11.20 Service Release 6

$
0
0
Letzte Woche ist das QlikView 11.20 Service Release 6 erschienen. Neben Bugfixes, Win2012R2-Support und einer neuen Startseite im QlikView Developer, stellt dieses Release zwei neue Dinge bereit die wir hier genauer besprechen wollen!

Bessere Publisher Alarme

Schlägt eine Publisher-Task fehl, lassen Sie sich hoffentlich schon heute eine Alarm-Email zustellen. Mit den neuen Tags [TaskLogHyperlink],[DocumentLogHyperlink]  und [DocumentLog] kann diese Email aussagekräftiger gestaltet werden. Da laut Releasenotes diese Tags in bestehenden Installationen nicht automatisch gesetzt werden, schlagen wir allen bestehenden Installationen vor nach dem Upgrade auf SR6 in der QlikView Management Console das Email-Template für Alert Emails wiefolgt abzuändern:


 Folgende Erklärung der neuen Tags in den ReleaseNotes
[TaskLogHyperlink] - Creates a hyperlink to the task log in HTML, writes the full path to the task log in
Plain
[DocumentLogHyperlink] - Creates a hyperlink to the document log in HTML, writes the full path to the
document log in Plain
[DocumentLog] – Adds the line of the error in the document log along with the line number. E.g Line 45 -
Error: <error message>

 Die neue Information in der AlertEmail sieht dann exemplarisch so aus:

Neuer "Getting Started-Excel Wizard"

Service Release 6 hat neben einer neuen Startseite auch einen neuen "Excel Wizard" bekommen. Mit der QlikView Personal Edition kam immer schon ein Wizard mit, der es erleichtern soll sein erste QlikView Applikation auf Basis einer Excel-Tabelle zu erstellen.

Der alte Wizard war - sagen wir es vorsichtig - altbacken, weswegen ich zumeist vorschlug ihn in den Benutzereinstellungen zu deaktivieren.

Der alte "altbackene" Getting Started-Wizard

Der neue Wizard ist Qlik aber sehr gut gelungen! Er hat zwar genaugenommen sogar weniger Funktionalität als der Alte (zB. kann man nun keine Pivot mehr bauen) - aber das ganze Look&Feel plus das resultierende Ergebnis sehen viel besser aus. Also für all jene, die den Wizard deaktiviert hatten und QlikView Skripte nicht zum Frühstück lesen -  geben Sie ihm mit QlikView 11.20SR6 eine neue Chance!

Einstellungen|Benutzereinstellungen "Getting Started-Assistent" wieder aktivieren


Unterhalb ein paar Screenshots wie der neue Wizard aussieht! Ich denke das wird vielen Personen den Einstieg in QlikView erleichtern, ohne eine Zeile Skript geschrieben zu haben!

Wähle Excel Datenquelle
Vorschau der Exceldaten + Spaltenbeschriftungen

.qvw abspeichern

Erstes Chart bauen

Kreisdiagramm: Dimension und Aggregationsformel definieren

Balkendiagramm: Dimension und Aggregationsformel definieren

Liniendiagramm: Dimension und Aggregationsformel definieren

Listboxen oder Tabellenbox definieren

Die fertige Applikation inklusive Auswahlbox und globaler Suche





qvheroes.com - Die besten Blogs über QlikView

$
0
0
Seit ich 2008 zur QlikTech gestoßen bin, ist die Qlik Community immens gewachsen. Wie kann man den Überblick bewahren und immer am aktuellen Stand bleiben? qvheroes.com zeigt die Artikel der interessantesten und lehrreichsten QlikView Blogs und liefert eine Volltextsuche über alle Beiträge zurück bis 2009!

qvheroes.com - Die besten Blogs über QlikView

Die QlikCommunity müsste mittlerweile laut Qlik über 100.000 registrierte User haben. Unter diesen Usern gibt es eine handvoll Experten die regelmäßig spannende &  inspirierende Blogbeiträge zu QlikView Themen veröffentlichen.  qvheroes.com ist die zentrale Anlaufstelle um all diese Einträge auf einem Blick zu lesen.


qvheroes.com - Webseite, Volltextsuche und Newsfeed

Als Google den GoogleReader im Juli 2013 einstellte, ging ein Raunen durch das Internet, und Google war ein weiteres mal "Evil" geworden. Mein liebster RSS-Reader musste also durch Feedly ersetzt werden, das zwar am IPAD ganz nett ist, mich aber nie so richtig vom Hocker hauen konnte!

Meine geschätzten Kollegen bei Heldendaten haben nun für QlikView Abhilfe geschaffen: qvheroes.com zeigt die Blogeinträge der lesenswertesten QlikView Blogs auf einer einzigen Webseite an, und erlaubt diese Artikel auf Jahre zurück zu durchsuchen! Einen RSS-Feed gibt es natürlich auch: http://qvheroes.com/feed  - und selbstverständlich ist auch unser eigener Blog auf qvheroes vertreten :)

qvheroes.com - Aktuelle Beiträge




qvheroes.com - Volltextsuche


Danke an Thomas Baldinger für die federführende Umsetzung, und viel Spaß beim Lesen und Durchforsten der gesammelten Beiträge der QlikView Heroes!




Mindmap - How to become a QlikView Infrastructure Expert

$
0
0
Nach den Mindmaps zum Thema "How to become a QlikView Script Expert" und "How to become a QlikView Design Expert" letztes Jahr, poste ich heute das dritte Mindmap dieser Serie: "How to become a QlikView Infrastructure Expert".


Themastisch gliedert sich dieses Mindmap in folgende Themengebiete:

  • Deployments: Clustering, DMZ, Monitoring, Features
  • Architecture 
  • Security: Authentication, Authorization, QlikView Protrokolle
  • Hardware Sizing
  • Performance
  • Software: Betriebssysteme & Tools
  • Licensing
  • Where to get Information from
  • Clients: AJAX (Full Browser Version), IEPlugin
  • SDK APIs: Management API; Extensions
  • Network Components
Hat man nur einen einzelnen QlikView Server mit ActiveDirectory Authentifizierung, dann kommt mit der QlikView Server Installation alles Out of the Box. Falls Sie aber soetwas wie einen geclusterten QlikView Server mit LDAP Usern im Extranet auf IPAD-Clients inklusive Offline-Funktionalität  haben: dann viel Spaß  mit diesem Mindmap!

Das .pdf mit dem gesamten Mindmap finden Sie hier!

    Copy to Clipboard Document Extension for QlikView

    $
    0
    0
    Copy&Paste in die Zwischenablage wurde 1974 - also vor 40 Jahren - von Xerox erdacht und entwickelt. Seither sind wir es gewohnt Werte, Zeichen, ja ganze Dateien von Applikation A nach Applikation B zu kopieren (selbst  kreuz&quer über mehrere Server via Remote Desktop Sessions).

    Mittlerweile schreibt es das Jahr 2014. Microsoft Office 365 läuft im Webbrower. 3D-Engines laufen ohne Plugin im Firefox.  Kann eine Webseite automatisch Werte in die lokale Zwischenablage kopieren? Nein (was aus Securitygründen vielleicht gar nicht schlecht ist). Gibt es einen Webstandard für das Clipboard? Jein."Clipboard API and events" ist momentan ein Workingdraft der W3C. Gibt es Workarounds für aktuelle Browser: eine Menge :)

    Vielleicht haben Sie im QlikView Full Browser (AJAX) Client auch schon einmal die Funktion
    Rechtsklick>In die Zwischenablage kopieren>Wert der Zellegesucht um zB einen Kundennamen oder eine Bestellnummer in die Zwischenablage zu kopieren?  Was im QlikView Developer/IEPlugin selbstverständlich ist, geht in einer modernen Webapplikation nicht ohne weiteres.

    Was im installierten Plugin selbstverständlich ist,  ist in Webapplikationen gar nicht einfach

    Dass eine Webseite nicht einfach über Javascript Werte in die Zwischenablage kopieren kann, ist bei näherer Betrachtung sogar sinnvoll. Nur weil ich irgendeine Seite im Internet ansurfe, soll diese nicht ohne jegliche Userinteraktion die lokale Zwischenablage programmatisch befüllen dürfen.

    Für Applikationen wie dem QlikView Fullbrowser Client ist das aber schade. Oft will man einen einzelnen Zellwert in die Zwischenablage kopieren um zB im Vorsystem eine Bestellnummer oder eine Kundennummer zu suchen. Da der Rechtsklick in QlikView mit einem eigenen Contextmenü überlagert ist, greift nichtmal das normale Contextmenü des Webbrowsers. Eine Anfrage beim QlikTech Support bestätigt unsere Vermutung: momentan gibt es keine Copy&Paste Funktionalität für diesen Client. Daten müssen zuerst nach Excel exportiert werden um sie weiterverarbeiten zu können. In den aktuellsten QlikView-Versionen werden Tabellenzellen sogar explizit mittels unselectable="on" markiert.

    unselectable="on" im QlikView Code

    HD Copy Cell Document Extension

    Herausforderung angenommen! Der  QlikView Webclient lässt sich seit Version 11 mittels Document Extensions erweitern. Kann man also mittels solch einer Erweiterung die Zwischenablage nicht doch befüllen?

    Ein paar Stunden später, und nach dem Durchwühlen zahlreicher Internetforen gibt es folgende Workarounds:

    1) Internet Explorer unterstützt ein Javascript Objekt um programmatisch das Clipboard zu schreiben.
    2) Andere Browser können mittels (aktiviertem) Flash & Userklick die Zwischenablage befüllen
    3) Wenn kein Internet Explorer und kein Flash (zB am IPAD), dann hilft nur ein "Promptdialog".

    Internet Explorer mit aktiver Document Extension

    Chrome mit deaktiviertem Flash > Copy Mode mit Prompt

    Die Document Extension aktiviert sich mittels gedrückter "CTRL" Taste im linken unterem Eck des Browser Fensters. Benutzen Sie Internet Explorer, so reicht ein Rechtsklick auf die gewünschte Zelle und der Wert landet in der Zwischenablage. Mittels Flash müssen Sie zusätzlich den Button "Copy to Clipboard" drücken. Wenn kein Flash aktiv ist, bekommen Sie das Popup vom Screenshot überhalb und müssen dann nochmals CTRL+C klicken.

    Folgendes Video zeigt nochmal Optionen 1+2:


      

    Dokumentation&Allerlei

    - Die Document Extension finden Sie als .zip unter: content.heldendaten.eu. Bitte in .qar umbenennen.

    - Um die Document Extension in der .qvw zu aktivieren, die .qar im Developer durch Doppelklick registrieren und in den Dokumenteneinstellungen hinzufügen



    - Um die Document Extension am QlikView Server zu aktivieren müssen Sie die Datei Server unter C:\ProgramData\QlikTech\QlikViewServer\Extensions\Document\ entpacken




    - Um Flash am QlikView Webserver zu aktivieren habe ich den MIME-Typ eingetragen



    - Getestet mit QVS 11.20SR5. Kein Support & keine Garantie das diese Extension in zukünftigen QVS-Versionen funktioniert.

    - Danke an Daniel Rozental der in der QlikCommunity eine Object-Extension zu dem Thema gepostet hat http://community.qlik.com/docs/DOC-5045 welche ich als Ausgangspunkt heranziehen konnte

    - Manchmal aktiviert die CTRL-Taste die Document Extension nicht. Stellen Sie sicher, dass das Browserfenster den Fokus hat, und Sie nicht über einer Pivot-Tabelle etc. stehen!

    Summer of Releases - Roambi for Android & Qlik Sense

    $
    0
    0
    Knapp bevor die meisten auf ihre wohlverdiente Sommerfrische entweichen, gibt es gleich zwei spannende neue Releases, die die Inhalte auf diesem Blog in Zukunft sicher mitbestimmen werden: Roambi for Android und Qlik Sense.

    Wer ein supportes Android 4.4 Handy zu Verfügung hat, findet im Google Playstore Roambi 1.0 für Android. Der erste Release enthält vier Views: Card, Catalist, Layers, Superlist. Ich hoffe die anderen Views und Roambi Flow folgen bald!

    Roambi Analytics on Android

    In alter Tradition gibt es von Qlik die Personal Edition von Qlik Sense Desktop 0.96 zum gratis Download. Auf unserer Webseite haben wir ein Video für die ersten Schritte verlinkt.
    Qlik Sense Desktop


    Viel Spaß beim Ausprobieren & einen erholsamen Sommer!


    Qlikview: Understanding Of Charts - Line/Bar/Combi

    $
    0
    0
    Ich hoffe Ihr Verständnis für Charts ist besser als dieses Bild, das Ron Gilbert diese Woche auf seinem Blog gepostet hat:
    http://grumpygamer.com/understanding_of_charts
    Ein Chart, oder doch eher eine Monkey Island Schatzkarte?
    Trotzdem gibt es in QlikView eine scheinbare Seltsamkeit: Warum gibt es ein Balkendiagramm und ein Liniendiagramm wenn es doch sowieso das Kombi-Diagramm gibt?  Ein Kombi-Diagramm funktioniert doch als Superset über die beiden anderen Diagramme, kann man doch pro Expression entscheiden ob man eine Linie, einen Balken oder Punkte sehen möchte.

    Drei Charttypen für eine Lösung?

    Natürlich gibt es einen Grund. Der Grund ist subtil, aber für die Entwicklung von interaktiven QlikView-Anwendungen durchaus wichtig. Die folgenden zwei Beispiele sollen Ihnen helfen das jeweils richtige Chart zu wählen!


    Brush & Link zum Ländervergleich  - Linien vs. Kombi

    Eine typische Darstellung ist die Umsatzentwicklung für Länder über die Zeit. Für solche Darstellungen wählt man gerne ein Liniendiagramm. Genauso gut hätten wir aber ein Kombi-Diagramm wählen können! Hätten wir? Naja, initial sehen beide Charts jedenfalls exakt gleich aus:


    Der Unterschied wird mit der Anforderung, die wir oberhalb der Charts lesen können, wirksam:

    "Der Anwender will Ausreißer mit einem Klick im Chart selektieren können, und weiterhin im  Monats-Verlauf Bezug auf die anderen Ländern nehmen!"

    Selektieren wir zB im April die Ausreißerländer, bemerkt man den Unterschied. Zieht man im Liniendiagramm einen Selektionsrahmen, verhält sich das Liniendiagramm wie gewünscht. Wir sehen die drei Länder mittels Brush&Link hervorgehoben. Die Auswahlbox zeigt die drei ausgewählten Länder "Deutschland, Österreich, USA" an.

    Liniendiagramm- Selektion im Chart wählt nur die zweite Dimension "Land"

    Machen wir die gleiche Selektion im Kombi-Diagramm, so werden nicht nur die Länder, sondern auch der Monat "April" selektiert. Damit verliert man den Bezug zu den restlichen Monaten und sieht nur noch ein Chart mit Punkten (weil es nur ein Monat gibt).

    Kombidiagramm - Selektion im Chart wählt Dimension "Monat" und "Land"
    In dieser Situation ist also das Liniendiagramm die richtige Wahl. Dass das Kombidiagramm nicht immer schlechter sein muss, zeigt aber das nächste Beispiel.


    Graphisches Filtern auf Detaildaten - Balken vs. Kombi

    Die Ausgangssituation in diesem Beispiel ist gleich wie oberhalb. Wir wollen wieder den Umsatz pro Monat und Land auftragen. Diesmal stellt uns der Benutzer jedoch die Anforderung"die Bestelldetails-Tabelle mit einem Klick in der Graphik auf Monat & Land filtern".

    Hier wählen wir als Darstellung ein Balkendiagramm und ein Kombi-Diagramm. Beide sehen initial wieder gleich aus. Der Tooltip zeigt uns netterweise schon  für "Monat = Juli und Land = Österreich" einen Umsatz von 5.791,75€.  Wenn man nun auf diese Segment klickt (oder Rahmen zieht), erwartet der Benutzer in der Tabelle "Bestelldetails" nur noch genau jene Bestellnummern, die genau zu diesem Betrag führen.

    Balken- vs. Kombidiagramm um die Tabelle unterhalb zu filtern
    Wie verhalten sich nun die zwei Diagrammtypen? Das Balkendiagramm ist hier nicht ideal: obwohl der Tooltip das Segment anzeigt, führt eine Selektion im Chart nur auf die Selektion des Monats "Juli", wodurch die Detaildarstellung noch immer mehr als 42.000 € anzeigt.
    Anstatt auf 5.791,75 € zu filtern, sieht man bei Selektion im Balkendiagramm noch immer den Gesamtumsatz für Juli
    In diesem Fall ist das Kombi-Diagramm die richtige Wahl. Die Selektion des Segments wählt sowohl den Monat "Juli" als auch das Land "Österreich". Das führt zu einer gefilterten Detailtabelle, die nur noch die gewünschten Bestellungen mit einem Gesamtbetrag von 5.791,75€ anzeigt.

    Kombi-Diagramm -  Ein Klick filtert beide Dimensionen, was zu einer gefilterten Detailtabelle führt

    Conclusio

    Die eigentliche Darstellung von Kombi-Diagramm und  Balken/Liniendiagramm ist gleich. Der Unterschied tritt erst auf, wenn man zwei Dimensionen hat und der Benutzer direkt im Chart selektiert.

    Zu finden ist die Beschreibung dieses Unterschied übrigens auch im QlikView Reference Manual Kapitel "49.2 Selections in Charts and Tables". Es gibt also doch gute Gründe für diese drei Diagrammtypen :)

    Note!
    Selections made directly in line charts and bar charts (not combo chats) showing more than one dimension will primarily apply to just one dimension. Selections In line charts primarily apply to the second dimension so that painting over a line selects the entire line over all x-axis dimension values. In bar charts the opposite applies, i.e. selections primarily apply to the first dimension.


    Die .qvw zum Selbstprobieren finden Sie unter content.heldendaten.net.


    Lessons Learned 2014 - Alterspyramide Darstellung

    $
    0
    0
    Vor längerer Zeit wurde ich gebeten eine Altersstrukturüber die Konzernmitarbeiter in QlikView darzustellen. Eine gut zu lesendes Chart dafür ist eine Alterspyramide, bei der die Altersstruktur getrennt nach Frauen und Männern auf zwei Seiten dargestellt wird. Ein schönes Beispiel dazu findet man online bei Statistik Austria.

    Bevölkerungspyramide von Österreich und Wien
    Im QlikView Script habe ich mir dafür ein eigenes Feld "Altersklasse" vorbereitet.

    Load
    *,
    dual(replace(class(Alter,5),'<= x <','-'),class(Alter,5)) as Altersklassen;
    LOAD
    age(today(),Geburtsdatum) as Alter,
    Geburtsdatum,
    Nachname,
    Vorname,
    Geschlecht
    FROM
    Personal.csv
    (txt, codepage is 1252, embedded labels, delimiter is ',', msq);

    Die selten genutzte Funktion age() rechnet das Alter einer Person zum heutigen Tag today() aus. Class() wird benutzt um das Alter der Personen in 5-Jahres-Scheiben zu gruppieren. Da die Class()-Funktion wenig elegant die Textsyntax 30 <= x < 35 liefert, geht man am besten noch mit einem String-Replace() auf die schönere Darstellung 30-35.

    Um das Chart zu bauen, benutzt man am besten ein gestapeltes Kombichart in horizontaler Ausrichtung. Das Chart benötigt 2 Dimensionen: Altersklasse und Geschlecht sowie eine Expression.

    Kombi Diagramm, Ausrichtung Horizontal und Subtyp Gestapelt

    Wer die Formel unterhalb liest, der sieht, dass das weibliche Geschlecht mit einem negativen Vorzeichen versehen wird. Das ist natürlich nicht sehr gentlemanlike, und führte im Projekt - höflich ausgedrückt - eher zu einer Ablehnung dieses Charts.
    "Minus"-Frauen kommen nicht gut an!

    Nachdem in letzter Zeit in der QlikCommunity viel über Unicode und Numberformat diskutiert wurde, nahm ich mich des Problems wieder an, und suchte die Männlich- und Weiblich-Unicodezeichen heraus.

    Hinterlegt man bei der Formel folgenden Zahlencode

    ♂#.##0;♀#.##0

    so löst man das Problem. Der erste Zahlencode wird für positive Werte (in diesem Fall männlich), der zweite Zahlencode für negative Werte (in diesem Fall weiblich) angezeigt. Das Chart zeigt  nun die Werte deutlich höflicher an!


    Das komplette Beispiel findet sich hier zum Download.

    QlikSense Map Objekt

    $
    0
    0
    Eine schöne Neuerung von QlikSense ist die Integration eines eigenen Map/Landkarten-Objekts. Das neue Objekt kann sowohl Flächen als auch Punkte auf Karten anzeigen und einfärben. Als Grundlage für Flächen dient die aus Google Earth bekannte .kml-Datei. Die Hintergrund-Landkarten kommen von Tileservern wie zB Open Street Map.

    Karten gab es in QlikView schon immer. Wie in diesem Blogbeitrag beschrieben war es jedoch ein wenig Hokuspokus (oder eine Extension) um das Ergebnis zu erzielen. In QlikSense gibt es nun ein Kartenobjekt, das sich mittels weniger Klicks zu einer aussagekräftigen Karte aufbauen lässt.

    Flächenfärbung

    Für die Flächenfärbung benötigen Sie ein .kml (bzw. ein entpacktes .kmz) File der gewünschten Region. Die Seite data.gv.at  soll uns hier hilfreich sein um zB die Bezirke von Wien darzustellen.

    Das Map Objekt - Schritt für Schritt

    Zieht man die .kml-Datei mit Drag&Drop in QlikSense, wird diese als Geo-Daten erkannt. Der Preview zeigt die Polygon-Definition der Bezirksgrenzen im Feld WienBezirke.Area.

    Wird das .kml erkannt (was bei komplexen .kmls momentan leider nicht immer der Fall ist), geht die restliche Objekt-Erstellung Schlag auf Schlag:

    1) QlikSense Skript laufen lassen und in den Design-Modus wechseln

    2) Das Map-Objekt auf die Layoutfläche ziehen

    3) QlikSense fragt nun nach der Dimension des Kartenobjekts. Das ist in unserem Fall das Feld WienBezirke.Name. Zieht man das Feld mittels Drag&Drop auf die Karte, erscheinen die Bezirksgrenzen von Wien in blau.



    4) Wer das nicht glaubt, kann optional als Hintergrund noch eine Landkarte einblenden. QlikSense liefert hier keinen fixen Kartenanbieter mit, sondern bietet eine Auswahl verschiedenster Tileserver. Einfach die URL für zB Open Streetmap "http://tile.openstreetmap.org/${z}/${x}/${y}.png"  aus der Online-Hilfe kopieren, Zuordnung eintragen, und das Ergebnis sieht folgendermaßen aus:

    Datenmodellierung

     Was nun noch fehlt ist eine Kennzahl auf der Karte: Von der Webseite der Stadt Wien kann man sich ganz gut Kennzahlen über die einzelnen Bezirke schnappen:

    https://www.wien.gv.at/statistik/lebensraum/tabellen/nutzungsklassen-bez.html

    Der QlikSense Script Editor hat hier noch nicht  alle graphischen Optionen von QlikView um Daten zu transformieren, versteht aber alle QlikView Skriptparameter. Unser Tipp ist hier also folgender: Daten mit QlikView laden, Filter anwenden und dann das Skript in QlikSense einfügen - dann klappt es auch die ersten Zeilen korrekt rauszufiltern.

    LOAD
    num(num#(subfield(Bezirk,'.',1)),'###0') as %BezirkNr,
    Bezirk,
    "Bauflächen in ha" as Gesamtfläche,
    "Bauflächen in ha1" as Wohnbaugebiete,
    "Bauflächen in ha2" as Einrichtungen,
    "Grünflächen in ha",
    "Gewässer in ha",
    "Verkehrs-flächenin ha" as [Verkehrsflächen in ha]
    FROM [lib://Wien Daten]
    (html, codepage is 1252, embedded labels, table is @1,filters(
    Remove(Row, Pos(Top, 2)),
    Remove(Row, Pos(Top, 2))
    ));

    Die Schlüssellogik bleibt wie immer bei den Qlik-Produkten: sowohl Karte als auch Kennzahlen müssen sich über einen gleichnamigen Schlüssel - hier %BezirkNr - verbinden.  Das Datenmodell sieht dann wiefolgt aus.


    Das fertige Layout

    Sie wollen nach Wien ziehen und wissen welcher  Bezirk wieviel "Grünfläche" hat? Innerhalb des Gürtels, oder doch nach Ottakring oder Liesing? Als Ergebnis kann man in QlikSense nun folgende Darstellung bauen.



    Die komplette QlikSense Applikation finden Sie hier.

    Punkte auf der Landkarte

    Um Städte auf der QlikSense Map darzustellen geht man ganz ähnlich vor. Voraussetzung hier ist, dass Sie zu dem Ort eine Latitude und Longitude Angabe vorliegt. Ich habe hier eine bestehende .qvd aus QlikView genutzt, ansonsten wäre zB Google Maps eine brauchbare Hilfe!

    Cities:
    LOAD * INLINE [
    Ortschaft
    Grödig
    Stockerau
    Hollabrunn
    Retz
    Baden
    ];

    inner join (Cities)
    Load
    *,
    GeoMakePoint(latitude,longitude) as GeoPoint2;
    LOAD
    PLZOrtschaft,
    num(num#(latitude,'# #00.0000000','.','')) as latitude,
    num(num#(longitude,'# #00.0000000','.','')) as longitude,
    Ortschaft,
    GEMNAM
    FROM [lib://post.at PLZ Feb 2009/geoATFinal.qvd]
    (qvd);

    QlikSense kommt mit einer neuen Geo-Funktion GeoMakePoints um die Koordinaten-Angaben in das richtige Format umzuwandeln! Stellen Sie auch sicher, das die Funktion mit korrekt formatierten Nummern aufgerufen wird (nicht mit dem amerikanischen Punkt als Dezimalseperator)!

    Ist das Skript geladen, geht man ganz ähnlich vor:

    1) Map Objekt auf das Layout ziehen
    2) Feld "Ortschaft" auf die Karte ziehen
    3) Open Street Map für als Hintergrund einfügen




    Fügt man nun noch eine Kennzahl ein, kann man die Punkte in den Optionen unter "Farben und Legenden" entsprechend "nach Kennzahl" färben.



    Qlik Cloud

    Ein kleiner Tipp am Rande: Wer seine Ergebnisse mit bis zu 3 Kollegen teilen möchte, kann das Beta-Programm von QlikCloud testen. Einloggen, .qvf hochladen und an bis zu drei Emailadressen Einladungen schicken.


     



    Happy Holiday mit QlikView - Feiertage aus dem Internet holen

    $
    0
    0
    Bevor alle in den wohlverdienten Weihnachtsurlaub entschwinden, hier noch ein kleines Skript um die Feiertage für die kommenden Jahre automatisiert in QlikView zu laden - sei es für die Planung Ihrer Produktionskennzahlen, für Ihre Vertriebsanalyse - oder schlicht und ergreifend um Ihrer ganz persönlichen langen Wochenenden mit QlikView zu planen!

    QlikView bietet mit Lunar-Funktionen (LunarweekEnd, LunarWeekName, LunarWeekStart - siehe QlikView Hilfe) einige Möglichkeiten um Mondwochen-basierte Feiertage wie den Ostermontag berechnen zu können. Auch die Funktion networkdays hat einen dritten Parameter um "holiday"-Tage herausrechnen zu können. Spätestens bei nationalen Feiertagen, ist es aber am Besten einen fertigen Feiertagskalender zu befragen. Die Seite http://www.feiertage-oesterreich.at bietet eine schöne Übersicht über die gesetzlichen Feiertage in Österreich.


    In QlikView lässt sich diese Seite gut abgreifen, und liefert momentan die Feiertage bis ins Jahr 2016. Speichert man das Skript-Ergebnis als .csv-Datei und fügt es in seinen Masterkalender hinzu, kann man in den QlikView-Applikationen die Feiertage als zusätzlichen Filter anbieten.


    for i = 2013 to 2016
    Feiertage:
    LOAD
    Datum,
    Feiertag
    FROM
    [http://www.feiertage-oesterreich.at/$(i)/]
    (html, codepage is 1252, embedded labels, table is @1) where len(F5) > 0;

    next

    store Feiertage into Feiertage.csv(txt);


    Für 2015 sieht das dann, aufgetragen auf ein kontinuierliches Kombidiagramm mit Färbung für die Wochentage folgendermaßen aus:


    Wer sich also schon vor den Weihnachtsfeiertagen 2014 mit den nächsten beiden Jahren auseinandersetzen möchte, findet die .qvw  inklusive Skript und Layout hier zum Download! Wir wünschen schöne Feiertage, einen guten Rutsch & bis nächstes Jahr!

    Where is my License Lease Information?

    $
    0
    0
    Wie hier berichtet, gibt es seit QlikView 11.20SR6 eine neue Startseite. Seither werden wir häufig gefragt, wo denn die License Lease Information im QlikView Developer hinverschwunden ist!

    Zur Erinnerung, in QlikView 11.00 bis QlikView 11.20 SR5 stand diese Information stets mittig auf der Startseite.

    License Lease einer Named CAL von meinem Qlikview Server hd_rva_01
    Durch die Neustrukturierung seit QlikView 11.20SR6 ist diese Information jetzt ein wenig versteckt: man muss im grauen Balken "Resources" auf den Link "License information" klicken und bekommt dann ein Popup mit den gleichen Informationen wie früher.



    Wer QlikView in deutscher Sprache startet, heißen die Menüeinträge ein wenig anders: der graue Balken ist mit "Links" beschriftet, der Link heißt "Lizenzinformationen". Siehe Screenshot unterhalb.


    Zum Jahreswechsel: Achtung bei Kalenderwochen-Analysen!

    $
    0
    0
    Wer sich über die schlechten Umsätze in der ersten Kalenderwoche 2015 wundert, kann das den günstig gefallenen Fenstertagen (oder wie man in Deutschland sagt: "Brückentage") zuschreiben. Man sollte aber auch einen Blick auf sein QlikView-Skript werfen!

    Hat man in seinem Masterkalender die unscheinbare Skriptzeile

        Week(Datumsfeld)&'-'&Year(Datumsfeld) AS [Eindeutige Woche]

    definiert, dann hat die erste Kalenderwoche 2015 nur 4 Tage. Der Grund: Die KW 1 2015 geht von 29.12.2014 bis 04.01.2015. Drei Tage des Jahres 2014 gehören also in die erste Kalenderwoche von 2015. Definiert ist diese ganze Kalenderwochenlogik in der ISO8601, und - wie man hier nachlesen kann - prinzipiell verhält sich QlikView auch nach diesem Standard.


    Das Problem

    Anbei ein anschauliches Beispiel: wir arbeiten für ein Unternehmen, dass an jedem Kalendertag genau 100 EUR Umsatz macht.  Entsprechend würden wir auch erwarten, dass in jeder Kalenderwoche genau 700 EUR Umsatz aufsummiert werden können.

    Unser Datentopf: jeden Tag 100 EUR Umsatz macht eine hübsche Gerade

    Benutzen wir die oben erwähnte Formel für die Kalenderwoche, sehen wir aber, dass in den letzten Jahren einige Wochen mit 800  EUR (also 8 Tagen), und dieses Jahr die KW 1 mit nur 400 EUR (also nur 4 Tagen) existiert.


    Der Grund wird klar, wenn man sich die Datumswerte zum Jahreswechsel ansieht. Die Tage 29. bis 31.12.2014 werden von der week()-Funktion nach ISO8601 in die KW1 gesetzt, aber da die Year()-Funktion das Kalenderjahr nimmt, landen diese 3 Datensätze fälschlicherweise in der Kalenderwoche "1-2014".

    1-2014 ist die falsche KW für diese 3 Tage

     

    Die Weekyear() - Funktion

    Um das Problem zu lösen, bietet sich die Funktion weekyear() an, die genau diese Ungereimtheiten löst und für die drei Tage das Jahr der Kalenderwoche liefert.

    Week(Datumsfeld)&'-'&WeekYear(Datumsfeld) AS [Eindeutige Woche]

    Weekyear() schiebt die 3 Tage ins Jahr 2015

    Entsprechend sieht das Chart dann auch wie ursprünglich erwartet aus: jede Woche hat 700 EUR Umsatz, weil jede Woche aus 7 Tagen besteht.


    Wer bisher schon die Weekname ()- Funktion benutzt hat, war auf der sicheren Seite. Nur das Format "YYYY/WW" ist nicht jedermanns Sache. Um also ein frei formatierbares Wochenfeld zu haben, dass sich auch gut numerisch sortieren lässt, schlagen wir folgende Felddefinition vor:


    dual(
    Week(Datumsfeld)&'-'&WeekYear(Datumsfeld),
    num(weekname(Datumsfeld))
    )
    AS [Eindeutige Woche]

    Das komplette Beispiel findet sich hier!








    QlikView 11.20 SR10 - Pie Chart Feature "Sector Outline"

    $
    0
    0
    Welcher Charttyp wann sinnvoll ist, ist am neuen QlikView Blogin diesem PDF beschrieben. Das ein Kreisdiagramm sich vor allem für ein "simple share of total" eignet, ist dem kritischen Daten-Visualisierer schon länger bewusst, ansonsten ist ein Besuch auf "Evil Pies" empfohlen:

    The only real pie!

    Die Release Notes von QlikView 11.20 SR10 beschreiben ein neues Feature bei Kreisdiagrammen, welches uns die Pie-Charts ein wenig "smoother" wirken lässt:

    Während in SR9 und davor die Kreissegmente immer eine harte,schwarze Linie waren, kann man jetzt unter "Farben">"Sector outline" eine andere Farbe definieren. Siehe zweites und drittes Diagramm im Screenshot unterhalb.




    Die .qvw gibt es hier, und setzt einen QlikView 11.20SR10 Developer voraus. Ein Klick auf ein Land in der Chart-Legende hebt es gelb hervor. Das funktioniert ähnlich wie das Brush&Link-Beispiel in diesem alten Blogeintrag.

    Qlik übernimmt Vizubi nPrinting - Formatvielfalt für Ihre Reports

    $
    0
    0

    Letzte Woche wurde in einer Pressemitteilung announced, dass Qlik den Anbieter Vizubi nPrinting übernommen hat. Es freut uns, dass unsere favorisierte Lösung in die Qlik-Familie aufgenommen wurde. Ab jetzt können wir unseren Kunden und Interessenten Qlik als alleinigen Ansprechpartner für die Produkte nennen, und freuen uns auf die weitere Integration von nPrinting in QlikView und QlikSense.


    Wer nPrinting noch nicht kennt, findet die ersten Informationen auf der Qlik Product Seite hier.

    Der Mehrwert den nPrinting zu den bestehenden QlikView-Reports bietet, ist die Format-Vielfalt mit den automatisierten Reports distribuiert werden können:  Bisher war der QlikView Publisher diesbezüglich auf .qvws und .pdfs limitiert.

    Mit nPrinting können Templates in PowerPoint, Excel, und Word genutzt werden, um QlikView-Inhalte automatisiert an die Empfänger zu verteilen. Neben PDF und den Office-Formaten könne auch HTML-Reports generiert werden. Beispiele und eine Demo-Gallerie finden Sie momentan noch direkt auf der Vizubi Report Contest Gallery.

    http://www.vizubi.com/report-contest-gallery/
    nPrinting Report Contest Gallery

    Wenn Sie Interesse, Lust auf eine Demo oder Fragen zu Ihrer bestehenden QlikView Publisher PDF-Distribution Lizenz haben, treten Sie gerne mit uns in Kontakt.





    Viewing all 102 articles
    Browse latest View live