top of page

Dynamické dotazy v Power Query skrz parametry

  • Writer: Vojtěch Šíma
    Vojtěch Šíma
  • Mar 23
  • 9 min read

Updated: Apr 12

tl;dr Power Query podporuje parametry – jednoduché, statické dotazy, které fungují jako globální konstanty. Umožňují snadno aktualizovat hodnoty napříč všemi dotazy. Life hack: v Power BI Service je můžeš měnit přímo v nastavení datového modelu, aniž bys musel otevírat samotný report. Tento článek ti ukáže praktické způsoby, jak s parametry pracovat.

Tabulka obsahu:


Co je parametr v Power Query?

Parametry v Power Query jsou speciální objekty dotazů, které uchovávají hodnoty – buď jednu hodnotu, nebo seznam (například čísla, text, datumy atd.). Pomáhají dělat dotazy dynamičtějšími a snadněji udržovatelnými tím, že snižují potřebu pevně zadaných (hardcoded) hodnot. Můžeš je použít pro filtrování dat, nastavení cest k souborům nebo přepínání mezi prostředími. Tato funkce je ještě silnější v Power BI Service, kde lze hodnoty parametrů měnit přímo v nastavení datového modelu – není nutné otevírat report v Power BI Desktop. Prostě jednoduchý způsob, jak efektivně spravovat vstupy do dat.


Jak vytvořit parametr v Power Query?

V Power Query můžeš vytvořit parametr pomocí záložky Home a vybrání Manage Parameters → New. Případně, můžeš v sekci Queries/Dotazy kliknout pravým tlačítkem a vybrat New Parameter...


Pokud se na to cítíš, parameter se dá napsat i ručně skrz Blank Query.



add parameter
Přidej parametr přes ikonky

Add Parameter by right click
Přidej parametr pravým tlačítkem

Potom v okně Manage Parameter, po kliknutí New, vyplň požadované políčka,

Name, Description (volitelné, ale doporučuji vyplnit), Required, Type, Suggested Values, Current Value (případně Default Value).


Manage Parameters window
Manage Parameters okno

Většina je jasná, jen dej pozor, co vybíráš při políčkách Type a Suggested Values.

  • Type: Určuje, jaký datový typ bude akceptovatelný pro tvoje hodnoty

Mega důležité: nikdy nenechávej parametr jako Any jelikož se ochuzuješ o funkcionalitu v Power BI Service, která ti dovolí parametr měnit. To samé platí pro Binary, nicméně tento typ pravděpodobně doborovlně nepoužiješ.
  • Suggested Values: Mění způsob, jak volíš Current Value:

    • Any value: Manuálně vložená jedna hodnota

    • List of values:

      • Seznam hodnot můžeš zadat ručně přes okno podobné funkci Enter Data

      • Uživatel může zadat i jinou hodnotu mimo seznam.

      • Dovoluje dodatečnou hodnotu Default Value, která slouží jako popis při najetí myší.

      • Uživel může volit hodnoty skrz dropdown menu v Power Query a zároveň v report sekci v Power BI Desktop skrz Edit Parameters.

    • Query:

      • Dovoluje použít existující List Query jako zdroj hodnot

      • Current Value je pořád manuální

      • Uživel může volit hodnoty skrz dropdown menu v report sekci v Power BI Desktop skrz Edit Parameters.

      • Tato možnost neposkytuje dropdown menu v Power Query

Poznámka: Power BI Service neumožňuje dropdown menu pro žádnou z variant

Jak upravit parametr v Power BI Service

Jakmile máš parametr nastavený a publikuješ svůj datový model (semantic model) do libovolného pracovního prostoru, můžeš hodnoty parametrů měnit v nastavení modelu, v sekci Parameters:



Edit Parameters in Power BI Service
Úprava parametrů v Power BI Service
Poznámka: Power BI Service nenabízí rozbalovací menu (dropdown menu) pro výběr hodnoty parametru. Pokud nejde hodnota změnit (je zašedlá), změň její typ z Any nebo Binary na jiný přímo v Power Query.

To je vše k úvodu—teď mrkneme na nějaké konkrétní scénáře z praxe.


Synchronizovaný datumový filtr napříč dotazy

Podívejme se na pár reálných příkladů. Pomocí parametru years_to_load si můžeme nastavit parametrizovaný časový rozsah, který se bude používat ve všech dotazech—je snadno upravitelný a plně centralizovaný.


Chceme pracovat s časovým rozsahem. Okáčko. Co k tomu potřebujeme vlastně? Pojďme vytvořit jednotlivé části jako jednoduché dotazy využívající tento parametr.


startDate

