Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - Komunikaty błędów DAX
Funkcji CALCULATE nie można użyć w wyrażeniu filtru - warunek z miarą w CALCULATE
Zarząd Nordvelli chce znać sprzedaż tylko tych marek, które przekroczyły 100 mln zł obrotu. Warunek z miarą wpisany wprost jako filtr CALCULATE daje jednak błąd, a w komunikacie pojawia się słowo PLACEHOLDER. Pokazujemy, co ono oznacza, dlaczego warunek z miarą nie przechodzi i jak zapisać go przez FILTER albo zmienną, żeby wynik był taki, jakiego oczekujesz.
Zarząd Nordvelli chce znać sprzedaż tylko tych marek, które przekroczyły 100 mln zł obrotu. Warunek wpisany wprost do CALCULATE wygląda tak:
Sprzedaż dużych marek = CALCULATE([Łączna sprzedaż], [Łączna sprzedaż] > 100000000)
Silnik odpowiada: „Funkcja „PLACEHOLDER” została użyta w wyrażeniu logicznym (True/False), które jest używane jako wyrażenie filtru tabeli. Jest to niedozwolone.” (w angielskiej wersji: „A function 'PLACEHOLDER' has been used in a True/False expression that is used as a table filter expression. This is not allowed.”). Ten sam komunikat dostaliśmy dla warunku łączącego kolumnę z miarą, DimProdukty[Marka] = "Zentaro" && [Łączna sprzedaż] > 100000000, i dla porównania kolumny z miarą, FaktSprzedaz[WartoscNetto] > [Średnia wartość transakcji].
Gdy w warunku jest drugie CALCULATE, w komunikacie pojawia się jego nazwa. Warunek DimProdukty[CenaNetto] > CALCULATE(AVERAGE(DimProdukty[CenaNetto]), ALL(DimProdukty)) daje „Funkcja „CALCULATE” została użyta w wyrażeniu logicznym (True/False), które jest używane jako wyrażenie filtru tabeli. Jest to niedozwolone.” (w angielskiej wersji: „A function 'CALCULATE' has been used in a True/False expression that is used as a table filter expression. This is not allowed.”). Tak samo kończy się zmienna VAR z CALCULATE zapisana wewnątrz warunku.
CALCULATE przyjmuje dwa rodzaje filtrów: warunek logiczny, czyli wyrażenie zwracające prawdę albo fałsz, i wyrażenie tabelowe. Według dokumentacji Microsoft warunek logiczny może odwoływać się do kolumn jednej tabeli, nie może odwoływać się do miar ani używać zagnieżdżonego CALCULATE, a funkcje przeglądające tabelę wolno w nim podać tylko jako argument funkcji agregującej. Słowo PLACEHOLDER w komunikacie oznacza w praktyce miarę: na modelu Nordvelli dały go wszystkie trzy warianty z miarą w warunku.
Druga sprawa to poziom, na którym ma działać warunek. „Marki powyżej 100 mln” to warunek na sumie dla marki, a nie na pojedynczej transakcji ani na produkcie. Zapis FILTER(DimProdukty, [Łączna sprzedaż] > 100000000) nie zgłasza błędu, ale zwraca pustą wartość, bo sprawdza każdy produkt osobno, a największa sprzedaż pojedynczego produktu Nordvelli to 32 225 603,53 zł. Tabela w FILTER wyznacza poziom, na którym silnik liczy miarę z warunku. Dzieje się tak dzięki przejściu kontekstu, które opisujemy w poście kolumna obliczeniowa z CALCULATE liczy coś innego niż bez niej.
Zobacz też: Szkolenie Zaawansowany DAX w Power BI
Sprzedaż marek powyżej 100 mln =
CALCULATE(
[Łączna sprzedaż],
FILTER(
VALUES(DimProdukty[Marka]),
[Łączna sprzedaż] > 100000000
)
)Sprzedaż powyżej średniej transakcji =
VAR prog = [Średnia wartość transakcji]
RETURN
CALCULATE([Łączna sprzedaż], FaktSprzedaz[WartoscNetto] > prog)FaktSprzedaz[WartoscNetto] > AVERAGE(FaktSprzedaz[WartoscNetto]) dał ten sam wynik co wersja ze zmienną, 310 903 580,18 zł, a miara [Średnia wartość transakcji] w tym samym miejscu zgłasza błąd z PLACEHOLDER.FILTER(ALL(DimProdukty[Marka]), warunek) pokazuje 445 753 598,02 zł w wierszu każdej marki, także przy marce Nordvella, bo nadpisuje filtr wiersza. Z KEEPFILTERS każda marka dostaje własną sprzedaż, a Nordvella zostaje pusta. Działanie KEEPFILTERS przy fragmentatorach opisujemy w poście CALCULATE nadpisuje wybór we fragmentatorze.Sprzedaż dużych marek w wierszu =
CALCULATE(
[Łączna sprzedaż],
KEEPFILTERS(
FILTER(ALL(DimProdukty[Marka]), [Łączna sprzedaż] > 100000000)
)
)DimSklepy[Typ] = "E-commerce" wpisuj wprost do CALCULATE. O wydajności takich miar piszemy w poście o wolnej mierze z FILTER na całej tabeli.![Formuła miary Sprzedaż marek powyżej 100 mln z FILTER(VALUES(DimProdukty[Marka])) w pasku formuł](https://jsystems.pl/new_page_resources/images/POWER_BI_KURS/L14_K16_formula_marki_100_mln.png?v=20261016)
Po poprawce porównaj nową miarę z miarą bazową w macierzy po markach. Na modelu Nordvelli dla każdej marki powyżej progu obie kolumny są równe, marka Nordvella ma pustą komórkę, a suma 445 753 598,02 zł to łączna sprzedaż 467 775 009,17 zł minus 22 021 411,15 zł marki Nordvella. Gdy suma nie zgadza się z taką różnicą, sprawdź, po jakiej kolumnie przechodzi FILTER.
W warunkach CALCULATE używaj kolumn i stałych, a miary przenoś do FILTER albo do zmiennej przed CALCULATE. Gdy po wpisaniu formuły widzisz słowo PLACEHOLDER, szukaj w warunku nazwy miary.
Zachowanie programu sprawdziliśmy w Power BI Desktop 2.157 (wydanie z sierpnia 2026 r.) z polskim interfejsem, a przykłady na modelu sieci Nordvella z bezpłatnego kursu Power BI. Microsoft wydaje nową wersję Power BI Desktop co miesiąc, więc nazwy przycisków i limity usługi mogą się zmieniać. Aktualne wartości podaje dokumentacja Microsoft Learn.
Wróć do listy: 131 najczęstszych pytań i problemów związanych z Power BI
Komentarze (0)
Brak komentarzy...