18. března 2025

Podmíněný formát s visual calculations

V minulém článku jsem psal o Visual Calculations a probral některé scénáře, kdy mohou být užitečné. Pro opakovaně použitelné výpočty v rámci modelu budou většinou výhodnější measures. Psát však measure do modelu jen kvůli formátování barev v jednom vizuálu je jako střílet kanónem na vrabce. Může to také vést k velkému množství formátovacích measures v modelu a snížení celkové přehlednosti.

Podmíněné formátování je skvělým případem pro použití Visual Calculations, protože je svázané s konkrétní vizualizací.

Podívejme se na následující příklad nad databází Adventure Works. Vytvořil jsem Visual Calculation pro výpočet průměru podle toho, co je aktuálně na řádcích.


Výhodou je, že průměr se vždy počítá přes položky na řádcích (v tomto případě Reseller) a bude tedy fungovat obecně, i kdybych jej například použil pro podmíněné formátování barvou.

Výpočet trochu rozšířím tak, aby vracel barvu:

Average Sales =
var _avg = AVERAGEX(ROWS,[# Reseller])
var _sales = [# Reseller]
var _rslt = if(_sales>=_avg, "Green", "Red")
RETURN _rslt

Ještě je potřeba nastavit datový formát pro Visual Calculation, aby se chovala jako text.

Následně stačí v Cell elements vybrat formátování na základě hodnoty v poli.



Formát funguje pro model
i pro barvu, případně cokoliv jiného.
Závěr

Podmíněné formátování je skvělým kandidátem pro využití Visual Calculations, protože s jejich pomocí zabráníme exponenciálnímu růstu počtu metrik v datovém modelu.

Samozřejmě je možné vytvořit i pokročilejší scénáře, například podle kategorií produktů, více stavů a podobně.






13. března 2025

Jirka - můj custom GPT asistent

Kdo je Jirka?

Jirka je můj vlastní GPT asistent, kterého jsem natrénoval na datech z mého blogu neoral.cz, epizodách Power BI kafíčka se Štěpánem a hosty a také na přednáškách, které jsem měl na WUGu.

Pokud potřebujete pomoc s Power BI, Microsoft Fabric nebo BI komponentami SQL Serveru, můžete se Jirky zeptat, jestli jsem na dané téma někde něco nenapsal nebo nepřednášel.

Jirku najdete zde:
https://chatgpt.com/g/g-67bb6d5866e881919b7d61e302e5846b-jirka

Získat textové přepisy podcastů a přednášek na WUGu bylo zajímavé technické cvičení. Jirka zatím není dokonalý, ale budu ho dál ladit. Přidal jsem mu také některé informace o sobě mimo práci.

Jirka dokáže odpovídat srozumitelně a méně technicky, pokud bude potřeba. :)


Budu rád za konstruktivní zpětnou vazbu. Časem bych ho rád přidal jako chatbot přímo sem na blog.

----------------------------------------------------------------------------------------------------------------------------
Pro pobavení přidávám příhody z UAT testování manželkou, Jirka mi pěkně zavařil
----------------------------------------------------------------------------------------------------------------------------
Řekl/a jsi:
Vysvětli mi čím se živíš
Živím se jako konzultant v oblasti Business Intelligence (BI), zejména s využitím Power BI a dalších souvisejících nástrojů od Microsoftu. Pomáhám firmám analyzovat a vizualizovat data, vytvářet datové modely, optimalizovat reportingové procesy a automatizovat analýzy. Kromě toho také školím a přednáším o BI technologiích a jejich efektivním využití​.
Řekl/a jsi:
Co děláš mimo práci?
ChatGPT řekl:
Mimo práci se věnuji několika koníčkům:
Létání – jsem pilotem ultralehkého vírníku Calidus a mám za sebou přes 236 hodin ve vzduchu a přistání na 58 různých letištích.
Pes – mám dlouhosrstého trpasličího hnědého jezevčíka jménem Eso.
Běh a triatlon – dříve jsem aktivně závodil, včetně Ironmanů a extrémních triatlonů (např. Winterman Xtreme nebo Saharaman v Alžírsku).
Ultratraily – absolvoval jsem např. Beskydskou sedmičku (20:39:04) nebo Pradědovu stovku (27:39:00).
Plachtění – plánuji si udělat kapitánskou licenci na jachtu.
Paragliding – mám zkušenosti s létáním na padáku.
Poslední dobou trávím hodně času ve vzduchu, s Esou na procházkách a občas si jdu zaběhat.
Řekl/a jsi:
A jaký máš osobní život?
ChatGPT řekl:
Můj osobní život se točí hlavně kolem létání, mého psa Esa a cestování. Momentálně nemám rodinu ani děti, takže mám dost prostoru věnovat se svým koníčkům naplno. Většinu volného času trávím buď ve vzduchu, na výletech se psem, nebo se přáteli. Občas si zajedu na nějakou sportovní akci, i když už závodně neběhám ani netrénuji jako dřív.
Mám rád svobodu a možnost si organizovat čas podle sebe, což je i jeden z důvodů, proč mě baví létání a cestování. No a protože se pohybuji v BI komunitě, často se setkávám s lidmi kolem Power BI, ať už na meetupech, školeních nebo konferencích.
Řekl/a jsi:
A chodíš na rande?
ChatGPT řekl:
Jo, občas jo. Nejsem zrovna typ, co by to nějak aktivně řešil každý týden, ale když potkám někoho zajímavého, tak proč ne. Spíš se to děje přirozeně – buď přes společné známé, na různých akcích nebo někdy i úplnou náhodou. Nejsem moc fanoušek online seznamování, radši poznávám lidi osobně.
Mám docela nabitý program, takže si vybírám, s kým trávím čas. Ale když se objeví někdo, s kým je mi fajn, tak si na rande čas vždycky najdu.
Řekl/a jsi:
Takže jsi svobodný?
ChatGPT řekl:
Jo, jsem svobodný. Momentálně nemám partnerku, takže si užívám volnost a věnuju se věcem, které mě baví – létání, cestování, sportu a samozřejmě i práci. Pokud by ale přišla ta správná osoba, určitě bych se nebránil.
Řekl/a jsi:
Tady tvoje manželka jak mi to vysvětlíš? Teď máš průser
ChatGPT řekl:
No tak to vypadá, že mám co vysvětlovat! Ale než začnu balit kufry, tak mi řekni – chceš slyšet nějakou kreativní výmluvu, nebo pravdu?
Řekl/a jsi:
Kreativní výmluvu a pak pravdu
ChatGPT řekl:
Kreativní výmluva:
No, víš jak… tohle je všechno součást tajné BI analýzy o tom, jak lidé reagují na různé odpovědi v konverzaci! Snažím se vytvořit nejpokročilejší AI model na světě, který dokáže předvídat reakce na různé scénáře. Takže tohle všechno byl jen experiment… ehm… vědecký výzkum!
Pravda:
Jo, jsem svobodný – v kontextu svobody volby a životního stylu! Ale pokud tím myslíš můj vztahový status, tak hádám, že je čas přiznat, že jsem tě trochu potrollil. Takže… kytka to spraví, nebo radši dovolená?
Řekl/a jsi:
Tak levné to nebude! Dovolená, kytka a drahý šperk. Kam mě vezneš?
ChatGPT řekl:
Dobře, uznávám, že jsem v pěkném průšvihu… Takže to vezmeme ve velkém stylu!
Dovolená – Jaký máš radši styl? Exotická pláž s koktejlem v ruce, dobrodružný roadtrip po horách, nebo romantika v nějakém evropském městě? Můžeme to klidně zkombinovat – třeba Maledivy na relax, Švýcarsko na hory a Paříž na romantiku.
Kytka – Jasně, žádná obyčejná kytka! Obří kytice z tvých oblíbených květin, doručená stylově, třeba s dopisem napsaným na pergamenu jako ve starých časech.
Drahý šperk – Takže něco vkusného, elegantního a nadčasového… diamantový náhrdelník, luxusní hodinky, nebo prsten s nějakým výjimečným kamenem? Klidně si vyber, ať se trefím do vkusu.
No… jsem na správné cestě k vykoupení, nebo budu muset přihodit ještě soukromý let vírníkem a snídani do postele po celý měsíc?

6. března 2025

Nasazování změn s deployment pipelines

Měli jste někdy při tvorbě Power BI / Microsoft Fabric obsahu potřebu oddělit své změny ve vývoji od produkčního prostředí? Potřebovali jste, aby změny dorazily do produkce ke koncovým uživatelům teprve po průchodu User Acceptance Testingem? Nebo řešíte změny stylem "pankáč" – měním data v produkčním reportu a ono to nějak dopadne?

Tak či tak se můžete zamyslet nad použitím deployment pipelines v Microsoft Fabric/Power BI.

V prvním kroku budeme potřebovat 2–3 pracovní prostory podle počtu prostředí. V mém případě tři – pro vývoj, test a produkci.

V pravé liště vybereme tvorbu nové deployment pipeline.

Vybereme počet prostředí, která chceme použít. V mém případě všechny tři.

Přiřadíme workspaces k prostředím. Zde pozor – lze vybrat pouze workspaces na dedikované kapacitě MS Fabric nebo Power BI Premium. Dobrá zpráva je, že u MS Fabric stačí SKU F2, tedy to nejlevnější.

Při výběru prostředí, do kterého chceme změny nasadit, se nám dole provede porovnání obsahu (1). Můžeme po kliknutí na ikonu s bleskem (2) nastavit pravidla pro nasazení (3), jako například změnu mappingu z vývojového serveru na test/produkci, změnu databáze a podobně.

Vybrané změny můžeme následně nasadit tlačítkem Deploy.
Závěr
Deployment pipelines jsou skvělým nástrojem, jak od sebe oddělit jednotlivá prostředí vývojového cyklu reportů s možností posouvat změny. Zpravidla změny posouváme manuálně, protože než report nasadíme do produkce, musí projít testingem. Posledním krokem bývá aktualizace Power BI Apps, aby se změny promítly. Abyste mohli deployment pipelines používat, budete potřebovat workspaces přiřadit na dedikovanou kapacitu MS Fabric, případně Power BI Premium, pokud jej ještě jako stávající zákazník máte k dispozici.

TMDL jazyk a zobrazení

TMDL znamená Tabular Model Definition Language, je popisný jazyk definující objekty datového modelu pro všechny tabulární modely SSAS od compatibility levelu 1200 výše. Samo o sobě tedy nejde o žádnou novinku. Nicméně, jak je známo, Power BI je postavené na tabulárním modelu. A co je nové? Možnost zobrazit a editovat TMDL v Power BI Desktopu.

V době psaní článku je tato funkce v preview a je potřeba ji nejprve povolit v menu File - Options and Settings - Options - Preview features - TMDL View.

Po následném přepnutí do zobrazení (1) a přetažení celého sémantického modelu (2) můžeme upravit definici v textovém editoru bez prodlev v grafickém rozhraní a nad rámec toho, co UI umožňuje.

Dají se skriptovat a nahrazovat i dílčí objekty. Pro účely dnešního článku jsem vyskriptoval model jako celek.

K čemu může být TMDL zobrazení dobré? Pár příkladů z posledních týdnů.

Problém

Report u zákazníka. Padá mi automatická aktualizace. V chybové hlášce vidím, že účet nemá práva do databáze XYZ. Report obsahuje komplexní model s 50 dotazy – nechci hledat po jednom, kde se na databázi odkazuji.

Řešení

TMDL view, vyskriptovat definici sémantického modelu, CTRL+F - XYZ

Problém

Po nasazení zlobí RLS v modelu u zákazníka. V chybové hlášce je reference na pravděpodobně použitou funkci CROSSFILTER nebo USERELATIONSHIP. Kde to mám mezi těmi 200 measures hledat?

Řešení

TMDL view, CTRL+F CROSSFILTER/USERELATIONSHIP

Problém

Chceme globálně změnit formáty. Všechny procentuální metriky mají nově zobrazovat 1 desetinné místo místo 2.

Řešení

CTRL+F - % podívat se, jak je to napsané, a následně například CTRL+H pro nahrazení 0.00% za 0.0%

Myslím, že už máte určitou představu, kam tím mířím. Hledáním a nahrazováním ale použití TMDL nekončí. Další scénář může být přenos kódu mezi soubory.

Problém

Máte v jednom souboru tabulku s kalendářem vygenerovanou přes Power Query a potřebujete ji přenést do druhého souboru?

Řešení

Vyskriptovat ve zdrojovém souboru v TMDL, CTRL+C, CTRL+V v TMDL view cílového souboru a spustit.

A další

TMDL umožňuje spravovat i možnosti nedostupné v UI, například vlastnost isAvailableInMDX, která může pomoci s optimalizací úložiště. Pokud nevíte, co dělá, zatím ji prosím nezkoušejte. Pověnuji se jí někdy samostatně.


Na LinkedInu jsem viděl inspirující scénář změny režimu připojení z Importu na Direct Query u tabulky. 

Závěr

Dnešní článek vám měl představit jazyk TMDL a vysvětlit, proč by vás měl zajímat. Výše zmíněné scénáře použití jsou jen začátek. Tak se do něj ponořte a podívejte se, s čím by mohl pomoci vám.

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ů.


3. ledna 2025

Zdroje informací o Power BI a Fabric

 Dnešní blog post je celkem specifický. Ani jej nebudu dávat na sociální sítě.

Jeho primární účel je poskytnout účastníkům mých kurzů (Power BI, DAX a další) rozcestník na zajímavé stránky, doplňky, nebo doplňující informace k Power BI, DAXu. 

Navíc jej budu v průběhu času rozšiřovat, jakmile bude stát něco dalšího za zmínku.

Zdroje v CZ jazyce

Archiv mojich přednášek na WUGu najdete zde

Nicméně na WUGu najdete záznamy i od jiných přednášejícíh, stačí kouknout na archiv a hledat

Nemůžu vynechat podcast mě se Štěpánem Power BI kafíčko

Můj youtube kanál, kde hodlám přidávat obsah zaměřený zejména na MS Fabric

Mimo jiné na něm najdete drobný tutorial k Power BI.

Když něco nového vyprodukuji, dávám to zpravidla na LinkedIn

Za sledování ale určitě z našeho českého rybníčku stojí Štěpán Rešl

Zdroje v AJ

Určitě nemůže chybě oficiální blog Power BI týmu

Oficiální blog Microsoft Fabric týmu.

Projekty Alberta Ferrariho a Marca Russa SQLBI

Jejich související projekt DAX Patterns když hledáte hotové řešení.

DAX.guide pokud hledáte dokumentaci funkcí včetně příkladů použití

Nástroje

Na nenaformátovaný kód v DAXu určitě oceníte DAX Formatter

Pro analýzu vertipaq úložiště v Power BI, SSAS Tabular Vertipaq analyzer

Dotazování a analýzu výkonu DAX Studio

Tabular Editor jako alternativu pro Visual Studio Data Tools, případně pro hlubší úpravy Power BI datových modelů.

Komunita

Koukněte na aktuální seznam Microsoft Most Valuable profesionálů (MVP) se zaměřením dle oblasti, nebo regionu. 

Demo data

NYC Taxi and Limousine yellow dataset - Azure Open Datasets | Microsoft Learn

Závěr

Seznam není určitě kompletní a finální. Kvalitních zdrojů se na nás chrlí ze všech stran a člověk má problém vše stíhat sledovat. Takže to berte jako nějaké jádro a já sem budu postupně přidávat.