Funktionsweise der neuen DAX Dynamic Format Strings

Die neue Dynamic Format String Funktion ist aus meiner Sicht ein sehr wichtiger Puzzlestein, auf den ich tatsächlich seit Jahren gewartet habe und mit dem sich jetzt viele Praxisfälle in Power BI lösen lassen!

Der folgende Anwendungsfall kann mittlerweile mit der Fields Parameter Funktion noch eleganter gelöst werden, dennoch verwende ich dieses Beispiel, weil es sehr anschaulich ist.

Die Dynamic Format Strings sind derzeit eine Preview Funktion im April 2023 Release. Für die Anlage der Calculation Groups als Vergleichslösung in diesem Blogbeitrag ist Tabular Editor in der aktuellsten Version 2.18.0 Voraussetzung.

1. Ausgangssituation

Ausgangsbasis ist (wie auch schon zuletzt hier) eine Sales Anwendung mit 4 Kennzahlen Measures, welche spezifisch formatiert sind:

Das Datenmodell ist ein normales Star Schema ...

... und für die 4 Measures wurde mittels Calculated Table (und nicht über den Fields Parameter Wizard) eine sogenannte Measure Selektion angelegt ...

... welche die Basis für den Kennzahlen Slicer darstellt. Das Problem beim Dynamic Measure ist allerdings die Formatierung, da diese differenziert werden müsste, je nachdem, welches Measure im Slicer ausgewählt ist bzw. je nach Spalte im Matrix Visual:

2. Definition eines Dynamic Format Strings

Die Dynamic Format Strings können mit der neuen Funktion wirklich sehr einfach genutzt werden. Einfach das gewünschte Measure (hier: Dynamic Measure) in der Feldliste rechts markieren und dann im Format Dropdown den Eintrag Dynamic wählen:

Durch diese Auswahl wird der DAX Editor (in Excel Sprache: "Formelzeile") um die Auswahl erweitert, ob die Measure Berechnung oder das Format des Measures bearbeiet werden soll. Zur Definition eines Dynamic Format Strings wählen wir die Option Format:

Jetzt können im ganz normalen DAX Syntax für Measures Bedingungen für die Formatierung des Measures definiert werden. Hier wird mit der SWITCH() Funktion (= geschachteltes IF() in DAX) auf die Zustände des Measures Measure Selektion referenziert und dann in Abhängigkeit von der Auswahl im aktuellen Filter Context der Measure Berechnung der passende Formatstring (= Text in doppelten Anführungsstrichen) ausgegeben und auf die Darstellung angewendet:

SWITCH(
    [Measure Selection];
    "Margin in %"; "0.0 %";
    "Quantity"; "#,##0 pcs";
    "€ #,##0"
)

Die DAX Syntaxvariante mit der Funktion SELECTEDMEASUREFORMATSTRING() in der Else-Klausel der SWITCH() Funktion hat in meinem Test nicht gut funktioniert, weil die Basisformatierung des Measures (vor der Umstellung auf Dynamic) mit der Funktion nicht wiedergegeben wird (siehe "Limitationen" am Ende dieses Beitrags):

SWITCH(
    [Measure Selection];
    "Margin in %"; "0.0 %";
    "Quantity"; "#,##0 pcs";
    SELECTEDMEASUREFORMATSTRING()
)

Hier das fertige Ergebnis, das Measure wird je nach Selektion bzw. Filter Context im Matrix Visual wie gewünscht formatiert:

Die Lösung kann noch verbessert werden, indem die Formatkriterien für den Dynamic Format String nicht hard-codiert werden sondern in die Measures Tabelle selbst als Parameterspalte hinzugefügt werden:

Als Dynamic Format String wird dieses einfache (aber nicht simple) DAX Statement eingesetzt:

SELECTEDVALUE('Measure Selection'[Format])

3. Vergleichslösung mit Calculation Groups

Bisher war das Thema der dynamischen Measure Formatierung nur über Calculation Groups lösbar, das möchte ich hier der Vollständigkeit halber zeigen. Ich empfehle aber, diese Lösung nicht mehr umzusetzen, da diese doch um einiges umständlicher ist, als die recht intuitive Lösung mit den neuen Dynamic Format Strings.

