#017 Raport w Power BI z AI w 7 krokach, bez podłączania AI do danych

Ostatnio dostałam zadanie, które na początku trochę mnie przestraszyło: raport w Power BI z AI z danych Salesforce do śledzenia demandu. Chodziło o to, żeby od razu widzieć, czy sprzedaż idzie zgodnie z planem. I czy nie mamy szans, które „mają się zamknąć w tym miesiącu”, a wciąż wiszą na etapie pierwszej rozmowy.

Problem? Proces sprzedażowy w Salesforce był dla mnie czarną magią. Mogłam przez kilka dni czytać dokumentację i dopytywać ludzi. Zamiast tego usiadłam z AI i przeszłam cały proces krok po kroku. Pierwsza wersja raportu była gotowa w pół dnia.

Jest tylko jeden haczyk, który pewnie znasz: w pracy nie mogę podpiąć AI do danych. Korzystałam z firmowego modelu lokalnego, w którym zbudowałam sobie agenta, eksperta od Power BI. Nie widział ani jednego wiersza danych. Dostawał nazwy kolumn, opis tematu i odpowiedzi klienta. Całą resztę klikałam sama w Power BI Desktop.

raport Power BI z AI

Z tej pracy wyszedł mi schemat w 7 krokach, który teraz stosuję przy każdym nowym raporcie. Przy każdym kroku dostajesz prompt do skopiowania. Kod pokazuję na fikcyjnych danych, więc możesz go od razu przetestować u siebie.

Nie masz agenta? Zwykły czat też wystarczy

Agent daje głównie wygodę: nie tłumaczysz za każdym razem, kim jesteś i czego chcesz. Ten sam efekt dostaniesz, wklejając na początek rozmowy taki prompt:

Jesteś ekspertem Power BI (modelowanie, DAX, wizualizacja). Pomagasz mi
zbudować raport od zera. Nie masz dostępu do danych - dostaniesz tylko
nazwy kolumn i opis biznesowy. Pracujemy krokami: pytania do klienta,
wybór kolumn, model gwiazdy, mockup strony, miary DAX, karty KPI, tabela.
Gdy czegoś nie wiesz o moich danych, zapytaj zamiast zgadywać.

Jeśli pracujesz na publicznym czacie, najpierw sprawdź politykę firmy. I wklejaj tylko metadane: nazwy kolumn i definicje, nigdy wiersze z danymi.

Krok 1. Najpierw pytania, potem dane

Zanim otworzysz Power BI, zapytaj AI, o co zapytać klienta. Wystarczy temat raportu i lista nagłówków kolumn, bez żadnych wierszy danych.

Prompt:

Jestem analitykiem Power BI. Mam zbudować raport do monitorowania demandu
na podstawie eksportu Opportunities z Salesforce. Nie znam tego procesu.
Poniżej lista kolumn ze źródła. Zaproponuj 10-15 pytań, które powinnam
zadać klientowi, zanim zacznę budować model i raport. Pogrupuj je
na: cel biznesowy, definicje, plan/targety, odbiorcy i częstotliwość.

[wklej nagłówki kolumn]

W nawiasach kwadratowych wklejasz swoje dane. Nagłówki kolumn najszybciej skopiujesz z pierwszego wiersza pliku Excel lub CSV, wystarczy je wkleić jako listę oddzieloną przecinkami.

Przykładowe pytania, które dostaniesz:

  • Który etap (Stage) uznajemy za „wczesny”, a od którego szansa jest „zaangażowana”?
  • Czy plan jest liczony na kwotę (Amount) czy na kwotę ważoną prawdopodobieństwem?
  • Z jakim planem porównujemy wyniki: miesięcznym, kwartalnym, per region czy per handlowiec?
  • Co oznacza „przesunięta” szansa: każda zmiana Close Date czy tylko na kolejny miesiąc?
  • Kto będzie używał raportu i jak często (cotygodniowy forecast call, przegląd miesięczny)?

Odpowiedzi klienta stają się kontekstem do wszystkich kolejnych kroków. Wklejaj je do rozmowy z AI.

