Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Komunikaty błędów DAX

Funkcje inteligencji czasowej dają błąd albo puste wyniki - wymagana ciągła tabela dat

W skrócie

  • Time intelligence w Power BI nie działa, gdy TOTALYTD, SAMEPERIODLASTYEAR czy DATEADD dostają złą kolumnę daty: liczbowy klucz daje błąd, a data z tabeli faktów daje YTD równe miesiącowi i pusty rok poprzedni.
  • Funkcje inteligencji czasowej potrzebują kolumny typu Data z tabeli dat, w której każdy dzień występuje raz i bez przerw. Na oznaczonym kalendarzu funkcja czasu zdejmuje przy tym filtry z innych kolumn kalendarza.
  • Licz miary po DimKalendarz[Data], oznacz kalendarz jako tabelę dat i sprawdź zapytaniem, że ma tyle wierszy, ile dni mieści się między pierwszą a ostatnią datą.

Gdy time intelligence w Power BI nie działa, autor raportu widzi jedno z trzech: komunikat błędu w mierze YTD albo rok do roku, wynik narastający równy wartości z jednego miesiąca albo pustą kolumnę roku poprzedniego. Wszystkie trzy mają wspólne źródło w kolumnie daty, którą dostaje funkcja inteligencji czasowej, czyli funkcja DAX rozszerzająca albo przesuwająca okres, na przykład TOTALYTD czy SAMEPERIODLASTYEAR. Pokazujemy dosłowne komunikaty, ich mechanizm i poprawki sprawdzone na modelu Nordvelli.

Jak to wygląda w praktyce

Pierwszy objaw to błąd typu. Na modelu Nordvelli miara TOTALYTD([Łączna sprzedaż], FaktSprzedaz[DataID]) zgłosiła: „Kolumna określona w wywołaniu funkcji „TOTALYTD” nie jest typu DATE. Jest to nieobsługiwane.” (w angielskiej wersji: „A column specified in the call to function 'TOTALYTD' is not of type DATE. This is not supported.”). To samo dało DimKalendarz[DataID], data zapisana jako tekst i SAMEPERIODLASTYEAR na kluczu liczbowym.

Drugi objaw to błąd ciągłości: „Funkcja „DATEADD” oczekuje wyboru ciągłego, jeśli kolumna daty nie jest unikatowa, ma przerwy lub zawiera część będącą godziną.” (w angielskiej wersji: „Function 'DATEADD' expects a contiguous selection when the date column is not unique, has gaps or it contains time portion.”). Dostaliśmy go dla daty przeniesionej do FaktSprzedaz, gdy w filtrze były dwa dni, 1 i 15 października 2024, albo same dni robocze. SAMEPERIODLASTYEAR zgłosił to samo ze swoją nazwą.

Trzeci objaw jest cichy. Ta sama data z tabeli faktów przy filtrze października 2024 z kalendarza dała YTD 9 894 194,40 zł, czyli sprzedaż samego października, i pusty rok poprzedni. Poprawna miara na DimKalendarz[Data] daje 82 986 563,97 zł narastająco i 7 936 337,04 zł rok wcześniej.

Dlaczego tak się dzieje

Funkcja inteligencji czasowej bierze daty z kontekstu filtra, buduje z nich nowy zbiór dni, na przykład od 1 stycznia do ostatniego widocznego dnia, i nakłada go jako filtr na podaną kolumnę. Według dokumentacji Microsoft tabela dat musi mieć kolumnę typu Data albo Data/godzina, wartości unikatowe, bez pustych i bez brakujących dni, najlepiej w pełnych latach. Kolumna w tabeli faktów nie spełnia tego warunku, bo jeden dzień ma w Nordvelli od 21 do 289 wierszy sprzedaży, średnio 67. Gdy wybrane dni nie tworzą ciągłego przedziału, DATEADD i SAMEPERIODLASTYEAR na takiej kolumnie nie wiedzą, jak przesunąć zaznaczenie, i zgłaszają błąd. Na DimKalendarz[Data] te same dwa dni przeszły bez błędu: DATEADD o miesiąc wstecz dał 472 823,75 zł.

