Blog JSystems - uwalniamy wiedzę!

Szukaj

Power Query w Power BI

Usługa Power BI nie odświeża: zestaw danych zawiera dynamiczne źródło danych

W skrócie

  • Raport z zapytaniem do API odświeża się w Power BI Desktop, a w usłudze Power BI odświeżanie (ang. refresh) nie działa, bo model zawiera dynamiczne źródło danych (ang. dynamic data source).
  • Adres w Web.Contents jest sklejany z parametru, kolumny albo wyniku innego zapytania, więc źródła nie da się ustalić przed wykonaniem zapytania. W większości takich przypadków usługa Power BI nie odświeża modelu.
  • Zostaw w pierwszym argumencie Web.Contents stały adres bazowy, a zmienną ścieżkę i parametry przekaż w opcjach RelativePath i Query. Druga droga to jedno pobranie całej tabeli stałym adresem i wyszukiwanie w niej.

Na ten problem trafiasz po opublikowaniu raportu, który pobiera dane z API. W Power BI Desktop wszystko działa, a w usłudze odświeżanie (ang. refresh) modelu nie rusza, bo Power BI widzi w nim dynamiczne źródło danych (ang. dynamic data source). Pokazujemy, jak znaleźć takie zapytanie jeszcze przed publikacją, jak przepisać wywołanie Web.Contents, żeby usługa mogła je odświeżać, i na co uważać przy parametrach w adresie.

Jak to wygląda w praktyce

Zapytanie w Power BI Desktop zwraca dane, a po publikacji model w usłudze Power BI nie daje się odświeżyć. Microsoft opisuje to wprost: w większości przypadków modeli semantycznych z dynamicznymi źródłami danych nie da się odświeżać w usłudze Power BI.

Sprawdzisz to jeszcze w Power BI Desktop. W edytorze Power Query kliknij Ustawienia źródła danych na karcie Narzędzia główne i zostań w widoku Źródła danych w bieżącym pliku. Jeśli w tym oknie widać ostrzeżenie „Niektóre źródła danych mogą nie być wyświetlane na liście z powodu ręcznie utworzonych zapytań.” (ang. „Some data sources may not be listed because of hand-authored queries.”), plik zawiera dynamiczne źródło, którego usługa nie odświeży. Typowe miejsce to krok w rodzaju:

= Json.Document(Web.Contents(
    "https://api.nbp.pl/api/exchangerates/rates/A/" & Waluta & "/?format=json"))

Dlaczego tak się dzieje

Dynamiczne źródło danych to według Microsoftu takie, dla którego części informacji potrzebnych do połączenia nie da się ustalić, zanim Power Query wykona zapytanie, bo powstają w kodzie albo pochodzą z innego źródła. Dokumentacja podaje trzy przykłady: nazwę serwera i bazy SQL Server, ścieżkę pliku CSV i adres usługi sieci Web. W kroku powyżej pełny adres powstaje dopiero po doklejeniu wartości Waluta, więc przed wykonaniem zapytania nie wiadomo, z jakim adresem trzeba się połączyć.

Dokumentacja wymienia wyjątki, które usługa odświeża: Web.Contents z opcjami RelativePath i Query oraz zapytania odwołujące się do parametrów Power Query. Opis funkcji w Power Query pokazuje to na przykładzie ze stałym adresem https://www.bing.com i dodaje, że te opcje „służą do dynamicznej kwerendy statycznego podstawowego adresu URL”. RelativePath dopisuje tekst „do podstawowego adresu URL przed wysłaniem żądania”, a Query pozwala dodawać parametry zapytania do adresu „bez konieczności zajmowania się sekwencjami ucieczki”. Stały adres bazowy jest znany przed wykonaniem zapytania, a zmienne części dochodzą dopiero przy wysyłaniu żądania.