Tento dotaz nám určí začátek časového rozsahu. Vytvoř nový prázdný dotaz a vlož do něho tento krátký kód:

= Date.From( Date.StartOfYear( Date.AddYears( DateTime.LocalNow(), -years_to_load ) ) )

Jak kód pracuje krok po kroku:

  1. Získá aktuální datum a čas (např. 22. 3. 2025 + čas).

  2. Odečte počet let zadaný v parametru (např. 3), výsledkem je 22. 3. 2022 + čas.

  3. Upraví datum na začátek daného roku, tedy 1. 1. 2022 + čas.

  4. Převede hodnotu z typu datetime na typ date, čímž odstraní časovou složku.

  5. Finální výsledek: #date(2022, 1, 1) — čistá datumová hodnota.


endDate

Tento dotaz určí konec našeho časového rozsahu. Vytvoř nový prázdný dotaz a vlož tento jednořádkový kód:

= Date.From( Date.EndOfYear( DateTime.LocalNow() ) )

Tento dotaz se provádí krok po kroku následovně:

  1. Získá aktuální datum a čas (např. 22. 3. 2025 + čas).

  2. Upraví datum na konec aktuálního roku, výsledkem je 31. 12. 2025 + čas.

  3. Převede hodnotu z typu datetime na typ date, čímž odstraní časovou složku.

  4. Finální výsledek: #date(2025, 12, 31) — čistá datumová hodnota.


Implementace do dotazu

Nyní máme vše potřebné a směle to můžeme napráskat do našich dotazů. Pokud používáš krok Filtered rows (Filtrované řádky) pro nastavení rozsahu dat, jednoduše do něj přidej náš rozsah pomocí parametru.

= Table.SelectRows(previousStep, each [date]>= startDate and [date]<=endDate )

Pokud si píšeš svoje SQL, můžeš rozsah přidat takto:

"select
column1,
column2
from tbl
where date_column between '" & Date.ToText(startDate, "yyyy-MM-dd") & "' and '" & Date.ToText(endDate, "yyyy-MM-dd") & "'"
Datum převádím na text pomocí pevně daného formátu, který je široce podporovaný většinou SQL enginů. Případně si můžeš druhý parametr ve funkci Date.ToText upravit podle svých potřeb.
SQL with parametrized date range
SQL s parametrizovaným časovým rozsahem

A to je celé! Pokud chceš jít ještě o krok dál, můžeš si z toho udělat funkci, ale i v této podobě ti to pokryje většinu běžných scénářů. A co je nejlepší — když bude chtít uživatel vidět data za více nebo méně let, stačí změnit parametr v Power BI Service. Při dalším refreshi se rozsah dat automaticky aktualizuje.


Filtrování stejného seznamu hodnot napříč dotazy

Další skvělý příklad, kde se hodí centralizace filtrů pomocí parametrů, je situace, kdy chceš aplikovat stejný filtr v celém reportu – včetně všech poddotazů. Například pokud chceš pracovat pouze s produkty A, B a C napříč všemi produktově orientovanými dotazy. Podívejme se, jak to můžeš nastavit.


Vytvoř parametr

Začneme vytvořením parametru, který bude uchovávat informace o produktech a zároveň řídit všechny související dotazy. Může se zdát logické vytvořit parametr jako seznam hodnot – nicméně parametry v Power BI mohou mít pouze jednu aktuální hodnotu (Current Value), takže tento přístup nebude fungovat.


Místo toho si seznam postavíme jako textový řetězec.


Pojďme inicializovat parametr jako typ Text, s možností Libovolná hodnota (Any value), například takto:


Products parameter
Parametr produktu

Transformuj parametr

Teď, když máme parametr připravený, musíme udělat pár úprav, abychom ho mohli efektivně použít jako filtr. Ukážu ti dva přístupy: jeden pro použití se standardní funkcí List.Contains a druhý pro použití v SQL pomocí klauzule IN.


Jde o univerzální postup, který si můžeš zabalit do vlastní funkce a znovu použít u všech parametrů, které slouží k filtrování.


List.Contains možnost

Otevři nový dotaz/query pomocí Blank Query a nakopíruj následující:

= List.Transform( Text.Split(products, ","), each Text.Trim(_) )

This query executes step by step as follows:

  1. Rozdělení parametru product podle čárky.

    1. Tento krok vytvoří seznam, kde každý prvek obsahuje hodnotu mezi jednotlivými oddělovači.

  2. Transformace nového seznamu a ořezání mezer na začátku a konci.

    1. Tento krok je volitelný, ale zajistí, že v seznamu nebudou žádné zbytečné mezery – bez ohledu na to, jestli byly hodnoty zadány s mezerami nebo bez.

    2. (Volitelně) Další čištění dat podle potřeby, například pomocí Text.Clean nebo převod na velká písmena pomocí Text.Upper.


