Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Komunikaty błędów DAX

Funkcji CALCULATE nie można użyć w wyrażeniu filtru - warunek z miarą w CALCULATE

W skrócie

  • Komunikat „Funkcja „PLACEHOLDER” została użyta w wyrażeniu logicznym (True/False), które jest używane jako wyrażenie filtru tabeli” to błąd CALCULATE z warunkiem, w którym jest miara. Zagnieżdżone CALCULATE daje ten sam tekst z nazwą CALCULATE.
  • Warunek logiczny w argumencie filtru CALCULATE może według dokumentacji Microsoft odwoływać się do kolumn jednej tabeli, ale nie do miar ani do zagnieżdżonego CALCULATE, bo filtruje wartości kolumny, a nie wynik obliczenia.
  • Warunek na wyniku miary zapisz przez FILTER po VALUES z kolumną marki, próg z miary policz wcześniej w zmiennej VAR, a zamiast miary użyj funkcji agregującej.

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.

Jak to wygląda w praktyce

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.

Dlaczego tak się dzieje

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.

Co zrobić krok po kroku

  1. Warunek na wyniku miary zapisz przez FILTER po liście wartości kolumny, na której ma działać próg. Kliknij prawym przyciskiem tabelę FaktSprzedaz w panelu Dane, wybierz Nowa miara i wpisz formułę. Na modelu Nordvelli w sumie daje ona 445 753 598,02 zł: Kelvani 125 987 457,81 zł, Auroneo 107 095 277,39 zł, Zentaro 107 057 855,76 zł i Bexoria 105 613 007,06 zł. Marka Nordvella z 22 021 411,15 zł zostaje pusta.
    Sprzedaż marek powyżej 100 mln =
    CALCULATE(
        [Łączna sprzedaż],
        FILTER(
            VALUES(DimProdukty[Marka]),
            [Łączna sprzedaż] > 100000000
        )
    )
  2. Sprawdź, czy próg ma sens na poziomie wizualizacji. Ta sama miara w tabeli po regionach jest pusta w każdym regionie, także w regionie Online ze 141 772 848,59 zł sprzedaży, bo w żadnym regionie pojedyncza marka nie przekracza 100 mln zł (najwięcej, 38 082 111,39 zł, ma jedna marka w regionie Online). VALUES bierze marki widoczne w bieżącym kontekście, więc warunek liczy się dla marki w danym regionie, a nie dla marki w całej sieci.
  3. Gdy porównujesz kolumnę z wynikiem miary, policz próg wcześniej w zmiennej VAR. Zmienna dostaje wartość przed wejściem do CALCULATE, więc w warunku jest już zwykłą liczbą. Na modelu Nordvelli średnia transakcja to 4 304,35 zł, a transakcji powyżej średniej jest 35 584 z 108 675, za 310 903 580,18 zł.
    Sprzedaż powyżej średniej transakcji =
    VAR prog = [Średnia wartość transakcji]
    RETURN
        CALCULATE([Łączna sprzedaż], FaktSprzedaz[WartoscNetto] > prog)
  4. Gdy próg da się zapisać funkcją agregującą na kolumnie, możesz podać ją wprost w warunku. Dokumentacja Microsoft dopuszcza w warunku logicznym funkcję agregującą zwracającą jedną wartość. Warunek 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.
  5. Gdy FILTER ma przejść po wszystkich markach, a wynik ma dalej słuchać filtra marki w wizualizacji, owiń go w KEEPFILTERS. Bez KEEPFILTERS miara z 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)
        )
    )
  6. Nie zastępuj prostego warunku na kolumnie przez FILTER po całej tabeli. Według dokumentacji Microsoft warunek logiczny na kolumnie silnik filtruje wydajniej niż tabelę zwróconą przez FILTER, dlatego FILTER zostaw na warunki z miarą, a warunek typu 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ł
FILTER po liście marek, a w warunku miara Łączna sprzedaż porównana ze 100 mln. Formuła przed zatwierdzeniem, pole Nazwa na wstążce pokazuje jeszcze domyślne Miara.

Jak sprawdzić, że problem zniknął

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.

Źródła i sposób sprawdzenia

  • Microsoft Learn: CALCULATE function (DAX), sekcja Boolean filter expressions (źródło)
  • Microsoft Learn: Avoid using FILTER as a filter argument (źródło)
  • Microsoft Learn: KEEPFILTERS function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: miara i zagnieżdżone CALCULATE w warunku, FILTER po markach i po produktach, próg w zmiennej VAR, AVERAGE w warunku i KEEPFILTERS.

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

Najczęściej zadawane pytania

Co oznacza PLACEHOLDER w błędzie CALCULATE?
Komunikat o funkcji PLACEHOLDER użytej w wyrażeniu logicznym pojawia się, gdy warunek filtru w CALCULATE zawiera miarę. Na modelu Nordvelli dały go warunek z samą miarą, warunek łączący kolumnę z miarą i porównanie kolumny z miarą. Zagnieżdżone CALCULATE w warunku daje ten sam komunikat z nazwą CALCULATE.
Jak użyć miary w filtrze CALCULATE?
Przenieś warunek do FILTER i podaj w nim listę wartości kolumny, na przykład FILTER(VALUES(DimProdukty[Marka]), [Łączna sprzedaż] > 100000000). FILTER sprawdza warunek dla każdej marki osobno, a CALCULATE używa zwróconej tabeli jako filtra. Na modelu Nordvelli taka miara daje 445 753 598,02 zł dla czterech marek powyżej progu.
Dlaczego FILTER po tabeli produktów zwraca pustą wartość?
FILTER po całej tabeli DimProdukty sprawdza warunek dla każdego produktu osobno, więc próg 100 mln zł dotyczy sprzedaży jednego produktu. Na modelu Nordvelli największa sprzedaż pojedynczego produktu to 32 225 603,53 zł, więc żaden produkt nie przechodzi. Próg dla marki wymaga FILTER po VALUES(DimProdukty[Marka]).
Czy w warunku CALCULATE można użyć AVERAGE albo MAX?
Tak, dokumentacja Microsoft dopuszcza w warunku logicznym funkcję agregującą, która zwraca jedną wartość. Na modelu Nordvelli warunek FaktSprzedaz[WartoscNetto] > AVERAGE(FaktSprzedaz[WartoscNetto]) dał 310 903 580,18 zł, tyle samo co wersja z progiem w zmiennej VAR. Miara w tym samym miejscu zgłasza błąd z PLACEHOLDER.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...