Krok 2. Z 200 kolumn wybierz kilkanaście

Eksport z Salesforce miał u mnie około 200 kolumn. Przeszukiwanie tego ręcznie zajmuje godziny. AI zrobi pierwszą selekcję w minutę, bo zna typowe nazwy pól CRM.

Prompt:

Na podstawie odpowiedzi klienta [wklej] wybierz z poniższej listy kolumny
potrzebne do raportu. Dla każdej podaj: po co jest potrzebna i do której
tabeli modelu trafi (fakt czy wymiar). Osobno wypisz kolumny, które mogą
się przydać później, ale teraz je pomijamy.

[wklej nagłówki kolumn]

Przykładowy wynik (wymyślony zbiór danych):

Kolumna Do czego Tabela
Opportunity ID klucz szansy Fakt
Opportunity Name opis w tabeli szczegółów Fakt
Account Name klient Wymiar Account
Owner handlowiec Wymiar Owner
Region podział na regiony i plan Wymiar Region
Stage etap lejka Wymiar Stage
Probability (%) kwota ważona Fakt
Amount (EUR) wartość szansy Fakt
Forecast Category Commit / Best Case / Pipeline Fakt
Created Date wiek szansy Fakt + Kalendarz
Close Date miesiąc zamknięcia Fakt + Kalendarz
Original Close Date pierwsza deklarowana data Fakt
Close Date Push Count ile razy przesunięto datę Fakt
Last Stage Change Date dni bez ruchu w lejku Fakt

Zawsze sprawdź wynik sama, bo AI nie zna specyfiki Twojej organizacji. Pola niestandardowe (np. licznik przesunięć daty) często mają w każdej firmie inną nazwę.

Krok 3. Model: wymiary i relacje

Gdy masz listę kolumn, poproś o projekt modelu gwiazdy. To moment, w którym AI najlepiej sprawdza się jako partner do dyskusji: pytaj „dlaczego?” i „co jeśli?”.

Prompt:

Zaprojektuj model gwiazdy w Power BI dla wybranych kolumn. Podaj:
1) tabelę faktów i wymiary z kolumnami,
2) relacje (kierunek, kardynalność, aktywna/nieaktywna),
3) jakie kolumny warto dodać w Power Query (np. sortowanie etapów).
Mam dwie daty: Created Date i Close Date - jak je obsłużyć z jednym kalendarzem?

Wynik dla przykładu:

  • FactOpportunity – jedna szansa = jeden wiersz (ID, kwoty, daty, licznik przesunięć).
  • DimStage – Stage, StageOrder (1–7), StageGroup: Early (Prospecting, Qualification), Mid (Needs Analysis, Proposal), Late (Negotiation), Closed (Won, Lost).
  • DimOwner – handlowiec. Region trzymam w osobnej tabeli DimRegion, bo łączy się z nią też plan (ten sam region ma kilku handlowców, więc plan nie może iść przez DimOwner).
  • DimAccount – klient, branża.
  • DimDate – kalendarz. Relacja aktywna po Close Date, nieaktywna po Created Date (włączana w mierze przez USERELATIONSHIP).
  • FactPlan – plan miesięczny per region, połączony z DimDate (miesiąc) i DimRegion.

Wszystkie relacje 1:* z wymiaru do faktu, filtrowanie jednokierunkowe.

Model gwiazdy w Power BI z tabelami faktów szans sprzedaży i planu oraz wymiarami etapu, regionu, handlowca i daty.

Krok 4. Mockup pierwszej strony

To krok, w którym mój agent jest najmocniejszy. Zanim przeciągniesz pierwszy wizual, poproś o prosty szkic strony: co gdzie stoi i na jakie pytanie odpowiada. Zmieniłam kilka elementów, ale gotowy szkic oszczędził mi najwięcej czasu w całym projekcie.

Prompt:

Zaproponuj układ pierwszej strony raportu (16:9) dla odbiorców: [kto].
Dla każdego elementu podaj: typ wizualizacji, miary, pytanie biznesowe,
na które odpowiada. Maksymalnie 8 elementów. Narysuj układ jako siatkę ASCII.