Jak to rozwiązać krok po kroku

  1. Znajdź dynamiczne wywołania. Otwórz Edytor zaawansowany każdego zapytania, które pobiera dane z sieci, i szukaj Web.Contents, w którego pierwszym argumencie adres jest sklejany operatorem & z parametru, kolumny albo wyniku innego zapytania.
  2. Oddziel stałą część adresu. W pierwszym argumencie zostaw adres bazowy, który się nie zmienia, zmienną ścieżkę przenieś do RelativePath, a parametry spod znaku zapytania do rekordu Query. Krok z objawów przyjmie postać = Json.Document(Web.Contents("https://api.nbp.pl/api/", [RelativePath = "exchangerates/rates/A/" & Waluta, Query = [format = "json"]])).
  3. Wartości w Query podawaj jako tekst. Liczba w rekordzie Query kończy się błędem Expression.Error: „Nie możemy przekonwertować wartości 2 na typ Text.” (ang. „We cannot convert the value 2 to type Text.”). Zamień ją funkcją Text.From, tak jak w lekcji o źródłach danych: Query = [page = Text.From(nr)].
  4. Własne funkcje wywoływane dla wierszy przepisz tak samo. Jeśli kurs pobierasz funkcją wywoływaną dla każdej waluty, w jej treści też użyj stałego adresu z RelativePath. W naszym teście w Excelu taka funkcja wywołana dla EUR i USD w jednym zapytaniu zatrzymała się na komunikacie „Aby połączyć dane, potrzebne są informacje. Określ poziom prywatności dla każdego źródła danych.” (ang. „Information is needed in order to combine data. Please specify a privacy level for each data source.”). Nadaj wtedy źródłu api.nbp.pl poziom Publiczne przyciskiem Edytuj uprawnienia w oknie Ustawienia źródła danych.
  5. Rozważ drugą drogę: jedno pobranie i wyszukiwanie. Funkcja fxKursNBP z lekcji o parametrach nie łączy się z API osobno dla każdej waluty, tylko przeszukuje zapytanie Kursy_NBP, które pobiera całą tabelę kursów jednym stałym adresem. Usługa ma wtedy do odświeżenia jeden adres, który zna przed wykonaniem zapytania.
  6. Opublikuj i odśwież w usłudze. Po przepisaniu wszystkich wywołań opublikuj raport, w ustawieniach modelu semantycznego podaj poświadczenia źródła (ang. Data source credentials), dla API NBP dostęp anonimowy, i uruchom odświeżenie na żądanie (ang. Refresh now).

Jak sprawdzić, że zadziałało

W Power BI Desktop otwórz ponownie Ustawienia źródła danych w widoku Źródła danych w bieżącym pliku i sprawdź, czy ostrzeżenie o ręcznie utworzonych zapytaniach zniknęło, a adres API jest na liście źródeł. W usłudze zajrzyj do historii odświeżania modelu (ang. Refresh history): odświeżenie na żądanie ma się zakończyć powodzeniem.

Przepisanie nie zmienia wyniku. W Excelu wariant z adresem sklejonym i wariant z RelativePath zwróciły dla waluty EUR ten sam rekord z kodem EUR, a Uri.BuildQueryString([format = "json", page = "2"]) pokazuje, jaki ciąg zapytania zbuduje rekord Query: format=json&page=2. Żeby problem nie wrócił, w każdym nowym zapytaniu do API zapisuj stały adres bazowy w pierwszym argumencie, a zmienne w RelativePath i Query, i przed każdą publikacją zaglądaj do okna Ustawienia źródła danych.

Okno Ustawienia źródła danych w Power BI Desktop z listą źródeł pliku: baza SQL Server, skoroszyty Excela, folder z plikami CSV i API NBP
Ustawienia źródła danych z pięcioma źródłami pliku, w tym API NBP. Przycisk Edytuj uprawnienia... otwiera poświadczenia i poziom prywatności zaznaczonego źródła.

Wróć do listy: 88 najczęstszych pytań i problemów związanych z Power Query

Baner szkolenia Kompleksowe szkolenie Power BI - Desktop, DAX i Online + Copilot w JSystems

Szkolenie Power BI - Desktop, DAX i Online --> Pięć dni od pierwszego raportu do publikacji w usłudze Power BI: Power Query, model danych z wielu tabel, DAX, wizualizacje i Copilot. To szkolenie ma terminy gwarantowane.

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czym jest dynamiczne źródło danych w Power BI?
To źródło, dla którego części informacji potrzebnych do połączenia nie da się ustalić przed wykonaniem zapytania, bo powstają w kodzie albo pochodzą z innego źródła. Typowy przykład to adres API sklejany w funkcji Web.Contents z parametru albo z wartości w kolumnie.
Czy parametry Power Query też blokują odświeżanie w usłudze?
Według dokumentacji Microsoft zapytania odwołujące się do parametrów Power Query można odświeżać w usłudze. Usługa nie obsługuje natomiast przełączania źródeł danych za pomocą dynamicznych parametrów zapytań M. Problemem jest też adres składany z wartości znanych dopiero w trakcie wykonywania zapytania.
Dlaczego po przeniesieniu parametru do Query pojawia się błąd konwersji na Text?
Rekord Query przyjmuje wartości tekstowe, a liczba podana wprost kończy się błędem Expression.Error „Nie możemy przekonwertować wartości 2 na typ Text.”. Zamień liczbę na tekst funkcją Text.From, na przykład page = Text.From(nr).
Czy ten sam problem dotyczy Excela?
Excel odświeża zapytanie u siebie, więc adres sklejany z parametru działa w nim bez zmian, co potwierdził nasz test z kursem EUR. Ograniczenie dotyczy odświeżania w usłudze Power BI. Zapis ze stałym adresem i opcją RelativePath działa w Excelu tak samo, więc możesz go stosować od początku.

Komentarze (0)

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

Brak komentarzy...