Calculation groups w 2026: 10 wzorców (Time Intelligence, waluty, scenariusze) bez duplikacji miar

Przegląd calculation groups w Power BI (stan na 2026): 10 sprawdzonych wzorców (Time Intelligence, waluty, scenariusze) bez duplikacji miar + implementacja, ryzyka i governance.
20 maja 2026
blog

1. Czym są calculation groups i co zmieniło się w praktyce wdrożeń Power BI do 2026

Calculation groups (grupy kalkulacji) to mechanizm modelu semantycznego, który pozwala zdefiniować zestaw wspólnych transformacji logiki obliczeń i zastosować je do wielu miar bez kopiowania DAX. W praktyce działają jak „warstwa” nakładana na wybraną miarę: użytkownik wybiera pozycję z grupy (np. wariant czasowy lub scenariusz), a ta pozycja modyfikuje wynik aktualnie używanej miary. Dzięki temu wiele wariantów obliczeń przestaje być oddzielnymi miarami, a staje się spójnym, kontrolowanym zestawem reguł.

Najważniejsza różnica względem klasycznego podejścia „dużo miar w DAX” polega na tym, że logika przekrojowa (taka, która powtarza się w dziesiątkach KPI) jest definiowana raz, a następnie używana konsekwentnie w całym raporcie. To przesuwa ciężar pracy z ręcznego utrzymywania duplikatów miar na projektowanie jednolitych transformacji, które działają w wielu kontekstach raportu.

W wdrożeniach do 2026 calculation groups stały się elementem bardziej „produkcyjnym” niż eksperymentalnym: częściej są włączane do standardów modelowania, bo realnie ograniczają rozrost warstwy miar i ułatwiają utrzymanie. Zmiana praktyki polega też na tym, że coraz częściej traktuje się je jako narzędzie do standaryzacji (jedno miejsce na definicję logiki), a nie wyłącznie jako trik do time intelligence.

Typowe zastosowania, które najczęściej uzasadniają ich użycie, to:

  • Time intelligence jako zestaw wariantów (np. porównania okresów) działających na wielu miarach w identyczny sposób.
  • Waluty i przeliczenia jako wspólna warstwa logiki, zamiast osobnych miar „w PLN”, „w EUR” itd.
  • Scenariusze (plan/wykonanie/forecast) jako ujednolicony przełącznik perspektywy analitycznej.
  • Wariancje i odchylenia jako spójny sposób porównywania dwóch stanów, bez mnożenia miar.
  • Formatowanie (format string) jako kontrola prezentacji miar zależnie od wybranego wariantu.

Do 2026 zmieniło się również podejście do projektowania modeli Power BI: więcej zespołów dąży do mniejszej liczby miar bazowych (faktycznych KPI) oraz do przeniesienia powtarzalnych „nakładek” do calculation groups. To pomaga ograniczyć chaos w warstwie miar, poprawia spójność definicji metryk między stronami raportu oraz skraca czas zmian, gdy organizacja modyfikuje zasady liczenia KPI.

Jednocześnie calculation groups nie są zamiennikiem dla wszystkich miar. Najlepiej sprawdzają się wtedy, gdy ten sam typ modyfikacji ma sens dla wielu miar i ma być dostępny w identycznej postaci w całym modelu. Tam, gdzie logika jest jednorazowa, specyficzna dla pojedynczego KPI albo silnie zależna od nietypowego kontekstu, klasyczne miary często pozostają czytelniejsze i prostsze w utrzymaniu.

2. Architektura i zasady projektowe: kiedy używać calculation groups, a kiedy lepiej pozostać przy miarach/DAX

Calculation groups (CG) to mechanizm modelu semantycznego, który pozwala nakładać ten sam zestaw transformacji na wiele miar bez ich duplikowania. Architektonicznie działają jak warstwa „polityk obliczeń” stosowana na końcu ścieżki obliczeń miary: zamiast tworzyć osobne miary typu „Sprzedaż YTD”, „Marża YTD”, „Koszt YTD”, definiujesz jeden wspólny wzorzec, który może zostać zastosowany do dowolnej miary zgodnej z założeniami. W praktyce wdrożeń do 2026 kluczowe jest nie to, że CG istnieją, lecz że stały się stabilnym elementem projektowania modeli: traktuje się je jako narzędzie do standaryzacji, ograniczania długu DAX i ujednolicania doświadczenia raportowego. Podczas szkoleń Cognity ten temat wraca regularnie – dlatego zdecydowaliśmy się go omówić również tutaj.

Kiedy calculation groups są właściwym wyborem

Wybierz CG wtedy, gdy problem jest przekrojowy (dotyczy wielu miar) i można go opisać jako spójny zestaw transformacji, który ma być stosowany konsekwentnie w różnych raportach oraz przez różnych autorów.

  • Wysoka powtarzalność logiki: ten sam typ przeliczenia ma dotyczyć dziesiątek miar (np. te same warianty czasowe, scenariusze, przeliczenia walut, wariancje). Zyskujesz centralny punkt zmiany i eliminujesz kopie miar.
  • Wymóg standaryzacji: organizacja chce, aby definicje KPI i ich wariantów były identyczne niezależnie od raportu, zespołu czy obszaru biznesowego.
  • „Warstwa semantyczna” zamiast „logiki w raportach”: CG wspierają przenoszenie reguł z poziomu wizualizacji do modelu, dzięki czemu raport jest prostszy, a interpretacja wyników bardziej spójna.
  • Potrzeba kontrolowanej elastyczności: użytkownik może wybierać wariant obliczenia (np. perspektywę czasu, scenariusz), ale w ramach z góry zdefiniowanych, audytowalnych reguł.
  • Konsekwentne formatowanie wyników: gdy format wyniku ma wynikać z wybranego wariantu (np. procent vs kwota), a nie z ręcznego ustawiania w wielu miarach i wizualizacjach.
  • Redukcja długu technicznego: jeśli model cierpi na „eksplozję miar” (setki wariantów tej samej logiki), CG pozwalają wrócić do mniejszego, czytelniejszego katalogu miar bazowych.

Kiedy lepiej pozostać przy klasycznych miarach/DAX