Cichy objaw ma inny mechanizm. Filtr nowego zbioru dni trafia na kolumnę z tabeli faktów, a filtr z kalendarza, tu RokMiesiac = 2024-10, zostaje i dalej zawęża wynik do października. Na kalendarzu Nordvelli, oznaczonym jako tabela dat, filtr funkcji czasu na DimKalendarz[Data] zdejmuje przy tym filtry z pozostałych kolumn kalendarza. Na Nordvelli dopisanie ALL(DimKalendarz) do miary z datą z faktów przywróciło poprawne 82 986 563,97 zł i 7 936 337,04 zł. Według dokumentacji Microsoft oznaczenie jest obowiązkowe, gdy relacja z kalendarzem idzie po kolumnie innego typu niż data, a tak jest w Nordvelli: relacja łączy DataID w postaci 20241015. Szczegóły tego ustawienia opisujemy w poście o oznaczaniu tabeli dat.

Co zrobić krok po kroku

  1. Zaznacz miarę w panelu Dane i przeczytaj w pasku formuły, jaka kolumna jest w funkcji czasu. Gdy to kolumna z tabeli faktów, klucz w rodzaju DataID albo tekst, zamień ją na kolumnę daty z tabeli kalendarza.
  2. Napisz miarę na kolumnie daty kalendarza. Tak są zbudowane miary w modelu Nordvelli. Przy filtrze października 2024 dają 82 986 563,97 zł narastająco i 7 936 337,04 zł rok wcześniej.
    Sprzedaż YTD = TOTALYTD([Łączna sprzedaż], DimKalendarz[Data])
    
    Sprzedaż rok temu =
    CALCULATE(
        [Łączna sprzedaż],
        SAMEPERIODLASTYEAR(DimKalendarz[Data])
    )
  3. Sprawdź kalendarz zapytaniem w widoku zapytań w języku DAX. Liczba wierszy, liczba różnych dat i liczba dni między pierwszą a ostatnią datą mają być równe. Na Nordvelli wszystkie trzy to 1826, od 1 stycznia 2022 do 31 grudnia 2026, a ostatnia sprzedaż jest z 31 maja 2026, więc kalendarz pokrywa całe dane.
    EVALUATE
    ROW(
        "Od", MIN(DimKalendarz[Data]),
        "Do", MAX(DimKalendarz[Data]),
        "Wiersze", COUNTROWS(DimKalendarz),
        "Różne daty", DISTINCTCOUNT(DimKalendarz[Data]),
        "Dni w zakresie", INT(MAX(DimKalendarz[Data]) - MIN(DimKalendarz[Data])) + 1
    )
  4. Oznacz kalendarz jako tabelę dat. Zaznacz tabelę w widoku tabeli, na karcie Narzędzia tabel kliknij Oznacz jako tabelę dat, przestaw przełącznik Oznacz jako tabelę dat na Włączony, w polu Wybierz kolumnę daty wybierz kolumnę typu Data i poczekaj na komunikat Walidacja zakończona pomyślnie. Gdy walidacja się nie uda, w kolumnie są duplikaty, puste wartości albo luki. Według dokumentacji Microsoft nowsza analiza czasowa oparta na kalendarzach nie wymaga oznaczenia, ale klasyczne funkcje z tego posta go potrzebują.
  5. Gdy kalendarz ma luki, na przykład tylko dni robocze, błędu może nie być, a wynik jest niepełny. Zbudowaliśmy z kalendarza Nordvelli tabelę samych dni roboczych: 1261 dni zamiast 1826. DATESYTD dla października 2024 zwrócił na niej 213 dni zamiast 305 i każda suma narastająca pominęłaby weekendy i święta. Przy dwóch wybranych dniach DATEADD na tej tabeli zgłosił już błąd ciągłości. Dni robocze trzymaj jako kolumnę flagi, w Nordvelli CzyRoboczy, a nie jako osobny kalendarz.
  6. Gdy kolumna daty ma godzinę, przy nieciągłym wyborze dostajesz ten sam komunikat o ciągłości. Wystarczy sama godzina: kopia kolumny kalendarza z dopisaną godziną 12:00, z jednym wierszem na dzień i bez luk, przy wyborze 1 i 15 października 2024 dała w DATEADD ten sam błąd. Rozdziel datę i godzinę w Power Query, zanim dane trafią do modelu, tak jak w poście o usuwaniu czasu i strefy z daty w Power Query. Do relacji z kalendarzem użyj kolumny z samą datą.
  7. Jeśli masz własny kalendarz, wyłącz opcję Automatyczna data/godzina: Plik > Opcje i ustawienia > Opcje, w sekcji Bieżący plik strona Ładowanie danych. Kolumny dat spoza kalendarza tracą wtedy hierarchię dat w panelu Dane i nie trafią na oś zamiast kolumn kalendarza. Skutki tej opcji opisujemy w poście o automatycznej dacie i godzinie.
