V Tabulárním modelu mohou být sloupce v tabulce filtrované přímo nebo nepřímo. Funkce ISFILTERED() vrací hodnotu TRUE, pokud je sloupec nebo tabulka uvedená v argumentu této funkce filtrována přímo. Funkce ISCROSSFILTERED() vrací hodnotu TRUE, pokud je sloupec nebo tabulka uvedená v argumentu této funkce filtrována přímo a nebo nepřímo. Sloupec je filtrovaný nepřímo, pokud jsou hodnoty v tomto sloupci filtrovány pomocí jiného sloupce ze stejné tabulky. Sloupec nebo tabulka mohou být filtrovány nepřímo také v případě propagace filtru z jiné tabulky prostřednictvím relace.
Funkce ISFILTERED a ISCROSSFILTERED
V první ukázce si můžeme ve cvičném Power BI souboru Adventure Works DW 2020.pbix si vytvořit následující dvě jednoduchá měřítka.
Měřítka:
Pokud obě nová měřítka vložíme v Power BI reportu do vizuálu Tabulka, spolu s hodnotami ze sloupce 'Product'[Color] v řádcích tabulky, můžeme vidět rozdíl mezi funkcí ISFILTERED() a funkcí ISCROSSFILTERED().
Měřítko [IsFiltered Category] vrací v každém řádku tabulky hodnotu FALSE, protože při vyhodnocení měřítka nepůsobí na sloupec 'Product'[Category], uvedený v argumentu této funkce, žádný přímý filtr. Měřítko [IsCrossFiltered Category] pak vrací v každém řádku tabulky hodnotu TRUE, kromě řádku souhrnů. V řádcích tabulky jsou barvy produktů, které jsou ve stejné tabulce jako kategorie produktů. Pokud je filtrován sloupec s barvami produktů, nepřímo je filtrován také sloupec s kategoriemi produktů.
Při vyhodnocení funkcí ISFILTERED() a ISCROSSFILTERED() není důležité, z jakého vizuálu filtry pochází. Filtry mohou vznikat v řádcích tabulky, v grafech, v průřezech, ve filtrech stránky reportu atd. Pokud například přidáme do reportu průřez s kategoriemi produktů, a vybereme pouze některé kategorie, výsledek bude vypadat následovně.
Nyní již obě měřítka vrací v každém řádku tabulky hodnotu TRUE. Měřítko [IsCrossFiltered Category] vrací hodnotu TRUE také v řádku souhrnů, kde nepůsobí na výpočet žádný filtr ze sloupce s barvami produktů. V řádku souhrnů působí na obě měřítka pouze filtr z průřezu. Je tedy zřejmé, že funkce ISCROSSFILTERED() vrací hodnotu TRUE když je sloupec uvedený v argumentu této funkce filtrovaný nepřímo, ale i když je sloupec uvedený v argumentu této funkce filtrovaný přímo, protože v řádku souhrnů působí na měřítko [IsCrossFiltered Category] pouze přímý filtr nastavený na konkrétní kategorie v průřezu.
To, že působí na konkrétní sloupec filtr, ať už přímý nebo nepřímý, ještě nemusí znamenat, že v době vyhodnocení nejsou v aktuálním kontextu dostupné všechny hodnoty z použitého sloupce. V modelu si můžeme vytvořit měřítko, které bude počítat počet jedinečných hodnot ze sloupce 'Product'[Category], které jsou dostupné v aktuálním kontextu vyhodnocení.
Měřítko:
V použitém modelu jsou v tabulce 'Product' produkty rozděleny do čtyř kategorií. Pokud měřítko [Počet hodnot Category] bude vracet hodnotu 4, znamená to, že v aktuálním kontextu jsou dostupné všechny čtyři kategorie. Pokud přidáme nové měřítko do původního vizuálu tabulky, a v průřezu vybereme všechny čtyři kategorie, výsledek může vypadat následovně.
Jak můžeme vidět na obrázku výše, měřítka [IsFiltered Category] a [IsCrossfiltered Category] vrací v každém řádku tabulky hodnotu TRUE, včetně řádku souhrnů. To ale ještě neznamená, že filtry působící na sloupec s kategoriemi produktů, ať už přímo, nebo nepřímo, musí omezovat počet položek ze sloupce s kategoriemi produktů dostupných v aktuálním kontextu vyhodnocení. V průřezu jsou filtrované všechny čtyři kategorie, a pokud se současně produkty ve vybrané barvě prodávají ve všech kategoriích, v aktuálním řádku budou dostupné všechny čtyři kategorie, i když je sloupec s kategoriemi produktů filtrovaný přímo i nepřímo. V prvních dvou řádcích tabulky jsou proto i přes filtry nastavené v průřezu a v řádcích tabulky dostupné všechny čtyři kategorie produktů. To samé platí pro řádek souhrnů. Pokud je hodnota měřítka [Počet hodnot Category] v řádcích vizuálu menší než 4, znamená to že ve vybrané barvě se neprodávají produkty ze všech kategorií.
Filtry nastavené na konkrétní sloupec v jedné tabulce mohou nepřímo filtrovat také hodnoty v tabulce provázané pomocí relace, pokud to směr filtrace umožňuje.
V použitém cvičném modelu filtry nastavené na sloupce z tabulky 'Product' filtrují automaticky také tabulku 'Sales', právě díky relaci mezi těmito tabulkami. Do modelu si můžeme přidat následující dvě měřítka, abychom si výše popsanou vlastnost mohli znázornit.
Měřítka:
Pokud vložíme obě nová měřítka do vizuálu tabulky, opět s barvami produktů v řádcích, které budou tvořit filtr v každém řádku vizuálu nastavený na konkrétní barvu, výsledek může vypadat následovně.
Jak je možné vidět na výše uvedeném obrázku, filtr nastavený na konkrétní barvy filtruje nepřímo celou tabulku 'Sales', ale také konkrétní sloupce z této tabulky. Filtr nastavený na kterýkoliv sloupec v tabulce 'Product' automaticky filtruje také sloupce v tabulce 'Sales', díky relaci nastavené mezi těmito dvěma tabulkami.
Příklady uvedené v tomto příspěvku samozřejmě nemají žádné praktické využití. Funkce ISFILTERED() a ISCROSSFILTERED() obvykle používáme jako součást komplexních DAX výrazů. Praktické příklady, některé také s využitím funkce ISFILTERED(), můžete najít na stránce DAX – Příklady.
Cílem příspěvku bylo vysvětlit fungování funkcí ISFILTERED() a ISCROSSFILTERED(). Současně mohou být ukázky uvedené v tomto příspěvku dobrým cvičením, jak funguje propagace filtrů mezi sloupci v jedné tabulce nebo mezi tabulkami spojenými relacemi. Důležité je také mít na paměti, že i když je některý sloupec filtrovaný, ať už přímo nebo nepřímo, nemusí to vždy znamenat, že v aktuálním kontextu vyhodnocení nejsou dostupné všechny hodnoty z tohoto sloupce.
Oficiální Microsoft dokumentace funkcí ISFILTERED a ISCROSSFILTERED:
https://docs.microsoft.com/cs-cz/dax/isfiltered-function-dax
https://docs.microsoft.com/cs-cz/dax/iscrossfiltered-function-dax
Komentáře
Okomentovat