Miary pozostają lepszym wyborem, gdy logika jest specyficzna, silnie zależna od kontekstu lub ma charakter „produktowy” (czyli jest jednoznacznym elementem definicji biznesowej, a nie wariantem obliczenia).

  • Miary bazowe i definicje KPI: podstawowe metryki (sprzedaż, koszt, marża, liczba transakcji) powinny zwykle istnieć jako miary, które CG jedynie „modyfikują”.
  • Unikalna logika dla jednej metryki: jeśli przekształcenie dotyczy tylko jednej miary lub niewielkiej grupy, CG może wprowadzić więcej złożoności niż korzyści.
  • Obliczenia wymagające odmiennego „ziarna”: gdy metryka wymaga specyficznej agregacji, nietypowej obsługi relacji lub odmiennych reguł filtrowania, umieszczanie jej w CG bywa ryzykowne i trudniejsze do utrzymania.
  • Silna potrzeba jawności i łatwego debugowania: pojedyncza miara jest często prostsza do prześledzenia w analizie, a jej zachowanie bardziej oczywiste dla mniej doświadczonych autorów.
  • Wymagania kompatybilności i ograniczenia środowiska: jeśli część odbiorców korzysta z narzędzi lub procesów, które gorzej współpracują z CG, bezpieczniej jest oprzeć się na klasycznych miarach.

Zasady projektowe: jak myśleć o modelu z calculation groups

  • Projektuj warstwowo: miary bazowe jako „źródło prawdy”, a CG jako warstwa wariantów. To ułatwia kontrolę jakości i ogranicza efekt domina przy zmianach.
  • Minimalizuj liczbę grup, maksymalizuj spójność: lepiej mieć mniej CG o jasnej odpowiedzialności niż wiele drobnych grup nakładających się semantycznie.
  • Jedna odpowiedzialność na grupę: jedna CG powinna realizować jeden typ transformacji (np. czas, scenariusz, waluta). Ułatwia to przewidywanie skutków i testowanie.
  • Przewiduj interakcje: CG mogą na siebie wpływać, dlatego projekt powinien zakładać, które transformacje mają się składać, a które powinny być rozłączne.
  • Ogranicz „magiczne” zachowania: CG są potężne, ale mogą ukrywać logikę. Warto dążyć do tego, by użytkownik rozumiał, jaki wariant jest aktywny i co oznacza.
  • Ustal reguły adopcji: z góry zdecyduj, które kategorie wymiarów i miar są „kompatybilne” z CG, aby uniknąć sytuacji, w której tylko część metryk zachowuje się zgodnie z oczekiwaniami.

Praktyczne kryterium decyzji

Najprostsza reguła architektoniczna brzmi: jeśli tworzysz kolejną miarę, która różni się od istniejącej głównie wariantem obliczenia (czas, scenariusz, waluta, wariancja, prezentacja), rozważ CG. Jeśli tworzysz miarę, która jest nową definicją biznesową albo ma wyjątkowe wymagania kontekstowe, pozostań przy klasycznej miarze. Taki podział utrzymuje model jednocześnie elastyczny i czytelny.

3. 10 wzorców użycia w realnych wdrożeniach (bez duplikacji miar)

Poniżej 10 najczęstszych wzorców, w których calculation groups w praktyce zastępują „kopiuj-wklej” miar (np. osobne miary dla każdej wariacji czasu, waluty, scenariusza). Każdy wzorzec opisuje co daje calculation group i kiedy jest najbardziej użyteczna — bez wchodzenia w implementacyjne niuanse.

1) Time Intelligence jako warstwa transformacji (MTD/QTD/YTD/rolling)

Zastosowanie: jedna miara bazowa (np. [Sales]) i jedna calculation group „Time”, która nakłada MTD/QTD/YTD/Last 12M itd.

  • Co rozwiązuje: eliminuje zestawy miar typu [Sales YTD], [Margin YTD], [Units YTD] itd.
  • Kiedy działa najlepiej: gdy większość KPI ma te same definicje kalendarzowe i jest oparta o wspólną tabelę dat.
  • Uwaga projektowa: to wzorzec „nakładki” — miara bazowa pozostaje prosta, logika czasu jest centralna.

2) YoY/MoM i „delta vs %” jako spójny zestaw porównań

Zastosowanie: calculation group „Comparison” z elementami typu YoY, YoY%, MoM, MoM%, Delta, Delta%.

  • Co rozwiązuje: proliferację miar porównawczych dla każdego KPI oraz rozjazdy definicji (np. różne sposoby liczenia % zmiany).
  • Kiedy działa najlepiej: gdy porównania są standardem raportowym i mają identyczne reguły dla wielu miar.
  • Efekt biznesowy: jednolity język zmian (wartość i procent) w całym modelu.

3) Wielowalutowość: przeliczanie + wybór waluty raportowej

Zastosowanie: calculation group „Currency” przełączająca miary na walutę lokalną/raportową (np. transakcyjna, EUR, USD) poprzez zastosowanie właściwego kursu.

  • Co rozwiązuje: osobne miary typu [Sales EUR], [Sales USD], [Cost EUR]… oraz ryzyko różnych kursów w różnych miejscach.
  • Kiedy działa najlepiej: gdy logika przeliczeń jest identyczna dla większości miar „amount” i bazuje na wspólnej tabeli kursów.
  • Warianty: kurs dzienny vs miesięczny, kurs budżetowy vs rzeczywisty — jako elementy jednej grupy.

4) Scenariusze: Plan/Wykonanie/Forecast jako ta sama miara „pod spodem”

Zastosowanie: calculation group „Scenario” przełączająca źródło danych/scenariusz (Actual, Plan, Forecast) dla tej samej miary analitycznej.

  • Co rozwiązuje: dublowanie definicji miar dla każdego scenariusza oraz niespójność filtrów (np. Plan ma inne zasady dat).
  • Kiedy działa najlepiej: gdy scenariusze są przechowywane jako atrybut (kolumna) lub mają spójny klucz czasu/organizacji.
  • Dodatkowa korzyść: scenariusz staje się „trybem raportu”, a nie osobnym zestawem KPI.

5) Wariancje (Variance) jako standard: Plan vs Actual, Forecast vs Actual

Zastosowanie: elementy calculation group liczące różnicę i % różnicy między scenariuszami, bez pisania osobnych miar wariancyjnych.

  • Co rozwiązuje: dziesiątki miar typu [Sales Var], [Sales Var%], [Margin Var]… oraz spory o definicję „% wariancji”.
  • Kiedy działa najlepiej: gdy scenariusze są już ustandaryzowane (wzorzec 4) i wariancja ma być identyczna dla wielu KPI.
  • Wartość: jeden spójny sposób liczenia wariancji w całej organizacji.