SQL IN možnost

Otevři nový dotaz/query pomocí Blank Query a nakopíruj následující:

= Text.Combine( List.Transform(products_filter, each "'" & _ & "'"), ",")

This query executes step by step as follows:

  1. Znovu použijeme dříve vytvořený očištěný seznam (nebo ho sestavíme z parametru).

    1. Každou položku obalíme do jednoduchých uvozovek pomocí transformačního kroku.

  2. Spojíme celý seznam do jednoho textového řetězce odděleného čárkami.

    1. Každá hodnota je oddělena čárkou, přičemž za poslední položkou čárka není.

    2. Výsledkem je čistý textový řetězec, ideální pro použití v SQL klauzuli IN.


To samé, ale jako obrázek


From list to text
Ze seznamu na text

Implementace do dotazu

Nyní máme vše potřebné a směle to můžeme napráskat do našich dotazů. Pokud používáš krok Filtered rows (Filtrované řádky) pro filtrování produktů, jednoduše do něj přidej seznam produktů pomocí parametru.

= Table.SelectRows(previousStep, each List.Contains( products_filter, [product] ) )

Pokud si píšeš svoje SQL, můžeš rozsah přidat takto:

"select
column1,
column2
from tbl
where product_column in ("& products_filter_sql &")

Filter product via SQL
Filtrování produktu pomocí SQL

Spravuj definici připojení k zdrojům přes parametry

Dalším skvělým příkladem využití parametrů je jejich použití pro definici připojovacího řetězce k celému datovému modelu. Při vývoji reportů napříč vývojovým (dev) a produkčním (prod) prostředím může být ruční přepínání každého dotazu dost otravné. Místo toho můžeš použít Seznam hodnot (List of Values) s předdefinovanými připojovacími řetězci a snadno tak přepínat mezi prostředími.


Vytvoř parametr

Nakliej parametr jako hodnoty typuText pomocí List of Values:


Switcher parameter for SQL server environments
Přepínač prostředí pro SQL Server (parametr)

Implementace do dotazu

Implementace je docela přímočará. Můžeš použít jakoukoli funkci, která ti umožní definovat zdroj – stačí, aby byla zadaná hodnota platná. V našem případě se připojujeme k databázi SQL Server, kde název hostitele (serveru) určujeme pomocí parametru. Zároveň chceme spustit dříve vytvořený SQL dotaz – a tady je, jak to může vypadat:

sqlQuery = Value.NativeQuery(
        Sql.Database(sql_server_environments, "database"), filterProductSQL, [
            EnableFolding = true
        ]
    )

SQL Database with host as parameter
SQL databáze s hostitelem jako parametrem

V tomto kódu proměnná sql_server_environments obsahuje informace o hostiteli a je nastavena pomocí parametru. Proměnná filterProductSQL, kterou jsme definovali dříve, využívá další parametr pro zpřesnění filtrování dat.


Když se na kód podíváme blíž, můžeme ho ještě vylepšit. Momentálně je název databáze napsán napevno jako "database" – to se dá "fxinout" tak, že k jednotlivým prostředím přiřadíme odpovídající databázi, a tím centralizujeme správu na jednom místě.


Vytvořme si nový prázdný dotaz, ve kterém definujeme, která databáze patří ke kterému prostředí. Můžeš použít možnost Enter Data, ale pokud si chceš napsat do CVčka, že jsi profík v Mku, můžeš to napsat i ručně:


Vyrobil jsem pro tebe dvě varianty, obě vykouzlí to samé, jenom trošku jinak:


let
    // varianta se seznamem záznamů (record) – vyfiltruješ požadované prostředí a získáš pole 'db' z prvního záznamu
    definition =
    {
        [env = "prod-sqlserver.com", db = "prod_db"],
        [env= "dev-sqlserver.com", db = "dev_db"]
    },
    returnCurrentDatabase = List.Select(definition, each _[env]=sql_server_environments){0}[db]
in
	returnCurrentDatabase
let
    // varianta s jedním záznamem, kde každý název pole je název prostředí a jeho hodnota je název databáze – pak jen vybereš správné pole
    envMapping = [
        #"prod-sqlserver.com" = "prod_db",
        #"dev-sqlserver.com" = "dev_db"
    ],
    currentDatabase = Record.Field(envMapping, sql_server_environments)
in
    currentDatabase
Pokud jsi použil(a) možnost Enter Data, nezapomeň použít Table.SelectRows pro vyfiltrování správného prostředí a následně převést výsledek na jednu hodnotu – stejně jako v první variantě.