Wie bereits hier beschrieben, werden Calculation Groups mit dem externen Tool Tabular Editor erstellt (die Installation haben wir hier beschrieben), für diesen Anwendungsfall ist Version 2.18.0 oder höher notwendig. Einfach den Tabular Editor aus der Menüleiste heraus starten ...

... und auf dem Eintrag Tables den Kontextmenü Befehl Create New -> Calculation Group ausführen ...

... und den erzeugten Table auf Dynamic Formatting und die erzeugte Spalte auf On/Off umbenennen.

Jetzt können im Kontextmenü des Eintrags Calculation Items ...

... die beiden Berechnungselemente Default Format und Dynamic Format angelegt werden. Warum wir 2 items anlegen (und nicht 1 reicht) werden wir weiter unten sehen.

Genauso wie im DAX Editor von Power BI Desktop hat jetzt jedes item 2 Eigenschaften, nämlich eine Measure Expression und eine Format String Expression. Die Measure Expression wird bei beiden items mit dem gleichen DAX Statement belegt:

Default Format = 
SELECTEDMEASURE()
Dynamic Format = 
SELECTEDMEASURE()

Die Format String Expression wird jedoch unterschiedlich definiert:

Default Format = 
SELECTEDMEASUREFORMATSTRING()

Der Dynamic Format String bekommt hier mit der ISSELECTEDMEASURE() Funktion eine Bedingung für das konkrete Measure, da sonst dieses Format auf sämtliche Measures auf der Berichtsseite angewendet werden würde. Die Referenzierung auf das definierte Format des Measures mit der Funktion SELECTEDMEASUREFORMATSTRING() funktioniert hier einwandfrei:

Dynamic Format =
IF(
    ISSELECTEDMEASURE([Dynamic Measure (Calculation Group)]),
    SWITCH(
        [Measure Selection],
        "Margin in %", "0.0 %",
        "Quantity", "#,##0 pcs",
        SELECTEDMEASUREFORMATSTRING()
    ),
    SELECTEDMEASUREFORMATSTRING()
)

Die Änderungen im Tabular Model werden mit dem Button Save the changes to the connected database zurückgespeichert und in Power BI Desktop mit dem Refresh now Button aktualisiert:

Leider funktioniert hat sich im Power BI Report noch nichts geändert, da die Calculation Group noch nicht aktiv ist:

Daher muß jetzt über einen Slicer oder - jedenfalls empfehlenswert - über die Filter Pane das item Dynamic Format aus der Calculation Group selektiert werden. Das ist auch der Grund, warum wir 2 items angelegt haben, da Calculation Groups mit nur 1 item sich nicht selektieren und damit auch nicht aktivieren lassen:

Wie auch schon hier beschrieben, hier die DAX Funktionen speziell zur Verwendung iZm Calculation Groups:

SELECTEDMEASURE()
Liefert das aktuell im Visual berechnete Measure. Wird verwendet als Referenz ("Platzhalter") im DAX Statement des Calculation items auf das Measure im Visual.

SELECTEDMEASURENAME()
Liefert den Namen des aktuell im Visual berechnete Measures.

ISSELECTEDMEASURE(<measures>)
Liefert den Wert TRUE, sofern das aktuell im Visual berechnete Measure in der Liste der im Parameter der Funktion aufgezählten Measures dabei ist. Wird verwendet, um Calculation Groups selektiv nur für bestimmte Measures wirken zu lassen und/oder spezifische Formatierungen anzuwenden.

SELECTEDMEASUREFORMATSTRING()
Liefert die bestehende Formatierung des aktuell im Visual berechnete Measures. Wird verwendet, um bei bedingten Format Strings meist in der "Else" Klausel die Standardformatierung des aktuellen Measures zu verwenden.

4. Vergleichslösung mit der FORMAT() Funktion

Für alle diejenigen unter Euch, die sich fragen, warum die Formatierung so kompliziert gelöst wird wo es doch die DAX Funktion FORMAT() gibt, hier noch die entsprechende Vergleichslösung.

Das Measure Dynamic Measure kann ...

Dynamic Measure = 
IF(
    HASONEVALUE('Measure Selection'[Metric]);
    SWITCH(
        [Measure Selection];
        "Quantity";[Quantity];
        "Sales";[Sales];
        "Margin";[Margin];
        "Margin in %"; [Margin in %]
    );
    BLANK()
)