6) Normalizacja jednostek: sztuki/tys./mln, kg/tony, godziny/FTE

Zastosowanie: calculation group „Units/Scale” przeskalowująca wyniki (np. 1, 1000, 1 000 000) lub konwertująca jednostki.

  • Co rozwiązuje: ręczne mnożniki w wielu miarach i różne sposoby prezentacji skali w różnych raportach.
  • Kiedy działa najlepiej: gdy ta sama miara ma być pokazywana w różnych skalach zależnie od odbiorcy (zarząd vs operacje).
  • Efekt: spójna logika przeliczeń + prostsze miary bazowe.

7) Predefiniowane filtry jako „tryby analizy” (np. like-for-like, comparable stores)

Zastosowanie: calculation group nakładająca określone warunki filtrujące, np. „Comparable only”, „Active customers”, „Top segment”, „Excluding one-off”.

  • Co rozwiązuje: duplikację miar z wbudowanymi filtrami (np. [Sales LFL], [Margin LFL]) i niejawne reguły zaszyte w wielu miejscach.
  • Kiedy działa najlepiej: gdy „tryby” są powtarzalne i mają być dostępne globalnie dla wielu KPI.
  • Ważne: to wzorzec, który ujednolica interpretację danych, ale wymaga jasnego nazewnictwa i komunikacji biznesowej.

8) Format string jako część logiki (waluta, %, znaki, skróty)

Zastosowanie: calculation group zarządza formatowaniem wyniku bez zmiany samej wartości (np. tys./mln, waluta, %), dopasowując format do wybranego elementu grupy.

  • Co rozwiązuje: mieszanie logiki liczbowej z prezentacją (np. dzielenie przez 1000 tylko po to, by uzyskać „tys.”) oraz niespójne formaty między wizualizacjami.
  • Kiedy działa najlepiej: gdy użytkownik przełącza kontekst (waluta, skala, typ porównania) i format powinien za tym podążać automatycznie.
  • Korzyść: liczby pozostają „prawdziwe”, a format staje się kontrolowaną warstwą.

9) Dynamiczny wybór miary (measure switching) bez rozbudowanych IF

Zastosowanie: jedna wizualizacja i selektor, który pozwala przełączać KPI (np. Sales, Margin, Units) — calculation group może pełnić rolę katalogu miar i ich zachowań.

  • Co rozwiązuje: długie konstrukcje SWITCH/IF w pojedynczej „mega-miarze” oraz trudne utrzymanie rosnącej listy KPI.
  • Kiedy działa najlepiej: gdy raport ma „panel KPI” i użytkownik ma wybierać metrykę, zachowując te same porównania i filtry.
  • Plus: łatwiejsza rozbudowa — dodajesz KPI do katalogu zamiast przebudowywać logikę.

10) Standaryzacja KPI: wspólne reguły „liczenia i interpretacji”

Zastosowanie: calculation group jako warstwa standaryzacji: np. wymuszenie tego samego sposobu liczenia „% udziału”, „indeksu = 100”, „per capita/per store”, „net/gross”, „z/bez podatku”.

  • Co rozwiązuje: sytuację, w której „ten sam KPI” w różnych raportach ma subtelnie inną definicję.
  • Kiedy działa najlepiej: w środowiskach z wieloma zespołami raportowymi, gdzie spójność definicji jest ważniejsza niż lokalna optymalizacja.
  • Efekt organizacyjny: KPI stają się „produktem” z jedną definicją, a nie zbiorem podobnych miar.

Skrócone porównanie: kiedy calculation group daje największą przewagę

Wzorzec Co ujednolica Najczęstszy zysk
Time intelligenceokresy i okna czasowemniej miar + spójne definicje
YoY/MoMporównania i % zmianstandard zmian w całym modelu
Walutykursy i walutę raportowąjedna logika przeliczeń
ScenariuszeActual/Plan/Forecastbrak duplikacji KPI per scenariusz
Wariancjedelta i delta%jedna definicja „variance”
Normalizacjaskale i jednostkispójna prezentacja i przeliczenia
Predefiniowane filtrytryby analizycentralizacja reguł biznesowych
Format stringformatowanie zależne od kontekstuczystsze miary, mniej obejść
Dynamiczny wybór miarykatalog KPImniej SWITCH i łatwiejsza rozbudowa
Standaryzacja KPIdefinicje i interpretacjezgodność między raportami

4. Implementacja krok po kroku: struktura tabeli, precedence, SELECTEDMEASURE(), format string i testowanie

Poniżej znajduje się praktyczny, powtarzalny schemat wdrożenia calculation groups w modelu semantycznym Power BI/Tabular. Celem jest ograniczenie duplikacji miar przy jednoczesnym zachowaniu kontroli nad logiką, formatowaniem i kolejnością nakładania transformacji.

4.1. Przygotuj „bazę”: miary atomowe i konwencje

Zanim dodasz calculation group, upewnij się, że masz zestaw miar bazowych (np. Sprzedaż, Marża, Ilość) bez zaszytej logiki typu „YoY” czy „w walucie X”. Calculation groups najlepiej działają, gdy:

  • miary bazowe zwracają jedną spójną definicję biznesową (bez wariantów czasowych/scenariuszowych),
  • kolumny daty, waluty, scenariusza itd. są modelowane w wymiarach,
  • nazewnictwo jest stabilne (ułatwia dokumentację i testy).

4.2. Utwórz calculation group i zaprojektuj strukturę elementów

Calculation group to w praktyce „tablica przełączników” (calculation items), które modyfikują dowolną wybraną miarę. Projektując strukturę, trzymaj się zasad:

  • Jedna grupa = jeden wymiar transformacji (np. tylko Time Intelligence albo tylko Currency). Unikaj mieszania wielu tematów w jednej grupie.
  • Elementy muszą być wzajemnie zrozumiałe (np. „MTD”, „QTD”, „YTD”, „YoY”, „YoY%”).
  • Dodaj element „Base”/„Brak”, który zwraca miarę bez zmian (wygodne w slicerach i testach).

Minimalny przykład elementu „Base”:

-- Calculation item: Base
SELECTEDMEASURE()

4.3. Zrozum i ustaw precedence (kolejność nakładania grup)