Szkic dla przykładu:

+----------+----------+----------+----------+----------+
| Pipeline | Weighted | Won MTD  | % planu  | Ryzyko   |   <- 5 kart KPI (HTML)
+----------+----------+----------+----------+----------+
| Pipeline vs plan wg miesiąca  | Pipeline wg etapu     |
| (słupki + linia planu)        | (słupki poziome)      |
+-------------------------------+-----------------------+
| Tabela: szanse z Close Date w tym miesiącu na wczesnym |
| etapie + szanse przesuwane wielokrotnie (flagi, ikony) |
+-------------------------------------------------------+
  Fragmentatory: Region | Owner | Forecast Category

Krok 5. Wszystkie miary naraz: DEFINE MEASURE

Nie proś o miary pojedynczo. Poproś o jeden blok DEFINE MEASURE + EVALUATE, wklej go do widoku zapytań DAX (DAX query view) i uruchom. Od razu widzisz, czy liczby mają sens, a przyciskiem „Update model” dodajesz wszystkie miary do modelu jednym kliknięciem.

Prompt:

Na podstawie modelu [wklej opis tabel i kolumn] i mockupu [wklej]
napisz wszystkie potrzebne miary jako jedno zapytanie DAX:
DEFINE MEASURE ... oraz EVALUATE z SUMMARIZECOLUMNS po regionie,
żebym mogła je zweryfikować w DAX query view. Używaj DIVIDE i zmiennych.

Wynik dla przykładu (kolumny po zmianie nazw w Power Query):

DEFINE
    MEASURE FactOpportunity[Pipeline Amount] =
        CALCULATE ( SUM ( FactOpportunity[Amount] ), DimStage[StageGroup] <> "Closed" )

    MEASURE FactOpportunity[Weighted Pipeline] =
        CALCULATE (
            SUMX ( FactOpportunity, FactOpportunity[Amount] * FactOpportunity[Probability] / 100 ),
            DimStage[StageGroup] <> "Closed"
        )

    MEASURE FactOpportunity[Won Amount] =
        CALCULATE ( SUM ( FactOpportunity[Amount] ), DimStage[Stage] = "Closed Won" )

    MEASURE FactOpportunity[Plan Amount] =
        SUM ( FactPlan[PlanAmount] )

    MEASURE FactOpportunity[% Plan] =
        DIVIDE ( [Won Amount], [Plan Amount] )

    MEASURE FactOpportunity[Pipeline Coverage] =
        DIVIDE ( [Pipeline Amount], [Plan Amount] - [Won Amount] )

    MEASURE FactOpportunity[At Risk Count] =
        -- Close Date w bieżącym miesiącu, a szansa wciąż na wczesnym etapie
        VAR _start = DATE ( YEAR ( TODAY () ), MONTH ( TODAY () ), 1 )
        VAR _end = EOMONTH ( TODAY (), 0 )
        RETURN
            CALCULATE (
                COUNTROWS ( FactOpportunity ),
                DimStage[StageGroup] = "Early",
                FactOpportunity[CloseDate] >= _start,
                FactOpportunity[CloseDate] <= _end,
                REMOVEFILTERS ( DimDate )
            )

    MEASURE FactOpportunity[Pushed Opps] =
        -- otwarte szanse, którym Close Date przesunięto co najmniej 2 razy
        CALCULATE (
            COUNTROWS ( FactOpportunity ),
            FactOpportunity[PushCount] >= 2,
            DimStage[StageGroup] <> "Closed"
        )

    MEASURE FactOpportunity[Pipeline Created] =
        CALCULATE (
            SUM ( FactOpportunity[Amount] ),
            USERELATIONSHIP ( FactOpportunity[CreatedDate], DimDate[Date] )
        )

    MEASURE FactOpportunity[Days Since Stage Change] =
        DATEDIFF ( MAX ( FactOpportunity[LastStageChangeDate] ), TODAY (), DAY )

