Jeżeli mówimy o elementach Microsoft Power Platform to najczęściej przychodzi nam do głowy Power BI, który sam w sobie jest dosyć rozbudowaną platformą pozwalającą osiągnąć wiele różnych rzeczy od pobierania danych i ich modelowania, aż po wizualizację i dystrybucję. Gdy spojrzymy na sytuację nieco szerzej to wtedy obok Power BI na pierwszy plan wychodzą dodatkowe narzędzia takie jak Power Apps, Power Automate oraz czasami pomijany aczkolwiek niezwykle ciekawy Power Virtual Agents. Najciekawsze w tym wszystkim jest to, że integracja pomiędzy tymi komponentami z miesiąca na miesiąc jest coraz lepsza i pozwala w wielu przypadkach niskim kosztem osiągnąć naprawdę wiele korzyści biznesowych. To co jakiś czas temu było utrudnione lub wręcz niemożliwe dziś już do osiągnięcia bez większych problemów.
W ramach niniejszego artykułu chciałbym powiedzieć kilka słów na temat tego w jaki sposób możemy osadzać komponenty Power BI takie jak raporty czy też pojedyncze wizualizacje w aplikacji Power Apps. Po co nam coś takiego? W wielu przypadkach okazuje się, że chcemy w naszych aplikacjach oprócz czystych funkcjonalności CRUD (Create, Read, Update, Delete) na surowych danych również je wizualizować i mimo, że sam Power Apps posiada pewne możliwości w tym zakresie to mimo wszystko to Power BI posiada je na zdecydowanie wyższym poziomie.
Zanim przejdziemy do właściwego tematu chciałem przypomnieć, że w ramach bloga opisywaliśmy już kilka scenariuszy związanych z wykorzystaniem Power Apps i chętnych odsyłam do tych właśnie treści:
Streaming danych z Power Apps do Power BI przy pomocy Microsoft Flow
Power BI + Power Apps – wprowadzanie danych na raporcie
Power-up your BI project with PowerApps – materiały z prezentacji
Dziś jednak temat rozszerzymy podchodząc do niego z nieco innej strony. Pierwszym krokiem jaki podejmiemy będzie stworzenie raportu Power BI. Naszym źródłem będzie baza Adventure Works Lite dostępna jako wzorzec w Azure SQL Database. Sam model jest bardzo prosty lecz wystarczający do osiągnięcia zamierzonego celu:
Z punktu widzenia wizualizacji to mamy ich “aż” dwie:
Wykres przedstawia sumę pola OrderQty w stosunku do pola Size. Karta przedstawia listę kolorów w danym kontekście. Mając te wizualizacje do dyspozycji wrzuciłem raport na portal. Wykres przypiąłem na dashboardzie po to żeby powstał kafelek (Tile), którego można osadzić w Power Appce:
Po stronie Power Apps wybieramy ze wstążki Insert -> Power BI tile:
Formatka ta pozwala osadzić nie tylko kafelek z dashboardu Power BI tak jak wskazuje nazwa ale też inne komponenty. Po zaznaczeniu formatki mamy możliwość graficznego zdefiniowania Workspace, Dashboardu oraz konkretnego kafelka tak jak można zauważyć na poniższym zrzucie ekranowym:
Oczywiście wyświetlone zostaną nam elementy z tego samego tenanta serwisu Power BI w którym znajduje się Power Apps do których mamy dostęp. Po dokonaniu wyboru naszym oczom powinien ukazać się wybrany przez nas kafelek:
Wszystko przebiegło bez większego problemu i działa bez zarzutu ale to oczywiście nie wszystko. Kilka ciekawych rzeczy znajdziemy gdy zajrzymy do właściwości formatki z wykresem. Pierwszą z nich jest AllowNewAPI która przyjmuje wartość True bądź False – w dokumentacji możemy dostać następującą linijkę tłumaczącą działanie tej właściwości:
AllowNewAPI – Whether to use the new API when calling the Power BI service. Setting the value to True will allow the use of the new Power BI API (which isn’t supported in mobile and some embedded scenarios, but allows some more advanced filtering). False will use the original API. Default value is false.
Polecam używać nowego API ponieważ daje nieco większe możliwości (jak przekazywanie filtrów) i obserwować czy wszystko działa tak jak zakładamy.
Kolejna właściwość to LoadPowerBIContent – oznacza ona, że osadzona przez nas zawartość będzie załadowana lub nie. Po co nam taka kontrola? Ogólnie jeśli mamy wiele osadzonych formatek PBI to może to wpłynąć na wydajność całej aplikacji, dlatego też warto pomyśleć o sterowaniu tym co ma się wyświetlać i w jakich warunkach.
Ostatnią właściwością o której chciałbym wspomnieć jest PowerBIInteractions. Ustawiona na True pozwala na to, żeby “klikać” po osadzonym elemencie i działać z nim tak jak ze standardowym elementem Power BI nie odpalając przy tym PowerAppkowego wydarzenia OnSelect, które normalnie się w takim wypadku zostanie wywołana. Ustawienie False wyłączy interakcje i pozwala odpalić rzeczony OnSelect.
Osadzony w ten sposób element sam w sobie może być wartościowy jednakże to nie jedyne co możemy zrobić. Istnieje możliwość przekazania filtra z Power Apps bezpośrednio do tego kafelka poprzez URL. Aby to zrobić podłączmy się z poziomu PowerApps do Azure SQL Database – zrobimy to wybierając zakładkę Data sources z bocznego panelu i wyszukując konektor SQL Server:
Definicja połączenia jest raczej standardowa jednak warto wspomnieć o dostępnych metodach uwierzytelniania:
To co bardzo istotne to fakt, że wspierane jest uwierzytelnienie po Azure AD czyli w momencie gdy mamy w Power BI ustawione Row Level Security po UPN użytkownika to będzie nadal to działać po stronie osadzanego elementu w Power Apps bez dodatkowych czynności z naszej strony. Na potrzeby przekazania filtra do PBI z PA pobieramy do Power Apps tabele SalesLT.Product z naszej testowej bazy danych. Następnie na pole aplikacji dodajemy formatkę DropDown na której będziemy mogli wybrać interesujący nas rozmiar czyli pole z bazy o nazwie Size. Zrobimy to wybierając opcję Insert dostępną po lewej stronie i wyszukując formatkę Drop down:
W dalszym kroku musimy podpiąć do formatki dodane wcześniej źródło – zaznaczamy zatem DropDown i we właściwości Items odpowiadającej za wyświetlane elementy do wyboru wprowadźmy:
Distinct('SalesLT.Product',Size)
Wybieramy zatem wartości unikalne w kolumnie Size – efekt powinien być podobny do poniższego:
Teraz naszym celem jest przesłanie do Power BI wyboru z Dropdown. Możemy to zrobić w stosunkowo łatwy sposób modyfikując URL w Power BI Tile. Właściwość nazywa się TileUrl i zawiera następujący URL (przykładowo):
“https://app.powerbi.com/embed?dashboardId=01a0758b-ccf0-4022-b0a3-8df09929addb&tileId=d0807d32-5f3e-4902-a8e2-5d36cacb2b06&config=eyJjbHVzdGVyVXJsIjoiaHR0cHM6Ly9XQUJJLVdFU1QtRVVST1BFLUQtUFJJTUFSWS1yZWRpcmVjdC5hbmFseXNpcy53aW5kb3dzLm5ldCIsImVtYmVkRmVhdHVyZXMiOnsibW9kZXJuRW1iZWQiOmZhbHNlfX0%3d”
Mamy zatem identyfikator dashboardu (dashboardId) oraz elementu na tym dashboardzie (tileId) oraz wartość konfiguracyjną (config) aby przesłać do niego dodatkową filtrację wystarczy coś na wzór:
&$filter=<TableName>/<ColumnName> eq '<Value>'
W moim przypadku będzie to wyglądało następująco:
“https://app.powerbi.com/embed?dashboardId=01a0758b-ccf0-4022-b0a3-8df09929addb&tileId=d0807d32-5f3e-4902-a8e2-5d36cacb2b06&config=eyJjbHVzdGVyVXJsIjoiaHR0cHM6Ly9XQUJJLVdFU1QtRVVST1BFLUQtUFJJTUFSWS1yZWRpcmVjdC5hbmFseXNpcy53aW5kb3dzLm5ldCIsImVtYmVkRmVhdHVyZXMiOnsibW9kZXJuRW1iZWQiOmZhbHNlfX0%3d&$filter=SalesLTProduct/Size eq ‘”&Dropdown2.SelectedText.Value&”‘”
Długość URL nie jest limitowana jakoś specjalnie przez serwis Power BI jednakże zawsze warto pamiętać, że każda przeglądarka ma swój własny limit co do url. Dropdown2 to oczywiście nazwa mojej formatki gdzie wybieram rozmiar. Teraz wybór w Power App powinien automatycznie być przesłany do Power BI:
Niestety w przesyłaniu tego typu filtrów mamy pewne ograniczenia np.:
- Możemy przesłać tylko jeden filtr,
- jedynie operator eq jest wspierany,
- filtrowane pole musi być typu tekstowego,
- wizualizacje typu R lub Python nie mogą być użyte
Przejdźmy do osadzenia samego raportu – na portalu otwieramy pożądany raport i w File wybireamy Embed report -> Website or portal:
Naszym oczom powinno ukazać się okno z URL do raportu oraz gotowym Iframe do osadzenia:
Nas interesuje czysty URL, który możemy skopiować i wkleić do właściwości TileUrl naszej formatki Power BI dostępnej w Power Apps.
Również w tym przypadku wbrew dokumentacji jesteśmy w stanie przesłać parametr z Power Apps:
W tym przypadku nie mamy takich ograniczeń tak jak w przypadku osadzania Tile i możemy filtrować wiele wartości i różne pola np poniższy kod filtruje atrybut Size równy ‘S’,’L’ lub ten wybrany z drop down oraz kolor ma być równy Black:
“https://app.powerbi.com/reportEmbed?reportId=d6636e96-9de4-45d5-b682-33a1fd0d4244&autoAuth=true&ctid=14cdbf2d-dbe6-44b6-b57d-5c2dad621afb&config=eyJjbHVzdGVyVXJsIjoiaHR0clLWQtcHJpbWFyeS1yZWRpcmVjdC5hbmFseXNpcy53aW5kb3dzLm5ldC8ifQ%3D%3D” & “&$filter=SalesLTProduct/Size in (‘”&
Dropdown2.SelectedText.Value
&”‘,’S’,’L’) and SalesLTProduct/Color eq ‘Black'”
rezultat jest dokładnie taki jak oczekiwaliśmy:
Pamiętajmy również, że możemy użyć całego szeregu właściwości przekazywanych przez URL aby np. ukryć elementy i tak poniższe filtry ukrywają filter pane oraz poszczególne zakładki używając kolejno filterPaneEnabled oraz navContentPaneEnabled:
&filterPaneEnabled=false&navContentPaneEnabled=false
Ogólnie rzecz biorąc polecam zapoznać się z dokumentacją gdzie wyszczególnione są wszystkie możliwości jakie mogą okazać się przydatne przy osadzaniu raportów:
Filter a report using query string parameters in the URL
Jak widzicie embedding komponentów Power BI wewnątrz aplikacji Power Apps jest prosty i nie wymaga wiele wysiłku. Jedyne o czym należy pamiętać to zabezpieczenie danych po stronie raportu oraz odpowiednie przesłanie filtrów z Power Apps do Power BI. Jeśli chodzi o integrację pomiędzy komponentami Power Platform z całą pewnością to nie wszystko dlatego też w najbliższym czasie postaram się napisać na ten temat nieco więcej. Pozdrawiam.
- Avoiding Issues: Monitoring Query Pushdowns in Databricks Federated Queries - October 27, 2024
- Microsoft Fabric: Using Workspace Identity for Authentication - September 25, 2024
- Executing SQL queries from Azure DevOps using Service Connection credentials - August 28, 2024
Last comments