Gdy w modelu jest więcej niż jedna calculation group, mogą się one nakładać na tę samą miarę. O tym, w jakiej kolejności zostaną zastosowane, decyduje precedence (priorytet) ustawiany na poziomie calculation group.

  • Precedence jest kluczowe, gdy łączysz np. czas z walutą albo scenariuszem.
  • W praktyce chcesz, aby kolejność była deterministyczna i zgodna z intuicją biznesową (np. najpierw policz wariant czasowy, potem przelicz walutę — lub odwrotnie, ale konsekwentnie).
  • Ustal precedence i udokumentuj decyzję, bo wpływa na wynik oraz trudność debugowania.

Prosty sposób myślenia:

  • Jeśli jedna grupa „owija” wynik drugiej (np. formatuje lub przelicza), to precedence musi to odzwierciedlać.
  • Jeśli dwie grupy ingerują w filtr daty (np. YTD i Rolling 12), ryzyko konfliktu rośnie — wtedy szczególnie pilnuj kolejności i zakresu logiki.

Zespół trenerski Cognity zauważa, że właśnie precedence i interakcje kilku calculation groups sprawiają uczestnikom najwięcej trudności — dlatego warto od początku podejść do tego metodycznie i testować kombinacje na kontrolowanej macierzy.

4.4. SELECTEDMEASURE(): rdzeń logiki elementów

SELECTEDMEASURE() zwraca aktualnie używaną w wizualu miarę (np. Sprzedaż albo Marża) i pozwala pisać logikę „raz”, a stosować „wiele razy”. Najczęstszy wzorzec to przypisanie jej do zmiennej i modyfikacja kontekstu:

-- Calculation item: YTD (przykład)
VAR __base = SELECTEDMEASURE()
RETURN
    CALCULATE(
        __base,
        DATESYTD('Date'[Date])
    )

Warto pamiętać o dwóch praktycznych aspektach:

  • Elementy calculation group nie „wiedzą”, czy bazowa miara jest sumą, średnią czy wskaźnikiem — dlatego logika musi być możliwie neutralna i testowana na różnych miarach.
  • Jeśli nie chcesz, by dany element działał dla wszystkich miar, zwykle stosuje się warunki (np. na podstawie nazwy miary lub metadanych) — to jednak warto utrzymywać oszczędnie, by nie zwiększać złożoności.

4.5. Format string: spójne formatowanie bez mnożenia miar

Calculation items mogą wpływać nie tylko na wynik liczbowy, ale też na format (np. procenty dla „YoY%”, waluta dla „EUR”, skrócone jednostki). W praktyce oznacza to mniej osobnych miar typu „Marża %” vs „Marża”.

Typowy wzorzec: element zwraca wartość, a format ustawia osobno (format string expression). Przykładowo dla elementu zwracającego dynamikę procentową:

-- Calculation item: YoY%
VAR __curr = SELECTEDMEASURE()
VAR __prev = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Date'[Date]))
RETURN
    DIVIDE(__curr - __prev, __prev)

…a format string (konceptualnie) ustawiasz na procentowy, np. 0.00%. Jeśli element nie zmienia typu wyniku (np. „YTD”), często warto odziedziczyć format miary bazowej.

Typ elementu Wpływ na wartość Wpływ na format Najczęstsza praktyka
Agregacje czasu (YTD/MTD) Tak Zwykle nie Dziedziczenie formatu miary bazowej
Wskaźniki % (YoY%, udział) Tak Tak Wymuszony format procentowy
Waluty/jednostki Tak Tak Format zależny od wyboru (symbol/precision)

4.6. Testowanie na przykładach: szybka macierz kontrolna

Calculation groups potrafią dawać poprawne wyniki dla jednej miary i błędne dla innej (albo tylko w niektórych kontekstach filtra). Dlatego testowanie powinno być systemowe, nie „na oko”. Minimalny zestaw testów obejmuje:

  • Test przekrojowy miar: ta sama calculation group na 3–5 typach miar (suma, średnia, wskaźnik, miara z DIVIDE).
  • Test kontekstu czasu: dzień/miesiąc/rok, brak daty na osi, różne zakresy (ostatnie 13 miesięcy vs pełny rok).
  • Test interakcji: dwie calculation groups aktywne jednocześnie (np. Time + Currency) i weryfikacja zgodności z oczekiwaną kolejnością (precedence).
  • Test „Base/Brak”: upewnij się, że powrót do wartości bazowej faktycznie przywraca wynik i format.
  • Test formatów: czy elementy procentowe/walutowe nie „psują” formatowania innych elementów i czy format nie zmienia się nieoczekiwanie przy drilldown.

Praktyczny układ wizualu do testów:

  • Macierz: wiersze = nazwy miar bazowych, kolumny = calculation items (np. Base, YTD, YoY, YoY%).
  • Slicery: data (rok/miesiąc), opcjonalnie waluta/scenariusz.
  • Dodatkowo karta z wybraną miarą bazową i przełączaniem calculation item — szybka kontrola formatowania.

4.7. Minimalny „szablon wdrożeniowy” (checklista)

  • Zdefiniuj miary bazowe i upewnij się, że nie dublują wariantów (YoY/YTD/waluta).
  • Utwórz calculation group z elementem „Base” oraz zestawem elementów funkcjonalnych.
  • Ustaw precedence dla wszystkich calculation groups w modelu (i sprawdź interakcje).
  • Zaimplementuj logikę w oparciu o SELECTEDMEASURE() i trzymaj ją możliwie generyczną.
  • Dodaj format string tam, gdzie element zmienia semantykę (np. wartości na %).
  • Przeprowadź macierz testów na różnych miarach i kontekstach.

5. Ograniczenia i ryzyka: interakcje z RLS, pułapki kontekstu filtra, wydajność, kompatybilność, złożoność debugowania i utrzymania

Calculation groups potrafią znacząco uprościć model, ale w praktyce wdrożeń niosą też specyficzne ryzyka. Ponieważ modyfikują zachowanie wielu miar naraz (przez SELECTEDMEASURE()), ich skutki są szerokie: jedno niepozorne wyrażenie może zmienić wyniki w całym raporcie. Poniżej najczęstsze obszary, w których pojawiają się problemy operacyjne.