Teď pojďme upravit naši původní funkci Sql.Database, aby využívala nový, automatický a centralizovaný způsob určování správné databáze pro každé prostředí.

sqlQuery = Value.NativeQuery(
        Sql.Database(sql_server_environments, sql_server_database), filterProductSQL, [
            EnableFolding = true
        ]
    )

SQL Server database function with all parameters
Funkce pro připojení k SQL Serveru se všemi parametry

Zvážení a alternativy

Toto řešení má jednu očividnou nevýhodu – názvy databází jsou definovány přímo uvnitř reportu a ne přes parametry. Ale stejně jako jsme to udělali u nastavení produktů, můžeš tento přístup přepsat pomocí List of Values (Seznam hodnot), kde bude každý záznam jako textový řetězec oddělený čárkou, např.: prod-sqlserver.com, prod_db atd. Následně můžeš použít stejné dělení a transformační techniky k extrakci hodnot.


Jak už to bývá – existuje víc řešení pro stejný problém, tak si vyber to, které nejlépe sedí tvému scénáři.


Parametry v Power BI Deployment Pipeline Rules

Tato část článku se nezaměřuje na Power BI Deployment Pipelines jako celek, ale konkrétně na to, jak využít parametry v takzvaných Deployment Pipeline Rules.

Pokud máš předplatné Fabric, můžeš díky Deployment Pipelines jednodušeji nasazovat svoje reporty do různých prostředí. Jedna z výhod je, že když už máš v sémantickém modelu nastavené parametry, můžeš přes Deployment Pipeline Rules měnit jejich hodnoty při nasazení do další fáze – třeba do Test nebo Production.


Jak nastavit pravidla (rules)

Jakmile máš vytvořené tři pracovní pstory (workspaces) jako součást pipeline, otevři si jeden z nich a klikni na View Deployment Pipeline.


View deployment pipeline
View deployment pipeline

Tady si vyber prostředí, pro které chceš pravidlo nastavit, a dole klikni na ikonu blesku.


Deployment rules
Deployment rules

Uvidíš všechny Fabric položky, na které můžeš pravidla nastavit. Z vlastní zkušenosti – nově přidané věci tam hned neuvidíš. Musíš je nejdřív aspoň jednou nasadit, a pak se objeví pro nastavení pravidel.


Deployment rules
Deployment rules

Jakmile klikneš na konkrétní položku, můžeš si vybrat mezi Data source rules a Parameter rules. Obecně platí, že Data source rule ti dovolí změnit zdroj dat (pokud to daný zdroj umožňuje). Parameter rules umí něco podobného, ale jsou flexibilnější – můžeš s nimi upravovat nejen zdroj dat, ale třeba i filtry a další věci.



Add rule
Add rule

My chceme upravit Parameter rules, takže na ně klikni. Uvidíš dostupné parametry a jejich aktuální hodnoty. Když klikneš na Other, můžeš zadat novou statickou hodnotu. Zadej, co potřebuješ, klikni na Save – a je hotovo.



Select Other and enter your value
Select Other and enter your value

Podobně jako u parametrů v Power BI Service, ani tady není žádné skutečné rozbalovací menu – i když máš parametr nastavený jako seznam hodnot. Dropdownmenu je spíš takové ilustrační – ukáže původní hodnotu (Current Value), možnost Other, a tvoji poslední zadanou hodnotu (pokud se liší od původní "Current Value").



Next time I go to manage rules
Next time I go to manage rules

A to je vlastně všechno. Kdykoli pak nasadíš sémantický model do tohohle prostředí, hodnota parametru se automaticky změní. Pravidlo můžeš kdykoli změnit nebo smazat.


A pokud si to chceš otestovat, přejdi do cílového workspacu a ručně aktualizuj sémantický model. Nasazení totiž samo o sobě data neaktualizuje– na to nezapomeň.


Závěr

Parametry v Power Query jsou parádní způsob, jak udělat reporty flexibilnější a mnohem jednodušší na správu. Ať už synchronizuješ filtry podle dat, opakovaně používáš filtry na produkty napříč dotazy, nebo přepínáš mezi dev a prod prostředím bez zbytečného přepisování – parametry ti s tím pomůžou. A bonus? V Power BI Service je můžeš upravit přímo v nastavení datového modelu, takže není potřeba otevírat samotný report. V tomhle článku jsme si ukázali reálné scénáře, jak s nimi pracovat – trocha teorie, ale hlavně použití z praxe. Díky tomu si udržíš řešení přehledné, centralizované a hlavně bez zbytečné ruční práce.

Comments

Rated 0 out of 5 stars.
No ratings yet

Add a rating
bottom of page