EVALUATE
SUMMARIZECOLUMNS (
    DimRegion[Region],
    "Pipeline", [Pipeline Amount],
    "Weighted", [Weighted Pipeline],
    "Won", [Won Amount],
    "% Plan", [% Plan],
    "Coverage", [Pipeline Coverage],
    "At Risk", [At Risk Count],
    "Pushed", [Pushed Opps]
)

Sprawdź wynik na kilku regionach, porównując go z raportem w Salesforce. Dopiero potem aktualizuj model.

DAX query view w Power BI z blokiem DEFINE MEASURE i wynikami weryfikacji miar.

Krok 6. Karty KPI w HTML zamiast standardowych kart

Najpierw wybierz motyw i tło raportu. Potem podaj AI kolory i poproś o karty jako miarę DAX zwracającą HTML. Wyświetlasz ją w wizualu typu HTML Content (z AppSource). Jedna miara = cała karta: tytuł, wartość, porównanie do planu i kolor statusu. Bez ustawiania dziesiątek opcji formatowania w każdej karcie osobno.

Prompt:

Mój motyw: tło #F7F8FA, akcent #2F5BEA, sukces #1E9E6A, ostrzeżenie #E5484D.
Napisz miarę DAX zwracającą kartę KPI w HTML (inline CSS) dla [% Plan]:
tytuł, wartość w %, Won vs Plan pod spodem, kolorowy pasek statusu
(>= 100% zielony, 80-99% bursztynowy, < 80% czerwony).
Zrób tak, żebym mogła skopiować ją dla innych KPI, zmieniając tylko zmienne.

Wynik:

KPI Card % Plan =
VAR _title  = "Realizacja planu"
VAR _value  = [% Plan]
VAR _sub    = "Won " & FORMAT ( [Won Amount], "#,0" ) & " / plan " & FORMAT ( [Plan Amount], "#,0" ) & " EUR"
VAR _color  =
    SWITCH ( TRUE (),
        _value >= 1,   "#1E9E6A",
        _value >= 0.8, "#F5A524",
        "#E5484D"
    )
RETURN
"<div style='font-family:Segoe UI;background:#FFFFFF;border-radius:12px;
      padding:14px 16px;box-shadow:0 1px 4px rgba(0,0,0,.08);
      border-left:6px solid " & _color & "'>
   <div style='font-size:12px;color:#6B7280;text-transform:uppercase'>" & _title & "</div>
   <div style='font-size:28px;font-weight:600;color:#111827'>" & FORMAT ( _value, "0%" ) & "</div>
   <div style='font-size:11px;color:#6B7280'>" & _sub & "</div>
 </div>"

Pozostałe karty (Pipeline, Weighted, Won MTD, Ryzyko) to ta sama miara ze zmienionymi zmiennymi _title, _value, _sub i progami koloru.

U mnie to był moment, w którym praca przyspieszyła najbardziej. Zamiast klikać formatowanie pięciu kart, poprawiałam kilka zmiennych w jednej mierze.

Karty KPI w HTML w Power BI z paskiem realizacji planu, pokryciem pipeline’u, osią terminów i wykresem jednostkowym

Firma blokuje wizuale z AppSource? Ten sam efekt da się uzyskać miarą zwracającą SVG. Ustawiasz jej kategorię danych na „Image URL” i wstawiasz do natywnej tabeli albo nowej karty. Wymaga to trochę więcej zabawy z kodem, ale działa bez żadnych dodatków.

Chcesz karty jak na zrzucie? Kod powyżej to prosta wersja, od której warto zacząć. Karty z mini-wizualizacjami (pasek realizacji ze znacznikiem „dziś”, luka do celu pokrycia, oś terminów w miesiącu i wykres jednostkowy przesunięć) są dłuższe, dlatego wrzuciłam je do repozytorium. Znajdziesz tam plik .dax ze wszystkimi miarami do wklejenia w DAX query view oraz fikcyjne dane CSV, na których zrobiłam zrzuty: [LINK DO REPOZYTORIUM].