Interakcje z RLS (Row-Level Security)

  • RLS nadal obowiązuje – calculation groups nie „omijają” zabezpieczeń wprost, ale potrafią zmienić kształt zapytania i kontekst obliczeń, co bywa mylące w analizie incydentów („dlaczego użytkownik widzi inne wartości po wyborze kalkulacji?”).
  • Nieoczywiste efekty przy modyfikacji kontekstu – elementy calculation group często używają CALCULATE i funkcji czasu; to może powodować, że użytkownik z RLS dostaje wynik liczony dla innego wycinka daty niż oczekiwano (np. MTD/YTD), a to w praktyce wygląda jak „błąd RLS”, choć nim nie jest.
  • Ryzyko przy modelach z mapowaniem uprawnień – gdy RLS opiera się o tabele mapujące (użytkownik→region→klient), a calculation item wprowadza dodatkowe filtry/odfiltrowania, łatwo doprowadzić do sytuacji, w której wynik jest poprawny formalnie, ale sprzeczny z oczekiwaniami biznesu (np. inaczej liczone sumy w zależności od wyboru wariantu kalkulacji).

Wskazówka praktyczna: ryzyko rośnie, gdy calculation items używają funkcji zdejmujących filtry (np. ALL, REMOVEFILTERS) na tabelach powiązanych z logiką uprawnień. Jeśli to konieczne, warto jasno ograniczać zakres zdejmowania filtrów (kolumny zamiast całych tabel).

Pułapki kontekstu filtra i „magiczne” zmiany wyników

  • Zmiana semantyki miary – miara, która była „prosta” (np. suma sprzedaży), po nałożeniu calculation item zaczyna działać jak „sprzedaż YTD” lub „sprzedaż w walucie X”. Użytkownik raportu widzi to jako przełącznik, ale autor modelu musi pamiętać, że każdy wizual może być pod wpływem calculation group.
  • Interakcje z hierarchiami dat – time intelligence w calculation items jest podatne na sytuacje, w których w raporcie nie ma odpowiedniego filtra daty, jest kilka tabel dat, albo aktywna jest inna relacja niż zakładano.
  • Nieintencjonalne „podwójne” kalkulacje – gdy część miar ma już w sobie logikę (np. miara już jest YTD), a calculation group ponownie nakłada YTD, wyniki stają się trudne do wyjaśnienia. To typowy problem w modelach rozwijanych latami.
  • Precedence – kolejność stosowania calculation groups potrafi radykalnie zmieniać wynik (np. najpierw waluta, potem time intelligence vs odwrotnie). W praktyce jest to jedno z głównych źródeł rozbieżności między środowiskami (DEV/TEST/PROD), jeśli ustawienia precedence nie są konsekwentne.

Wydajność i koszty zapytań

  • Każdy calculation item to dodatkowa warstwa logiki – szczególnie gdy wewnątrz są złożone CALCULATE, iteratory (np. SUMX) lub warunki zależne od kontekstu. Skutkiem mogą być dłuższe czasy renderowania wizuali oraz większe obciążenie capacity.
  • Wzrost liczby kombinacji – jeśli użytkownik może łączyć różne kalkulacje (np. scenariusz × waluta × typ okresu), to liczba potencjalnych ścieżek obliczeń rośnie wykładniczo. Nawet jeśli każda ścieżka jest „tania”, całość bywa trudna do utrzymania wydajnościowo.
  • Ryzyko utraty optymalizacji – niektóre miary są naturalnie dobrze wspierane przez storage engine, ale po owinięciu w dodatkowy kontekst mogą częściej trafiać do formuła engine. To objawia się tym, że „kiedyś działało szybko”, a po wdrożeniu calculation group nagle przestaje.

Minimalny przykład ryzykownego wzorca (nie jako recepta, tylko ilustracja):

// Zdejmowanie filtrów szerokim zakresem i iteratory
CALCULATE(
    SELECTEDMEASURE(),
    REMOVEFILTERS('DimDate'),
    SUMX(VALUES('DimProduct'[Category]), 1)
)

Kompatybilność i ograniczenia środowiskowe

  • Zależność od narzędzi i metadanych – calculation groups są częścią modelu tabular i ich tworzenie/edycja w praktyce często wymaga narzędzi wspierających metadane (np. praca na modelu). To bywa barierą dla zespołów, które dotąd pracowały wyłącznie w „klasycznym” trybie budowy raportów.
  • Różnice między środowiskami – w organizacjach, gdzie część raportów działa na różnych wersjach silnika/ustawieniach capacity, mogą występować subtelne różnice w zachowaniu formatowania lub wydajności. Najbardziej wrażliwe są elementy: format string, precedence oraz interakcje z perspektywami/udostępnianiem datasetów.
  • Ograniczenia funkcjonalne w niektórych scenariuszach – np. złożone wymagania formatowania, nietypowe KPI czy miary o specyficznej semantyce mogą nie nadawać się do uogólnienia przez calculation group bez kompromisów.

Złożoność debugowania i utrzymania

  • Trudniejsze śledzenie „skąd się wziął wynik” – miara nie jest już samowystarczalna: jej rezultat zależy od aktywnego calculation item, precedence oraz filtrów na tabeli calculation group (często realizowanych slicerem).
  • Efekt domina – zmiana jednego calculation item wpływa na wiele miar, co zwiększa ryzyko regresji. W praktyce wymusza to bardziej rygorystyczne podejście do testów i kontroli zmian.
  • Konflikty odpowiedzialności – w zespołach, gdzie jedni budują miary, a inni „warstwy semantyczne” (w tym calculation groups), pojawia się pytanie: kto odpowiada za błąd? Bez jasnych zasad łatwo o przerzucanie odpowiedzialności i wydłużenie czasu naprawy.
  • Nieprzewidywalne interakcje z formatowaniem – dynamiczne format stringi są wygodne, ale utrudniają porównywanie wyników między wizualami (np. ta sama miara może prezentować się inaczej zależnie od aktywnej kalkulacji), co komplikuje walidację.

Tabela: szybki przegląd ryzyk i typowych objawów

Obszar Typowe ryzyko Jak się objawia
RLS Nieintuicyjne wyniki przez modyfikację kontekstu Użytkownicy z różnymi rolami raportują „inne liczby” po przełączeniu kalkulacji
Kontekst filtra Podwójne nakładanie logiki, błędna relacja dat YoY/YTD liczy się inaczej w zależności od wizuala lub użytej tabeli dat
Precedence Zmienny wynik przy innej kolejności grup Ta sama kombinacja slicerów daje inne wyniki po zmianach w modelu
Wydajność Dodatkowa warstwa obliczeń, częstsze przejścia do formula engine Wolniejsze wizuale po wdrożeniu grup, szczególnie przy wielu kombinacjach
Utrzymanie Zmiany globalne, trudniejszy debugging Regresje po drobnych poprawkach, trudność w odtworzeniu warunków błędu

