Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - DAX liczy, ale nie to, czego oczekujesz
Grupa obliczeniowa psuje format liczb albo miary procentowe
Marża % wzrosła z 16,36% w 2024 do 16,42% w 2025, a element Zmiana procentowa z grupy obliczeniowej Czas pokazuje przy niej zero. Kwoty sprzedaży wyglądają dobrze, ale przy innych miarach grupa obliczeniowa psuje format: wskaźnik procentowy wychodzi w złotych, a miara tekstowa w tytule wykresu kończy się błędem. Wskazujemy element, który za to odpowiada, tłumaczymy, jak działa format w grupie obliczeniowej, i ustawiamy go tak, żeby każda miara wyglądała tak, jak powinna. Liczby pochodzą z grupy Czas w modelu Nordvelli.
Grupa Czas w modelu Nordvelli ma cztery elementy: Bieżący, YTD, Rok poprzedni i Zmiana procentowa. Tylko ostatni ma własne wyrażenie formatu, "0,0%;-0,0%;0,0%". Dla sprzedaży wszystko się zgadza: 126 734 270,47 zł w 2025 wobec 113 091 001,24 zł rok wcześniej to zmiana 0,1206, którą format pokazuje jako 12%. Kłopot zaczyna się przy innych miarach. Marża % ma w 2025 wartość 16,42%, a w 2024 16,36%. Element Zmiana procentowa liczy dla niej zmianę względną 0,0036, czyli 0,36%, a funkcja FORMAT z ciągiem tego elementu zwraca „00%”. Odbiorca widzi brak zmiany, choć marża wzrosła o 0,06 punktu procentowego.
Drugi objaw pojawia się, gdy ktoś nada elementowi format walutowy, na przykład #,0 "zł", żeby kwoty miały złotówki. Ten format dostają wtedy także miary procentowe: 16,42% marży z takim formatem daje „0 zł”. Trzeci objaw dotyczy miar tekstowych. Zapytanie z miarą Tytuł wykresu po elementach grupy Czas kończy się błędem „Nie można przekonwertować wartości „Sprzedaż przy rabacie 0%” typu Text na typ Numeric/Date.” (w angielskiej wersji: „Cannot convert value 'Sprzedaż przy rabacie 0%' of type Text to type Numeric/Date.”). Według dokumentacji Microsoft ten błąd pokazują wizualizacje, których dotyczy.
Element grupy obliczeniowej to reguła, w której SELECTEDMEASURE oznacza miarę położoną przez użytkownika w wizualizacji. Według dokumentacji Microsoft element domyślnie używa formatu tej miary, dlatego Bieżący, YTD i Rok poprzedni pokazują sprzedaż w złotych, a marżę w procentach. Gdy element ma wyrażenie formatu (w Tabular Editor właściwość Format String Expression), ten format dostaje każda miara przechodząca przez element, bez względu na jej własny format.
Zobacz też: Szkolenie Zaawansowany DAX w Power BI
W ciągu formatu przecinek nie oznacza miejsca dziesiętnego, tylko separator tysięcy. Zapis 0,0% pokazuje więc procenty bez części dziesiętnej: FORMAT z tym ciągiem zamienia zmianę marży o 0,36% na „00%”, a zmianę średniej oceny klientów o 0,79% na „01%”. Sama formuła elementu, DIVIDE(SELECTEDMEASURE() - Poprzedni, Poprzedni), dla miary procentowej liczy zmianę względną, a nie różnicę w punktach procentowych. Błąd miar tekstowych dokumentacja Microsoft tłumaczy dwiema zasadami: po dodaniu grupy obliczeniowej raporty używają dla wszystkich miar typu wariant, a element, który wykonuje działanie matematyczne na mierze tekstowej, daje błąd konwersji. Elementy, które tylko przepuszczają miarę albo zmieniają filtr, działają: Bieżący, YTD i Rok poprzedni zwróciły dla tytułu tekst „Sprzedaż przy rabacie 0%”.

EVALUATE
SELECTCOLUMNS (
INFO.CALCULATIONITEMS (),
"Element", [Name],
"Kolejność", [Ordinal],
"Format", [FormatStringDefinitionID]
)
EVALUATE INFO.FORMATSTRINGDEFINITIONS ()0.00%;-0.00%;0.00% pokaże 16,42% za 2025.SELECTEDMEASUREFORMATSTRING ()
"0.0%;-0.0%;0.0%". Wynik i tak wyświetli się z polskim przecinkiem: FORMAT z tym ciągiem daje dla zmiany sprzedaży 2025 wynik „12,1%” zamiast „12%”. Tak samo zapisany jest format miary Zmiana r/r % z lekcji o funkcjach czasowych YTD i rok do roku, który ma postać 0.0%.IF (
ISSELECTEDMEASURE ( [Marża %], [Marża % (VAR)], [Marża proc po rabacie] ),
"0.00 ""p.p."";-0.00 ""p.p."";0.00 ""p.p.""",
"0.0%;-0.0%;0.0%"
)VAR Biezacy = SELECTEDMEASURE ()
VAR Poprzedni =
CALCULATE ( SELECTEDMEASURE (), SAMEPERIODLASTYEAR ( DimKalendarz[Data] ) )
RETURN
SWITCH (
TRUE (),
NOT ISNUMERIC ( Biezacy ), Biezacy,
ISSELECTEDMEASURE ( [Marża %], [Marża % (VAR)], [Marża proc po rabacie] ),
IF ( NOT ISBLANK ( Poprzedni ), ( Biezacy - Poprzedni ) * 100 ),
DIVIDE ( Biezacy - Poprzedni, Poprzedni )
)Połóż w macierzy DimKalendarz[Rok] w wierszach, kolumnę Name grupy Czas w kolumnach i po kolei Łączna sprzedaż, Marża % i Tytuł wykresu w wartościach. Po poprawkach zmiana sprzedaży 2025 ma jedno miejsce po przecinku (12,1%), zmiana marży pokazuje 0,06 p.p. zamiast zera, a kolumny Bieżący, YTD i Rok poprzedni zachowują format miary. Rok 2022 w kolumnie zmiany jest pusty, bo w modelu nie ma 2021, a rok 2026 ma sprzedaż tylko do maja, więc porównuj go ostrożnie, o czym piszemy w poście o pustych wartościach i zawyżonym wzroście rok do roku.
Do grupy wpuszczaj miary bazowe, a przy każdym elemencie z wyrażeniem formatu sprawdzaj w macierzy co najmniej jedną kwotę, jeden wskaźnik procentowy i jedną miarę tekstową. Gdy format zależny od warunku potrzebny jest tylko jednej mierze, a nie całej grupie, według dokumentacji Microsoft wystarczy ciąg formatu dynamicznego tej miary, bez grupy obliczeniowej.
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...