... mit der DAX Funktion FORMAT() um die gewünschten Formatierungen erweitert werden:

Dynamic Measure (FORMAT) = 
IF(
    HASONEVALUE('Measure Selection'[Metric]);
    SWITCH(
        [Measure Selection];
        "Quantity";FORMAT([Quantity];"#,##0 pcs";"de-de");
        "Sales";[Sales];
        "Margin";[Margin];
        "Margin in %"; FORMAT([Margin in %]; "0.0 %";"de-de")
    );
    BLANK()
)

Das Problem dabei ist aber, daß es sich bei den ausgegebenen Werten um keine Zahlen sondern um Text handelt. Das führt dazu, daß das Measure in Chart Visuals nicht mehr dargestellt werden kann, im Card Visual wirkt die Display Units Funktion nicht mehr und im Table und Matrix Visual kann die Bedingte Formatierung nicht mehr genutzt werden:

In der Praxis wurde das Thema in der Vergangenheit häufig behelfsmäßig so gemildert, indem pro Kennzahl 2 Measure Varianten angelegt wurden - eine als echte Zahl und eine als wunschgemäß formatierter Text.

5. Evaluierung, Anwendungsgebiete und Limitationen

Die neue Dynamic Format Strings Funktion löst das große Thema der dynamischen Measure Formatierung - also abhängig vom spezifischen Filter Context der Measure Berechnung. Die bisherige Lösung mit Calculation Groups ist deutlich umständlicher und bringt auch einen Overhead in das Datenmodell und die bisherige Lösung mit der FORMAT() Funktion ist nur eine Krücke mit vielen Abstrichen.

Folgende Anwendungsgebiete können mit den Dynamic Format Strings jedenfalls gelöst werden:

  • Anzeige user-spezifischer Formate (siehe hier)
  • Anzeige spezifischer Mengeneinheiten (bei nur 1 Mengen Measure)
  • Anzeige individueller Display Units (siehe hier)
  • Anzeige Lokalwährungen (bei nur 1 Local Currency Measure, siehe hier)
  • Dynamische Formatierung einer "herkömmlichen" Measure Selektion (ohne Fields Parameter, siehe dieser Blogbeitrag)

Limitierungen:

  • Dynamic Format Strings können nur in "Model level Measures" und nicht in "Report Level Measures" (in Anwendungen mit Live Connect) erstellt werden.
  • Einschränkungen in Composite Models (aka "Direct Query for AS")
  • Wird bei einem Measure die Formatierung von Dynamic auf eine normale Formatierung (bspw. Custom) zurückgestellt, dann funktioniert diese Formatierung nicht richtig (vermutlich ein Preview Bug). Am besten das Measure löschen und nochmals neu anlegen - das geht sehr schnell und spart Probleme.
  • Die Dynamic Formatierung kann wohl nicht mit einer zuvor angelegten Basisformatierung (bspw. Custom) des Measures kombiniert werden. Das führt dann auch dazu, daß die DAX Funktion SELECTEDMEASUREFORMATSTRING() nicht das erhoffte Ergebnis (nämlich die Basisformatierung) liefert.

Quellen

https://powerbi.microsoft.com/en-us/blog/deep-dive-into-the-new-dynamic-format-strings-for-measures/

https://www.sqlbi.com/articles/dynamic-format-strings-with-calculation-groups/

https://www.sqlbi.com/articles/controlling-format-strings-in-calculation-groups/

Über den Autor

Blog auf Feedly abonnieren

Kategorien

Verwandte Beiträge

Power BI Camp - Präsenztrainings in Wien und Nürnberg!

Dashboarding mit Power BI, DAX & Datenmodellierung und Power Query. Drei Einzelmodule oder als ganze Trainingswoche - für Einsteiger und Fortgeschrittene!

Termine 2022

Wien: (7./8. Februar 2022)
und 25.-28 April 2022
Nürnberg: (14./15. Februar 2022)
und 9.-12. Mai 2022

Jetzt buchen und Rabatt sichern.

Jetzt buchen!

Leave a Replay

Schreibe einen Kommentar

Kostenlos zum Newsletter anmelden

Ihre Anfrage

Schicken Sie uns Ihre Fragen und Anregungen!