Okno Oznacz jako tabelę dat w Power BI: przełącznik Włączony, kolumna Data i komunikat Walidacja zakończona pomyślnie
Okno Oznacz jako tabelę dat dla DimKalendarz. Przełącznik Włączony, w polu Wybierz kolumnę daty wybrana Data, pod spodem zielony komunikat Walidacja zakończona pomyślnie i aktywny przycisk Zapisz.

Jak sprawdzić, że problem zniknął

Po poprawce sprawdź jeden znany miesiąc. Na Nordvelli przy filtrze października 2024 miara YTD ma dać 82 986 563,97 zł, miesiąc 9 894 194,40 zł, a rok temu 7 936 337,04 zł. YTD równe sprzedaży miesiąca znaczy, że filtr miesiąca nie został zdjęty, na przykład gdy funkcja dostała kolumnę spoza kalendarza. Z filtrem samych dni roboczych YTD na oznaczonym kalendarzu dał te same 82 986 563,97 zł, bo funkcja czasu zdjęła filtr flagi razem z filtrem miesiąca. Jeśli flaga ma działać w YTD, dodaj ją jawnie w CALCULATE.

Każdą nową tabelę faktów łącz z kalendarzem relacją, a w miarach czasu używaj wyłącznie kolumny daty kalendarza. Puste wartości w porównaniu rok do roku przy niepełnym roku to osobna sprawa, opisana w poście o pustych wartościach rok do roku.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Set and use date tables in Power BI Desktop (źródło)
  • Microsoft Learn: Date table guidance for Power BI Desktop (źródło)
  • Microsoft Learn: DATEADD function (DAX) (źródło)
  • Microsoft Learn: Time intelligence functions (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: TOTALYTD i SAMEPERIODLASTYEAR na DataID, tekście, dacie z tabeli faktów i z godziną, wybory dwóch dni i dni roboczych, kalendarz samych dni roboczych, poprawka z ALL.

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

Dlaczego time intelligence w Power BI nie działa?
Przyczyną bywa zła kolumna w funkcji: liczbowy klucz daty, tekst albo data z tabeli faktów. Klucz i tekst dają błąd, że kolumna nie jest typu DATE. Data z tabeli faktów daje YTD równe sprzedaży miesiąca i pusty rok poprzedni. Poprawka to kolumna daty z oznaczonej tabeli kalendarza.
Co znaczy błąd funkcja DATEADD oczekuje wyboru ciągłego?
Kolumna daty nie jest unikatowa, ma luki albo zawiera godzinę, a wybrane dni nie tworzą ciągłego przedziału, na przykład dwa pojedyncze dni albo same dni robocze. Na kolumnie Data kalendarza, z jednym wierszem na dzień, bez luk i bez godziny, ten sam wybór liczy się bez błędu. Dlatego DATEADD i SAMEPERIODLASTYEAR licz na kolumnie daty tabeli kalendarza.
Czy tabela dat może zawierać tylko dni robocze?
Lepiej nie. Na modelu Nordvelli tabela samych dni roboczych miała 1261 dni zamiast 1826, DATESYTD dla października 2024 zwrócił na niej 213 dni zamiast 305, a przy dwóch wybranych dniach DATEADD zgłosił błąd ciągłości. Dni robocze trzymaj w kalendarzu jako kolumnę flagi, na przykład CzyRoboczy.
Czy można liczyć YTD po kolumnie daty z tabeli faktów?
Nie wprost, bo filtr miesiąca z kalendarza zostaje i obcina zbiór dni funkcji czasu do jednego miesiąca. Na modelu Nordvelli YTD po dacie z tabeli faktów dało w październiku 2024 9 894 194,40 zł, czyli sam miesiąc, a rok poprzedni był pusty. Dopisanie ALL(DimKalendarz) przywróciło 82 986 563,97 zł, ale prostsza jest miara na DimKalendarz[Data].

Komentarze (0)

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

Brak komentarzy...