Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - Komunikaty błędów DAX
Wykryto zależność cykliczną w Power BI - kolumna obliczeniowa i relacje
Pierwsza kolumna obliczeniowa z CALCULATE w tabeli faktów liczy się bez błędu, a po dodaniu drugiej Power BI zgłasza komunikat Wykryto zależność cykliczną. To samo dzieje się, gdy obie kolumny odwołują się do gotowych miar, i przy miarach, które odwołują się do siebie nawzajem. Wyjaśniamy, skąd bierze się ta zależność, dlaczego w tabeli wymiaru te same formuły działają i jak poprawić kolumny bez zmiany wyników.
Power BI Desktop pokazuje komunikat silnika w miejscu, w którym zgłasza błędy formuł, czyli pod paskiem formuły. Na modelu Nordvelli dodaliśmy do tabeli FaktBudzet (3600 wierszy budżetu: 15 sklepów, 4 kategorie, 60 miesięcy) dwie kolumny oparte na miarach [Budżet marży] i [Budżet sprzedaży]:
Marża budżetu % = DIVIDE([Budżet marży], [Budżet sprzedaży]) Koszt budżetu % = DIVIDE(SUM(FaktBudzet[BudzetKosztow]), [Budżet sprzedaży])
Gdy obie są w tabeli, silnik odpowiada dosłownie: „Wykryto zależność cykliczną: 'FaktBudzet'[Koszt budżetu %], 'FaktBudzet'[Marża budżetu %], 'FaktBudzet'[Koszt budżetu %].” (w angielskiej wersji: „A circular dependency was detected: 'FaktBudzet'[Koszt budżetu %], 'FaktBudzet'[Marża budżetu %], 'FaktBudzet'[Koszt budżetu %].”).
Lista w komunikacie zaczyna się i kończy tym samym obiektem, a pozycje pomiędzy to droga, którą biegnie cykl. Ten sam komunikat dotyczy miar: dla [Miara A] = [Miara B] + 1 i [Miara B] = [Miara A] + 1 dostaliśmy „Wykryto zależność cykliczną: 'FaktSprzedaz'[Miara A], 'FaktSprzedaz'[Miara B], 'FaktSprzedaz'[Miara A].”
Kolumna obliczeniowa ma kontekst wiersza, czyli zna wartości wszystkich kolumn bieżącego wiersza. CALCULATE, także to ukryte w każdej miarze, wykonuje przejście kontekstu: zamienia ten wiersz na kontekst filtra, czyli zestaw warunków nałożonych na każdą kolumnę tabeli. Dlatego Marża budżetu % zależy od wszystkich kolumn FaktBudzet, w tym od Koszt budżetu %, a ta z tego samego powodu od Marża budżetu %. Żadnej nie da się policzyć jako pierwszej. Sam mechanizm przejścia kontekstu opisujemy w poście kolumna obliczeniowa z CALCULATE liczy coś innego niż bez niej.
Zobacz też: Szkolenie Zaawansowany DAX w Power BI
Znaczenie ma też miejsce tabeli w relacjach. Tabela DimSklepy jest po stronie jeden relacji z kluczem SklepID i ma już kolumnę Sprzedaż sklepu = CALCULATE(SUM(FaktSprzedaz[WartoscNetto])) z lekcji 14. Dopisaliśmy obok drugą, Marża sklepu z tym samym wzorcem, i obie policzyły się bez błędu (Nordvella Online: 141 772 848,59 zł sprzedaży i 19 703 618,62 zł marży). W FaktBudzet, po stronie wiele relacji, i w tabeli parametru Rabat proc bez żadnej relacji para kolumn z samym CALCULATE od razu dała zależność cykliczną. Jak działa relacja jeden do wielu, opisujemy w lekcji o modelu gwiazdy i relacjach.
Cykl może też przechodzić przez relację albo tabelę obliczeniową. Według dokumentacji Microsoft ulepszona walidacja zależności wykrywa cykle relacji, których wcześniej nie wykrywano, i część odświeżeń modeli w usłudze kończy się wtedy błędem zależności cyklicznej z tabelą obliczeniową. W tekstach Power BI Desktop 2.157 jest też ostrzeżenie (tylko po angielsku), że od 1 stycznia 2027 modele z zależnościami cyklicznymi nie będą przetwarzane.
FaktBudzet: Marża budżetu % i Koszt budżetu %. Gdy na liście są dwie miary, popraw tę, która nie powinna odwoływać się do drugiej.Marża budżetu % = DIVIDE(FaktBudzet[BudzetMarzy], FaktBudzet[BudzetSprzedazy]) Koszt budżetu % = DIVIDE(FaktBudzet[BudzetKosztow], FaktBudzet[BudzetSprzedazy])
SklepID i Rok, a nie od innych kolumn obliczeniowych. Każdą formułę dodaj osobno: prawy przycisk na FaktBudzet w panelu Dane, Nowa kolumna. Obie kolumny razem liczą się bez błędu: dla Nordvella Warszawa Centrum w 2022 każdy z 48 wierszy pokazuje 6 850 503,31 zł budżetu i 1 277 897,78 zł budżetu marży.Budżet sklepu w roku =
CALCULATE(
SUM(FaktBudzet[BudzetSprzedazy]),
ALLEXCEPT(FaktBudzet, FaktBudzet[SklepID], FaktBudzet[Rok])
)
Budżet marży sklepu w roku =
CALCULATE(
SUM(FaktBudzet[BudzetMarzy]),
ALLEXCEPT(FaktBudzet, FaktBudzet[SklepID], FaktBudzet[Rok])
)Wskaźnik marży budżetu = DIVIDE([Budżet marży], [Budżet sprzedaży])
DataID w FaktBudzet (FaktBudzet[Rok] * 10000 + FaktBudzet[Miesiac] * 100 + 1), na której opiera się relacja z DimKalendarz. Według dokumentacji Microsoft, gdy tabela obliczeniowa korzysta z SUMMARIZECOLUMNS, problem może rozwiązać jawny filtr wartości niepustych, a po zmianie trzeba sprawdzić wyniki modelu.Po poprawce komunikat znika, a kolumny dostają wartości. Porównaj kolumnę z miarą na jednej grupie: na modelu Nordvelli Budżet sklepu w roku dla Nordvella Warszawa Centrum w 2022 to 6 850 503,31 zł, tyle samo co miara [Budżet sprzedaży] z filtrem na tym sklepie i roku. Ten sam wzorzec z ALLEXCEPT sprawdziliśmy w DimSklepy: suma kolumny po 15 sklepach to 467 775 009,17 zł, czyli tyle, ile miara [Łączna sprzedaż].
W kolumnach obliczeniowych tabel faktów nie odwołuj się do miar i nie używaj CALCULATE bez ALLEXCEPT, a obliczenia do wizualizacji trzymaj w miarach. Kolumny obliczeniowe według dokumentacji Microsoft są liczone przy przetwarzaniu modelu i zapisywane w pamięci, więc każda zbędna kolumna to dodatkowa praca przy odświeżeniu, o czym piszemy w poście o kolumnach obliczeniowych, które spowalniają odświeżanie.
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...