W skrócie: calculation groups są bardzo „mocnym narzędziem” i dlatego wymagają ostrożności. Największe ryzyka pojawiają się wtedy, gdy grupa zaczyna pełnić rolę globalnej warstwy logiki bez jasnych granic (co modyfikuje, czego nie modyfikuje), a zespół nie ma nawyku testowania wpływu zmian na cały zestaw miar i wizuali.

💡 Pro tip: Przed wdrożeniem calculation groups sprawdź wpływ na RLS, precedence i kontekst dat w kontrolnym raporcie oraz unikaj szerokiego zdejmowania filtrów (ALL/REMOVEFILTERS na całych tabelach) — ograniczaj je do konkretnych kolumn, żeby nie tworzyć „magicznych” zmian wyników i problemów z wydajnością.

6. Governance i operacjonalizacja

Calculation groups porządkują warstwę miar, ale jednocześnie wprowadzają nową „warstwę logiki” w modelu semantycznym. W praktyce do 2026 roku stały się elementem, który wymaga takiego samego ładu jak tabele faktów, miary czy role bezpieczeństwa: jasnych standardów, kontroli zmian, testów oraz reguł adopcji. Bez tego łatwo o sytuację, w której kolejne zespoły dodają elementy do calculation groups ad hoc, a model traci przewidywalność.

Standardy nazewnictwa: spójność ponad kreatywność

Największa dźwignia jakości to konsekwentne nazwy calculation groups oraz calculation items. Nazwy powinny wyjaśniać intencję biznesową i zakres działania, a nie sposób implementacji.

  • Calculation group: nazwa domenowa i neutralna (np. „Time Intelligence”, „Scenarios”, „Currency”).
  • Calculation item: nazwy w stylu etykiet UI, przewidywalne i porównywalne (np. „MTD”, „YTD”, „YoY %”).
  • Unikaj skrótów specyficznych dla zespołu, nazw typu „Test”, „New”, „Fix”, oraz nazw zdradzających implementację (np. „CalcItem_3”).
  • Porządek sortowania: jawny i ustalony (np. prefiksy liczbowe lub osobna kolumna sortująca), aby raporty i slicery były stabilne.
Obszar Rekomendacja Przykład
Nazwa calculation group Rzeczownik + domena Time Intelligence
Nazwa calculation item Etykieta biznesowa, krótka YoY %, YTD, Actual
Opis Jednozdaniowa definicja + wyjątki „Porównanie do poprzedniego roku dla bieżącego kontekstu daty.”
Sortowanie Stabilne, jawne 01 MTD, 02 QTD, 03 YTD…

Wersjonowanie i kontrola zmian: calculation groups jako „kontrakt”

Calculation groups oddziałują na wiele miar naraz, dlatego zmiana jednego elementu może mieć wpływ na dziesiątki stron raportu. Warto traktować je jak API modelu semantycznego: zmiany muszą być przewidywalne, opisane i testowalne.

  • Semantyczne wersjonowanie logiki: rozróżniaj zmiany kompatybilne (np. dodanie nowego calculation item) od zmian łamiących (np. zmiana definicji istniejącego elementu).
  • Zmiany w trybie „proposal → review → release”: propozycja zawiera cel, wpływ oraz plan komunikacji do użytkowników raportów.
  • „Deprecation policy”: zamiast usuwać element od razu, oznaczaj jako przestarzały i utrzymuj przez ustalony czas, aby raporty miały czas na migrację.

Dokumentacja: minimalna, ale użyteczna (dla twórców i użytkowników)

Dokumentacja calculation groups powinna odpowiadać na pytania: co to robi, kiedy używać, kiedy nie używać oraz jakie są wyjątki. Skup się na przewidywalności zachowania, nie na szczegółach DAX.

  • Karta katalogowa dla każdej calculation group: cel, zakres, zależności (np. wymagany wymiar daty), znane ograniczenia.
  • Opis per calculation item: definicja biznesowa, przykład interpretacji oraz wskazanie, czy dotyczy wartości, procentów, formatowania.
  • Lista miar wrażliwych: miary, które nie powinny być modyfikowane przez daną grupę (np. metryki nienależące do osi czasu).

Przeglądy zmian (reviews): checklista jakości i ryzyka

Review powinien wychwycić wpływ krzyżowy i problemy utrzymaniowe, zanim trafią na produkcję. W praktyce wystarcza krótka checklista, konsekwentnie stosowana.

  • Wpływ na istniejące raporty: które strony/visuale używają danej calculation group i czy zmiana może zmienić liczby lub format.
  • Konflikty z innymi calculation groups: czy zmiana nie wprowadza niejednoznaczności zachowania (np. wiele grup ingerujących w tę samą miarę).
  • Spójność nazewnictwa: nazwy, opisy, sortowanie oraz zgodność z ustalonym słownikiem KPI.
  • Bezpieczeństwo i zgodność: czy logika nie omija zamierzeń warstwy bezpieczeństwa ani nie ujawnia informacji poprzez formatowanie lub selekcję.
  • Utrzymanie: czy da się wyjaśnić zachowanie bez czytania złożonego kodu, oraz czy da się to testować.

Testy regresji: „czy liczby się nie zmieniły (albo zmieniły się zgodnie z intencją)”

Calculation groups są szczególnie podatne na regresje, bo modyfikują kontekst obliczeń wielu miar. Testy powinny być proste, automatyzowalne i oparte o reprezentatywne przekroje danych.

  • Zestaw scenariuszy testowych: kilka typowych przekrojów (czas, region, produkt) oraz kilka wartości skrajnych (braki danych, okresy zamknięte).
  • Testy stabilności wyników: porównanie wyników przed/po dla kluczowych miar i kluczowych calculation items.
  • Testy formatowania: weryfikacja, czy formaty liczb i jednostek są zgodne z oczekiwaniami (szczególnie przy elementach wpływających na format string).
  • Raport „smoke test”: jedna strona kontrolna, która w jednym miejscu pokazuje najważniejsze miary z głównymi przełącznikami calculation groups.

W dokumentacji testów warto zapisać: zakres, oczekiwane tolerancje (jeśli dopuszczalne są drobne różnice), oraz listę miar krytycznych.

Zasady adopcji w organizacji: kto może dodawać, a kto tylko używać