Krok 7. Wykresy, tabela i flagi, które robią robotę

Wykresy słupkowe to proste ustawienia, tu AI nie jest potrzebne. Największą wartość w tabeli szczegółów dają dwa dodatki: kolor dla szans zagrożonych i ikona dla szans przesuwanych wielokrotnie. Odbiorca od razu widzi, gdzie zadać pytanie handlowcowi.

Miara statusu do formatowania warunkowego (Format → Cell elements → Background color → Field value):

Risk Color =
VAR _isEarly  = SELECTEDVALUE ( DimStage[StageGroup] ) = "Early"
VAR _close    = MAX ( FactOpportunity[CloseDate] )
VAR _thisMonth = _close <= EOMONTH ( TODAY (), 0 ) && _close >= DATE ( YEAR ( TODAY () ), MONTH ( TODAY () ), 1 )
VAR _pushes   = MAX ( FactOpportunity[PushCount] )
RETURN
    SWITCH ( TRUE (),
        _isEarly && _thisMonth, "#FDE2E2",   -- czerwone tło: zamknięcie w tym miesiącu, wczesny etap
        _pushes >= 2,           "#FFF1D6",   -- bursztynowe: wielokrotnie przesuwana
        BLANK ()
    )

Ikona przy nazwie szansy:

Push Flag =
VAR _p = MAX ( FactOpportunity[PushCount] )
RETURN
    SWITCH ( TRUE (),
        _p >= 3, "⏪⏪ " & _p & "x",
        _p = 2,  "⏪ 2x",
        BLANK ()
    )

Kolumny tabeli: Opportunity Name, Account, Owner, Stage, Close Date, Original Close Date, Amount, Push Flag, Days Since Stage Change. Domyślne sortowanie: Close Date rosnąco.

Tabela Power BI z grafikami SVG pokazującymi etap, termin, historię przesunięć daty i dni bez ruchu.

Na zrzucie tabela ma jeszcze więcej: każda komórka to miara zwracająca grafikę SVG (kategoria danych „Adres URL obrazu”), więc działa w zwykłej tabeli Power BI, bez wizuali z AppSource. Pasek etapów lejka, pigułka terminu, ślad przesunięć daty, kwota ważona i pierścień dni bez ruchu są w tym samym pliku .dax w repozytorium: [LINK DO REPOZYTORIUM].

Jedna pułapka, na którą sama wpadłam: w adresie data:image/svg+xml trzeba zakodować nie tylko # jako %23, ale najpierw % jako %25. Inaczej tekst typu „20%” w SVG psuje wszystkie kolory i elementy robią się czarne.

Ściągawka: schemat na każdy nowy raport

AI nie musi widzieć Twoich danych, żeby przyspieszyć pracę. Wystarczą nazwy kolumn, odpowiedzi klienta i dobre pytania.

Krok Co dajesz AI Co dostajesz
1. Pytania do klienta temat + nagłówki kolumn lista pytań na pierwsze spotkanie
2. Wybór kolumn odpowiedzi klienta + nagłówki kilkanaście kolumn z przypisaniem do tabel
3. Model wybrane kolumny gwiazda: fakty, wymiary, relacje
4. Mockup model + odbiorcy szkic strony z wizualizacjami
5. Miary model + mockup jeden blok DEFINE MEASURE do weryfikacji
6. Karty KPI kolory motywu miara HTML wielokrotnego użytku
7. Tabela i flagi definicje ryzyka kolory i ikony do formatowania warunkowego

Trzy zasady, które się sprawdziły:

  • Nie wklejaj danych, tylko metadane. Nazwy kolumn i definicje biznesowe w zupełności wystarczą.
  • Weryfikuj liczby sama. DAX query view i porównanie z systemem źródłowym to obowiązkowy krok.
  • Traktuj AI jak partnera do rozmowy, nie wyrocznię. Najwięcej nauczyłam się, dopytując „dlaczego tak?”.

A Ty od czego zaczynasz nowy raport? Daj znać w komentarzu.

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *