Workshop — závěrečné cvičení
Cíle workshopu
- Vytvořit Calculation Group pro časové srovnání
- Implementovat Field Parameters pro dynamické metriky
- Optimalizovat pomalou measure pomocí DAX Studio
- Přidat RLS a OLS zabezpečení
- Připravit model na nasazení do Power BI Service
Úvod do workshopu — scénář
Pracujeme s Adventure Works DW 2019 modelem. Úkolem je vytvořit pokročilý sales analytics report s těmito vlastnostmi:
- Calculation Group pro srovnání: Current, Previous Year, YoY %
- Field Parameters pro přepínání mezi metrikami (Sales, Profit, Quantity)
- Optimalizace pomalé measure pro top 100 produktů
- Zabezpečení — Sales menagers vidí jen svůj region (RLS), Finance nikdy nevidí Salary (OLS)
Datové zdroje
Tabulky, které budeme používat:
- FactInternetSales — hlavní fact tabulka (internetové tržby)
- FactResellerSales — tržby resellers (přidáme později)
- DimProduct, DimCustomer, DimDate, DimGeography, DimSalesTerritory — lookup tabulky
Úkol 1: Vytvořte Calculation Group pro časové srovnání
Tabular Editor → Connect → vyberte lokální Power BI Desktop model
Pravý klik na Tables → New → Default
Pojmenujte ji "TimeIntelligence"
Vyberte tabulku "TimeIntelligence" → Properties → Type: "Calculation Group"
Měl by se vytvořit automaticky s typem "Calculation Group Member"
Pokud ne, přidejte ručně: Columns → New Column → Name: "Period", Type: "Calculation Group"
Pravý klik na TimeIntelligence → New Calculation Item
Item 1: "Current"
CALCULATE ( SELECTEDMEASURE () )
Item 2: "Previous Year"
CALCULATE ( SELECTEDMEASURE (), DATEADD ( DimDate[FullDateAlternateKey], -1, YEAR ) )
Item 3: "YoY %"
VAR Current = CALCULATE ( SELECTEDMEASURE () ) VAR Prior = CALCULATE ( SELECTEDMEASURE (), DATEADD ( DimDate[FullDateAlternateKey], -1, YEAR ) ) RETURN DIVIDE ( Current - Prior, Prior )
Pro "YoY %": pravý klik na Item → Edit Properties → Format String: 0.00%
V Tabular Editoru: Home → Deploy → uložte změny do modelu
Řešení: Musíte přidat sloupec "Period" do vizualizace. Jakmile ho přidáte, budou dostupné všechny položky CG (Current, Previous Year, YoY%).
Úkol 2: Implementujte Field Parameters pro dynamické metriky
Power BI Desktop → Modeling tab → New Field Parameter
Pojmenujte: "Metric Selector"
Vyberte sloupce/measures (např. SalesAmount, OrderQuantity, Profit)
Power BI automaticky vytvoří measure "Metric Selector" se SWITCH logikou
Uživatel si zvolí metriku → měra se změní dynamicky
Ověřte chování: Filtrujte měsíc (např. červenec 2024), pak v Metric Selectoru přepínejte mezi metrikami. Měra by se měla změnit, ale filtr na datum zůstane.
Úkol 3: Optimalizujte pomalou measure
Scenář: Tržby Top 100 produktů (pomalá measure)
Vytvořte measure, která vrátí součet tržeb jen pro top 100 produktů dle ceny (problematické):
SalesTop100ProductsPomalé = SUMX ( TOPN ( 100, DimProduct, DimProduct[ListPrice], DESC ), CALCULATE ( SUM ( FactInternetSales[SalesAmount] ) ) ) -- CALCULATE bez filtru uvnitř SUMX přes DimProduct: -- row context → filter context přes relaci = 100 volání SE (CallbackDataID)
Power BI Desktop → View → Performance Analyzer → Start recording
Klikněte na vizualizaci (tato measure) → Stop recording
Zaznamenejte čas (pravděpodobně > 2000ms — POMALÉ!)
DAX Studio → Server Timings → vidíte FE vs. SE čas
Pravděpodobně vidíte CallbackDataID — FE volá SE v každé iteraci
SalesTop100ProductsRychle = CALCULATE ( SUM ( FactInternetSales[SalesAmount] ), TOPN ( 100, DimProduct, DimProduct[ListPrice], DESC ) ) -- TOPN jako přímý filter argument CALCULATE → SE zpracuje celé najednou -- žádná iterace, žádný CallbackDataID
Performance Analyzer znovu — měla by být značně rychlejší (< 100ms)
IsTop100 = RANKX(ALL(DimProduct), DimProduct[ListPrice],, DESC) <= 100 v DimProduct.
Úkol 4: Přidejte RLS a OLS zabezpečení
Row Level Security (RLS) — prodejce vidí jen svůj region
Modeling → Manage roles → New role → pojmenujte "Sales Manager"
Pro roli "Sales Manager" přidejte filtr:
[SalesTerritoryCountry] = USERPRINCIPALNAME ()
(Toto předpokládá, že username = zemi. V praxi byste měli lookup tabulku.)
Modeling → Manage roles → View as → vyberte roli
Měli byste vidět jen data daného regionu
Object Level Security (OLS) — Finance nevidí Salary
Security → New role → pojmenujte "Finance_ReadOnly"
V Tabular Editoru: vyberte roli → záložka Column Permissions → najděte DimEmployee[Salary] → nastavte Permission: None.
Pozor: Hidden: True pouze skryje sloupec z field listu — data jsou stále přístupná přes DAX dotazy. Skutečné OLS zabezpečení vyžaduje nastavení Permission: None v roli, nikoli jen skrytí.
Tabular Editor → Deploy
Ověřte, že sloupec je skrytý pro role bez přístupu
Shrnutí kurzu GOC6441
Co jsme se naučili
Kapitola 1: Opakování — Relace, kontexty, sloupce vs. measures vs. tabulky, Visual Calculations
Kapitola 2: Dynamické reporty — Dynamic Measures (SWITCH), Calculation Groups, Field Parameters, Časové kalkulace, OLS zabezpečení
Kapitola 3: DAX jako jazyk — EVALUATE, SUMMARIZE, Paginated Reports, DAX Studio pro analýzu
Kapitola 4: VertiPaq — Column store architektura, kompresní algoritmy, SE vs. FE, datové typy, optimalizace
Kapitola 5: Ladění measures — Performance Analyzer, Server Timings, optimalizační vzory, VAR
Kapitola 6: Režimy připojení — Import, DirectQuery, Live Connection, Composite Models
Kapitola 7: Workshop — Praktické aplikace na reálném modelu
Doporučené dalšívýchledu
- M Language (Power Query): Hluboké porozumění Data Modeling pipelinům
- Advanced DAX patterns: Semi-additive measures, complex time intelligence, what-if analysis
- Premium Capacities: Incremental refresh, aggregations, XMLA endpoint
- Paginated Reports: Pokud pracujete s SSRS nebo Power BI Paginated Reports
- Analysis Services Tabular: SSAS se liší od Power BI, ale DAX principy jsou stejné
Zdroje a komunita
- Sqlbi.com: Nejlepší site pro DAX tutoriály a best practices
- DAX Guide (dax.guide): Kompletní reference všech DAX funkcí
- Power BI Community (community.powerbi.com): Fórum pro otázky
- Tabular Editor community: Open-source nástroj, aktivní komunita
- Marco Russo & Alberto Ferrari: Autoritní názory na DAX