24. února 2025

Visual Calculations

 Jednou z nejzajímavějších novinek, které v poslední době přibyly do Power BI, jsou Visual Calculations. O co se jedná? Jak už název napovídá, jde o výpočty prováděné přímo na úrovni vizualizace. Některé výpočty je jednodušší vyhodnotit právě tímto způsobem, než je vytvářet jako obecná měřítka (measures).

V době psaní tohoto článku jsou Visual Calculations dostupné v režimu Preview, a je tedy nutné je nejprve povolit. To provedete v File → Options and settings → Options → Preview features → Visual Calculations a následně restartujete Power BI Desktop.

Jaké Visual Level Calculations máme k dispozici? Nejjednodušeji s nimi můžete začít kliknutím na tři tečky v rohu vizualizace – viz obrázek.

Pro demonstraci opět použiji demo databázi Adventure Works DW. Mám faktovou tabulku FactInternetSales, ve které mám měřítko [# Internet], definované jako součet sloupce SalesAmount. Kromě toho pracuji s kalendářovou tabulkou DimDate.

Například bych chtěl porovnat aktuální prodeje s předchozím obdobím.

Implementace pomocí klasického měřítka (measure) není úplně triviální a vyžaduje určité znalosti DAX. Výraz by mohl vypadat například takto:

# Vs Previous measure =
-- zjištění nejvyššího datumu v kontextu
var _md = max('DimDate'[Date])
-- zjištění předchozího datumu
var _pd = CALCULATE(max('DimDate'[Date]),DimDate[Date]<_md)
-- prodeje pro nejvyšší datum
var _mds = CALCULATE([# Internet],DimDate[Date]  = _md)
-- prodeje pro předchozí datum
var _pds = CALCULATE([# Internet],DimDate[Date]  = _pd)
-- výsledek vracím pouze pokud mám od sebe co odečítat
var _rslt = if(ISBLANK(_mds) || ISBLANK(_pds), BLANK(),_mds-_pds)
RETURN _rslt

Tento přístup vyžaduje několik kroků: nejprve zjistíme aktuální datum, pak odpovídající datum v předchozím období a nakonec vypočítáme rozdíl prodejů.

Zjednodušení pomocí Visual Calculation

Díky Visual Calculations lze stejný výpočet provést výrazně jednodušeji. Šablona Versus Previous, dostupná v Power BI, nám automaticky vygeneruje jádro výrazu:


Versus previous = [Field] - PREVIOUS([Field])

Kde Field představuje vybraný sloupec nebo measure. V našem případě to můžeme přepsat jako:

Versus previous =
if( --kontorola zda je co porovnávat
    ISBLANK([# Internet]) || ISBLANK(PREVIOUS([# Internet]))
    ,BLANK(), -- pokud ne, tak prázdná buňka
    -- jinak odečet
    [# Internet]-PREVIOUS([# Internet])
)

Tento přístup je výrazně jednodušší a přehlednější, přičemž stále poskytuje správné výsledky. Ve skutečnosti bychom si mohli vystačit i se základním výpočtem:

Versus previous = [# Internet]-PREVIOUS([# Internet])


Funkce PREVIOUS ve Visual Calculations vrací hodnotu z předchozího řádku vizualizace. To znamená, že její výsledek závisí na tom, jak jsou data ve vizualizaci seřazena. Pokud je tabulka setříděna sestupně podle data, funkce nebude vracet očekávané výsledky. Proto je důležité správně nastavit pořadí řazení.

Kdy použít Visual Calculation a kdy Measure?

Measures

  • Nejsou závislé na konkrétní vizualizaci – lze je znovu použít v různých reportech.
  • Pracují přímo s datovým modelem a umožňují komplexní výpočty.
  • Vhodné pro scénáře, kde je potřeba konzistentní výpočet v celém reportu.

Visual Calculations

  • Jsou vázané na konkrétní vizualizaci, takže jejich použití je omezenější.
  • Mají jednodušší syntaxi, což ocení zejména ti, kdo s DAXem začínají.
  • V některých případech mohou mít lepší výkon, protože pracují s agregovanými daty ve vizualizaci místo s detailními daty v datovém modelu.

Výběr mezi Measure a Visual Calculation tedy závisí na konkrétním scénáři – pokud potřebujete opakovaně použitelný výpočet, měřítko (measure) je lepší volba. Pokud ale hledáte rychlé řešení v rámci jedné vizualizace, Visual Calculation může být efektivnější.

Závěr

Visual Calculations jsou další skvělou součástí DAX arzenálu. Klasické measures stále mají své pevné místo, ale v některých situacích umožňují Visual Calculations jednodušší a efektivnější řešení s ohledem na výkon. Navíc fungují i pro Live Connection k SSAS a sémantickým modelům v Microsoft Fabric.

Živé demo Visual Calculations jsem ukazoval na své přednášce pro WUG. Záznam najdete zde:
Záznam přednášky na WUG

📅Chystám se téma podrobněji rozebrat na samostatné přednášce 20. 3. 2025 v rámci 9. ročníku Power BI Day. Rád vás tam uvidím i osobně!
Power BI Day 2025

📅 Pokud se chcete naučit jazyk DAX od základů až po pokročilé scénáře, včetně Visual Calculations, přijďte na můj celodenní workshop na Data Point Prague 29.–30. 5. 2025.
Data Point Prague 2025


6. února 2025

Field parameters pro dynamické reporty

Nějakou dobu zpátky jsem psal o tom, jak dodat dynamiku reportům pomocí dynamické metriky. Článek si můžete přečíst zde

Ve zkratce šlo o problém, kdy chci zobrazovat uživatelům stejně rozvržený report, ale mít možnost volit metriku. Stejné grafy, tabulky a další vizuály s možností vybrat mezi obratem, marží nebo náklady.

Dnes se podíváme na dynamiku z druhé strany, a sice z pohledu dimenzionálního.

Představte si stejný typ grafu, stejnou metriku, ale s možností zobrazit rozpad podle různých dimenzionálních atributů – například podle produktové kategorie, prodejního kanálu nebo třeba barvy.

A právě k tomu slouží field parameters.

K demonstraci použiju starou dobrou databázi Adventure Works DW, stejně jako u většiny příkladů.

Model obsahuje následující measures a dimenze: 

Tvorba field parametru probíhá na záložce Modeling na pásu karet.


Nejprve nadefinujeme název parametru – zde Split (1), protože budu ovládat rozpad v grafu, matici a dalších vizualizacích. Následně vybereme seznam polí, která vytvoří hodnoty parametru v příslušném pořadí (2), a ponecháme zaškrtnutou možnost vytvoření sliceru (3).
V modelu se vytvoří počítaná tabulka Split, která obsahuje název parametru (1), kód (2) volající popisky nahrazené hodnotou (NAMEOF funkce) a pořadí. Tyto hodnoty se zobrazí ve sliceru (3).
Detail vygenerovaného kódu

Split = {
    ("Category", NAMEOF('DimProduct'[Category]), 0),
    ("FullName", NAMEOF('DimEmployee'[FullName]), 1),
    ("Color", NAMEOF('DimProduct'[Color]), 2)
}

Zde je možné upravit pořadí, změnit popisky a přidat další hodnoty. Například:
Split = {
    ("Category", NAMEOF('DimProduct'[Category]), 0),
    ("FullName", NAMEOF('DimEmployee'[FullName]), 1),
    ("Color", NAMEOF('DimProduct'[Color]), 2),
    ("Currency", NAMEOF('DimCurrency'[CurrencyAlternateKey]),3)
}
Při tvorbě grafu a matice se nejprve zobrazí drill-down v defaultním pořadí.
Pokud ale nejprve vyberu měnu (Currency) a následně kategorii (Category), vizuál se překreslí následovně:

Jaká mají field parameters omezení?

Podle posledního testu v době psaní tohoto článku nejsou field parameters k dispozici v Power BI Desktopu určeném pro on-premises Power BI Report Server.

Stejně tak není možnost tvorby field parameters dostupná u live connection, protože v tomto režimu nelze vytvářet ani počítané tabulky. Pokud chcete použít field parameters, museli byste přepnout do DirectQuery režimu proti SSAS/Semantickému modelu. V takovém případě však může přepnutí do DirectQuery negativně ovlivnit výkon a funkcionalitu reportu.

Závěr
Field parameters rozšiřují arzenál Power BI developera pro tvorbu dynamických reportů.