Calculation groups najczęściej zawodzą nie przez technikę, lecz przez brak jasnych reguł: kto decyduje o nowych elementach i jak uniknąć „równoległych standardów”.

  • Model właścicielstwa: określ właściciela calculation groups (np. zespół danych/BI) oraz ścieżkę akceptacji zmian.
  • Katalog wzorców: utrzymuj listę zatwierdzonych calculation groups i elementów oraz ich przeznaczenie, aby zespoły nie tworzyły duplikatów.
  • Reguły rozszerzania: kiedy dopuszczalne jest dodanie nowego itemu, a kiedy lepiej rozszerzyć model o nową miarę lub wymiar.
  • Konwencje UI: zdefiniuj, gdzie w raportach użytkownik ma wybierać elementy (slicery, przyciski, parametry) i jak je nazywać, by doświadczenie było spójne.
  • Komunikacja zmian: publikuj changelog dla analityków i twórców raportów (co dodano, co zmieniono, co jest przestarzałe).

Minimalny „pakiet operacyjny” dla calculation groups

  • Standard nazewnictwa + sortowania.
  • Właściciel i proces akceptacji zmian.
  • Changelog i polityka wycofywania elementów.
  • Strona smoke-test oraz zestaw przypadków regresji.
  • Krótka dokumentacja: cel, zakres, wyjątki, zależności.

Taki pakiet pozwala korzystać z calculation groups jako wspólnego mechanizmu w wielu raportach bez utraty kontroli nad spójnością wyników, stabilnością wdrożeń i zrozumiałością modelu.

💡 Pro tip: Traktuj calculation groups jak kontrakt/API modelu: trzymaj spójne nazewnictwo i sortowanie, wprowadź ownera oraz proces review→release z changelogiem i polityką deprecacji, a każdą zmianę przepuszczaj przez smoke test i proste testy regresji kluczowych miar.

7. Rekomendacje końcowe: checklisty wdrożeniowe, anti-patterns i kiedy calculation groups dają największy zwrot

Calculation groups w 2026 są narzędziem do standaryzacji logiki (np. Time Intelligence, scenariusze, waluty, wariancje) bez rozmnażania miar. Największą wartość dają tam, gdzie organizacja ma wiele raportów, wielu autorów i potrzebuje spójnych definicji KPI. Jednocześnie nie są „domyślnym” wyborem: w prostych modelach szybciej i czytelniej bywa pozostać przy klasycznych miarach.

Checklisty wdrożeniowe (praktyczne minimum)

  • Ustal katalog przypadków użycia: wybierz 2–3 wzorce o najwyższej powtarzalności (np. YoY, YTD, Plan vs Wykonanie) zamiast wdrażać wszystko naraz.
  • Zdefiniuj granice odpowiedzialności: co jest logiką w miarach bazowych, a co jest „nakładką” w calculation items (żeby uniknąć podwójnego liczenia i sprzecznych definicji).
  • Ustal spójne nazewnictwo: krótkie nazwy pozycji dla użytkownika, jednoznaczne opisy (tooltip/description) dla zespołu; rozdziel nazwy techniczne od etykiet biznesowych, jeśli to potrzebne.
  • Zaplanuj doświadczenie użytkownika: gdzie i jak użytkownik wybiera „wariant” (np. okres, scenariusz, waluta), aby uniknąć chaosu w polach i slicerach.
  • Sprawdź wpływ na istniejące raporty: oceń ryzyko zmian formatu, sortowania, interakcji wizualizacji oraz potencjalnych konfliktów z już istniejącymi miarami pomocniczymi.
  • Przygotuj zestaw testów biznesowych: proste przypadki kontrolne (np. miesiąc o pełnych danych, miesiąc bez danych, przełom roku) i porównanie z dotychczasową definicją KPI.
  • Ustal standard obsługi wyjątków: jak zachowują się miary w sytuacjach braku danych, niekompletnego kalendarza, niepełnych kursów walut czy brakującego planu.
  • Włącz monitoring i utrzymanie: minimalny log zmian, właściciel definicji i procedura zatwierdzania (nawet lekka), aby uniknąć „cichej” zmiany KPI.

Anti-patterns (kiedy calculation groups bolą bardziej niż pomagają)

  • Zastępowanie nimi dobrze zaprojektowanego modelu: calculation groups nie naprawią słabej tabeli dat, brakujących relacji, złej granulacji faktów ani niespójnych definicji miar bazowych.
  • „Jedna grupa na wszystko”: zbyt szeroka calculation group, która miesza Time Intelligence, scenariusze, waluty i filtry, szybko staje się trudna do zrozumienia i utrzymania.
  • Duplikowanie logiki: część transformacji w miarach, część w calculation items bez jasnych zasad; efekt to nieprzewidywalne wyniki i trudne debugowanie.
  • Projektowanie pod autorów, nie pod użytkowników: mnożenie pozycji, które są technicznie „fajne”, ale dla biznesu są nieczytelne, dublują się semantycznie lub generują zbyt wiele kombinacji.
  • Ukryta zmiana znaczenia KPI: wprowadzanie calculation items, które zmieniają definicję metryki (np. przeliczanie zakresu danych lub filtrów) bez transparentnej komunikacji i wersjonowania.
  • Nadmierna zależność od formatowania dynamicznego: skupienie na „ładnym” formacie kosztem spójności interpretacji (np. różne jednostki/skalowanie między stronami) i przewidywalności eksportów.
  • Próba obejścia ograniczeń bezpieczeństwa: używanie calculation groups do „maskowania” danych zamiast poprawnej architektury uprawnień i modelu.

Kiedy calculation groups dają największy zwrot (w 2026)

  • Wiele KPI × wiele wariantów: gdy ta sama logika (czas, scenariusz, waluta, wariancja) ma działać na dziesiątkach miar bez ich rozmnażania.
  • Skalowanie organizacji: gdy raporty rozwija kilka osób i potrzebujesz wspólnego „języka” metryk oraz spójnych definicji w całym ekosystemie.
  • Standaryzacja Time Intelligence: gdy chcesz, aby YTD/MTD/YoY/MoM działały konsekwentnie na wszystkich miarach, a definicje okresów były centralnie kontrolowane.
  • Raportowanie wielowalutowe i scenariuszowe: gdy użytkownik musi płynnie przełączać perspektywę (np. raportowanie vs transakcyjna waluta, plan/wykonanie/forecast) bez budowania osobnych miar dla każdej kombinacji.
  • Ujednolicenie prezentacji KPI: gdy spójne etykiety, formaty i zachowanie miar są równie ważne jak sama liczba (zwłaszcza w dashboardach i raportach zarządczych).
  • Redukcja długu DAX: gdy model cierpi na „kopiuj-wklej” miar i chcesz ograniczyć powierzchnię zmian oraz ryzyko rozjazdu definicji.

