6faadec612ec4ef79236737788d78706

DAX – funkcje ISFILTERED oraz ISCROSSFILTERED

W DAX Istnieją dwie specjalne funkcje pozwalające sprawdzić mechanizm propagowania kontekstu filtra chodzi mianowicie o ISFILTERED oraz ISCROSSFILTERED, które chciałbym opisać w niniejszym artykule.

Wspomniane funkcje działają następująco:

  • ISFILTERED – zwraca TRUE lub FALSE w zależności czy kolumna przekazana jako argument jest bezpośrednio filtrowana
  • ISCROSSFILTERED – zwraca TRUE lub FALSE w zależności od tego czy kolumna przekazana jako argument jest filtrowana z powodu automatycznej propagacji filtra

Sprawdźmy ich działanie co pozwoli lepiej zrozumieć propagację filtra. Poniżej przedstawione zostały dwie miary sprawdzające kontekst wykonania oraz wynik ich działania w tabeli przestawnej. W wierszach tejże tabeli umieszczona została kolumna Size, a w fragmentatorze natomiast kolumna Color.

IsColorFiltered :=
ISFILTERED ( 'DimProduct'[Color] )

IsSizeFiltered :=
ISFILTERED ( 'DimProduct'[Size] )

Jak można zauważyć kolumna Color nie jest w żaden sposób filtrowana ani na poziomie wierszy, ani na poziomie Grand Total tabeli przestawnej. Nie zmienia tego fakt, iż w fragmentatorze znajdują się wartości właśnie tej kolumny – dzieje się tak ze względu na to, że nie została wybrana żadna konkretna wartość tylko wszystkie – co jest równe z brakiem filtracji.

Inaczej ma się sprawa z kolumną Size, która na poziomie wierszy jest filtrowana przez konkretną wartość tegoż wiersza. Na poziomie Grand Total stworzona miara zwraca FALSE ponieważ tak naprawdę żaden filtr tam nie występuje i jest to agregacja wszystkich wartości atrybutu Size. W przypadku gdy zaznaczona zostanie wartość we fragmentatorze funkcja ISFILTERED wyniki prezentują się następująco:

Tym razem kolumna kolor została teraz przefiltrowana zarówno na poziomie wierszy (ponieważ wyświetlana teraz jest wartość dla wszystkich rozmiarów, które nie są czarne) jak i na poziomie Grnad Total ponieważ agregacja wyświetlana w tym miejscu pokazywała by wartość dla wszystkich rozmiarów oraz wszystkich kolorów nie licząc koloru czarnego. Jeśli chodzi o kolumnę Size to jest ona filtrowana tak jak poprzednio tj. poziom wierszy jest filtrowany przez atrybut umieszczony w sekcji wierszy natomiast podsumowanie nie jest bezpośrednio filtrowane.

ISCROSSFILTERED z kolei służy do identyfikacji tego czy filtr został przekazany w sposób niebezpośredni. Tak wiec stworzono dwie kolejne miary

IsColorCrossFiltered :=
ISCROSSFILTERED ( 'DimProduct'[Color] )

IsSizeCrossFiltered :=
ISCROSSFILTERED ( 'DimProduct'[Size] )

Wynik działania powyższych formuł został dodany do testowej tabeli przestawnej.

Jak widać miara IsColorCrossFiltered przyjmuje wartość TRUE ponieważ na poziomie wiersza wartość została zmieniona niebezpośrednio przez znajdujące się w wierszach wartości kolumny Size.

Do czego przydatne są tego typu funkcje? Dzięki nim możemy zdeterminować czy użytkownik przefiltrował jakieś pole czy też nie np. w przypadku gdy mamy do czynienia z semiaddytywnymi lub nieaddytywnymi miarami możemy zaszyć w nich logikę, iż coś musi zostać wybrane aby wyświetlić wartość – w takim przypadku funkcja ISFILTERED może okazać się niezbędna. Takich scenariuszy z całą pewnością znajdziecie całkiem sporo, a znajomość przedstawionych funkcji może okazać się przydatna.

Leave a Reply