Auf in eine transparente Zukunft

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

1 Response to "Auf in eine transparente Zukunft"

  1. Andrey says:

    Danke für den Beitrag, einfach Geektastic :)
    Bitweise mit Werten arbeiten, das habe ich lange nicht mehr gemacht!
    Dass man mit color(rowno()) die Default-Farbpalette in QV nachmachen kann, das kannte ich bisher nicht. Ziemlich praktisch!

    Mir ist auch aufgefallen, dass die erste Methode nicht ganz korrekt arbeitet, wenn die RGB Werte nicht 3-stellig sondern 2-stellig sind. Zum Beispiel, die Standard QV-Farben 2-4, 11, 13, 15... werden nicht richtig ausgeschnitten, das fällt leicht bei der Farbe 2 schon ins Auge. Hier müsste man wahrscheinlich am besten mit Subfield(...) arbeiten.

    Die bitweise Operation mit Pow(2,...) funktioniert hingegen wunderbar.

Kommentar veröffentlichen

heldendaten GmbH,2017