Najlepsza praktyka na koniec: traktuj calculation groups jak warstwę produktu w modelu semantycznym — z jasno opisanym zakresem, właścicielem, testami i zasadami użycia. Wtedy stają się przewagą: ograniczają duplikację, poprawiają spójność i przyspieszają dostarczanie nowych wariantów analizy bez przebudowy całego zestawu miar.

Pułapka 7: problemy z relacjami i kierunkiem filtrowania (granularność, many-to-many, tabela pomocnicza)

Calculation groups często wyglądają jak „warstwa logiki ponad miarami”, więc łatwo założyć, że są neutralne wobec modelu danych. W praktyce ich działanie jest silnie zależne od relacji, kierunku filtrowania i tego, na jakiej granularności pracują tabele faktów oraz wymiary. Ta pułapka objawia się tym, że ten sam element calculation group działa poprawnie dla jednej miary, a dla innej daje niespójne wyniki, zera albo „dziwne” przeskoki po zmianie selekcji.

Gdzie zaczyna się problem: granularność i „niewidzialne” konteksty

Calculation item zwykle modyfikuje istniejący kontekst (np. przesuwa czas, podmienia filtr, redefiniuje bazę porównania). Jeżeli model ma fakty o różnej granularności (np. sprzedaż dzienna, budżet miesięczny, stany magazynowe migawkowe), to ten sam zabieg na filtrach może dla jednego faktu być naturalny, a dla drugiego wprowadzać niezamierzone agregacje albo zbyt agresywne odfiltrowanie danych. Wtedy calculation group nie tyle „psuje miarę”, co ujawnia, że miara opiera się na domysłach dotyczących relacji i ziarna danych.

Kierunek filtrowania: pozornie wygodne ustawienia, realne skutki

W modelach Power BI częstą pokusą jest ustawienie filtrowania dwukierunkowego, żeby „wszystko się ładnie filtrowało”. Calculation groups potrafią to zwielokrotnić: element, który zmienia filtr na jednym wymiarze, może uruchomić łańcuch propagacji filtrów w obie strony, powodując zwężenie danych w nieoczekiwanych miejscach. Skutki bywają subtelne: wyniki są poprawne dla pojedynczego wyboru, ale rozjeżdżają się przy wielu wyborach, przy drążeniu hierarchii lub przy interakcji kilku slicerów naraz.

Relacje many-to-many: szybka droga do niejednoznaczności

Many-to-many i tabele pośrednie są czasem konieczne, ale w połączeniu z calculation groups zwiększają ryzyko, że „logika zmiany kontekstu” będzie działać raz tak, raz inaczej, zależnie od tego, która ścieżka relacji okaże się aktywna w danym widoku. Pojawia się:

  • niejednoznaczna propagacja filtra (kilka dróg do tego samego faktu),
  • podwójne zliczanie albo jego pozorne „naprawianie” przez przypadkowe odfiltrowanie,
  • różne wyniki dla tej samej miary w zależności od tego, z jakiej tabeli pochodzi oś wizualizacji.

Calculation group może wtedy zachowywać się jak wzmacniacz problemu: zamiast tylko liczyć inaczej, zaczyna ujawniać niespójność semantyki relacji.

Tabela pomocnicza (bridge) i „wspólny wymiar” – nie zawsze rozwiązanie

Gdy pojawia się wiele faktów i niestandardowe relacje, naturalnym krokiem jest dołożenie tabeli pomocniczej, która „łączy” światy (np. mapowanie produktów, regionów, klientów). To zwykle poprawny kierunek, ale trzeba uważać, że calculation groups często zakładają istnienie jednego, spójnego wymiaru (np. jednego kalendarza, jednej tabeli walut, jednej definicji jednostki). Jeśli bridge nie jest jednoznaczny albo nie odzwierciedla realnej logiki biznesowej, calculation items, które modyfikują filtr na takim wymiarze, mogą przynosić efekt odwrotny: zamiast ujednolicić miary, rozszczepiają ich znaczenie w zależności od ścieżki relacji.

Typowe symptomy w raportach

  • To samo przełączenie calculation group daje inny wynik na kartach KPI niż w tabeli szczegółowej.
  • Wyniki „znikają” po dodaniu dodatkowego slicera, mimo że dane istnieją.
  • Element działa dla jednego faktu, ale dla drugiego daje zera lub nielogiczne wartości.
  • Wizualizacja poprawna na poziomie miesiąca, błędna na poziomie dnia (lub odwrotnie).
  • Niespójność między sumą wierszy a wartością „Total” (szczególnie przy złożonych relacjach).

Jak myśleć o unikaniu pułapki (na poziomie zasad, bez wchodzenia w implementację)

  • Traktuj calculation groups jako warstwę semantyczną, która wymaga równie solidnego modelu jak miary: bez spójnych relacji będą zachowywać się nieprzewidywalnie.
  • Utrzymuj jednoznaczne ścieżki filtrowania do faktów; im mniej przypadkowych dróg, tym mniejsze ryzyko efektów ubocznych.
  • Dbaj o spójne wymiary wspólne (np. czas, waluta, jednostka) – jeśli wymiary są „lokalne” dla faktu, calculation group może nie mieć stabilnego punktu odniesienia.
  • W przypadku many-to-many i bridge upewnij się, że model opisuje realną relację biznesową (a nie tylko techniczny skrót), bo calculation items będą tę relację wykorzystywać i wzmacniać jej konsekwencje.

W skrócie: calculation groups nie zastępują modelowania danych. Jeśli relacje są niejednoznaczne, a kierunek filtrowania ustawiony „pod wygodę”, to calculation group potrafi sprawić, że raport zacznie wyglądać na losowy. Stabilne, przewidywalne zachowanie zaczyna się od klarownej granularności, świadomie dobranych relacji i kontrolowanej propagacji filtrów.

W Cognity łączymy teorię z praktyką – dlatego ten temat rozwijamy także w formie ćwiczeń na szkoleniach.

icon

Formularz kontaktowyContact form

Imię *Name
NazwiskoSurname
Adres e-mail *E-mail address
Telefon *Phone number
UwagiComments