{"id":203,"date":"2018-05-23T15:50:54","date_gmt":"2018-05-23T13:50:54","guid":{"rendered":"http:\/\/cwiok.pl\/?p=203"},"modified":"2018-05-24T07:47:27","modified_gmt":"2018-05-24T05:47:27","slug":"zapetlenie-zapytania-internetowego-po-wierszach-w-tabeli-w-powerbi","status":"publish","type":"post","link":"https:\/\/cwiok.pl\/index.php\/pl\/2018\/05\/23\/zapetlenie-zapytania-internetowego-po-wierszach-w-tabeli-w-powerbi\/","title":{"rendered":"Zap\u0119tlenie zapytania internetowego po wierszach w tabeli w Power BI"},"content":{"rendered":"<p>Jako nowozatrudniony Datanauta w Clouds on Mars pracuj\u0119 z Power BI ka\u017cdego dnia. Moje pierwsze, kr\u00f3tkie zadanie polega\u0142o na wsparciu klienta przy \u0142\u0105czeniu si\u0119 z API w Power BI. Pilota\u017cowy raport by\u0142 po\u0142\u0105czony tylko z jedn\u0105 stron\u0105 internetow\u0105. Klient wymaga\u0142 natomiast, \u017ceby raport pobiera\u0142 dane z wielu r\u00f3\u017cnych stron. Dodatkowo, lista stron powi\u0119ksza\u0142a si\u0119 w czasie (by\u0142a r\u00f3wnie\u017c jednym z zapyta\u0144 API). Z technicznego punktu widzenia wymaga\u0142o to iteracji po elementach ID w tabeli i \u0142\u0105czeniu si\u0119 z nowym adresem URL z kolejnym ID. By\u0142a to dobra okazja do wykorzystania j\u0119zyka M. W M nie ma funkcji p\u0119tli, wi\u0119c musia\u0142em obej\u015b\u0107 ten problem.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-224\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_.jpg\" alt=\"\" width=\"1200\" height=\"628\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_.jpg 1200w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_-300x157.jpg 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_-768x402.jpg 768w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_-1024x536.jpg 1024w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><br \/>\n\u017beby pokaza\u0107 moje rozwi\u0105zanie tego problemu u\u017cyj\u0119 przyk\u0142adu &#8211; danych pogodowych z kilku miast w Polsce. URL wygl\u0105da tak:<\/p>\n<p>&nbsp;<\/p>\n<p>https:\/\/danepubliczne.imgw.pl\/api\/data\/synop\/station\/jeleniagora<\/p>\n<p>Mam na celu pobranie danych z 7 miast, kt\u00f3re umie\u015bci\u0142em w tabeli Cities:<\/p>\n<p>City<br \/>\njeleniagora<br \/>\nwarszawa<br \/>\nszczecin<br \/>\nkoszalin<br \/>\nlublin<br \/>\nkatowice<br \/>\nlegnica<\/p>\n<p>Pobranie danych manualnie wymaga\u0142oby importu z 7 stron, a nast\u0119pnie po\u0142\u0105czenie ich. Wykonalne. Natomiast, pobranie danych dla 100 miast lub listy miast, kt\u00f3ra si\u0119 zmienia, by\u0142oby znacznie trudniejsze. Dla przejrzysto\u015bci podzieli\u0142em ca\u0142y proces na kilka nast\u0119puj\u0105cych krok\u00f3w:<\/p>\n<ol>\n<li>Pierwszy krok polega na pobraniu danych dla jednego z miast i wykonaniu wszystkich transformacji. Mo\u017cna u\u017cy\u0107 funkcji dost\u0119pnych domy\u015blnie i nie trzeba wykorzystywa\u0107 j\u0119zyka M. Po pobraniu danych, otrzymuj\u0119 tabel\u0119:<\/li>\n<\/ol>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Table_1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-216 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Table_1.png\" alt=\"\" width=\"267\" height=\"238\" \/><\/a><\/p>\n<p>Naturalnie, \u017ceby dane by\u0142y \u0142atwiejsze do z\u0142\u0105czenia z danymi dla pozosta\u0142ych miast, wykonuj\u0119 operacj\u0119 <em>Pivot<\/em> i zmieniam nazwy kolumn.<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Table_2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-217 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Table_2.png\" alt=\"\" width=\"1477\" height=\"56\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Table_2.png 1477w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Table_2-300x11.png 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Table_2-768x29.png 768w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Table_2-1024x39.png 1024w\" sizes=\"auto, (max-width: 1477px) 100vw, 1477px\" \/><\/a><\/p>\n<p>Drugi krok to stworzenie funkcji, kt\u00f3ra przyjmuje nazw\u0119 miasta jako parametr i zwraca tabel\u0119 podobn\u0105 do tej wy\u017cej. Jest to mo\u017cliwe za pomoc\u0105 interfejsu Power BI, ale skupi\u0119 si\u0119 na j\u0119zyku M i edytorze zapyta\u0144:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Advanced_editor.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-207 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Advanced_editor.png\" alt=\"\" width=\"430\" height=\"128\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Advanced_editor.png 430w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Advanced_editor-300x89.png 300w\" sizes=\"auto, (max-width: 430px) 100vw, 430px\" \/><\/a><\/p>\n<p>Skrypt poni\u017cej pokazuje proces transformacji z pierwszym miastem &#8211; Jeleni\u0105 G\u00f3r\u0105. Musz\u0119 zmodyfikowa\u0107 skrypt i zmieni\u0107 nazw\u0119 miasta na parametr. To pozwoli mi pobiera\u0107 dane z r\u00f3\u017cnych stron przy ka\u017cdym wywo\u0142aniu funkcji.<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/M_1-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-212 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/M_1-1.png\" alt=\"\" width=\"1021\" height=\"134\" \/><\/a><\/p>\n<p>Aby stworzy\u0107 funkcj\u0119 musz\u0119 najpierw zadeklarowa\u0107 parametr &#8211; city &#8211; u\u017cywaj\u0105c frazy: &#8220;(city as text) =&gt;&#8221; na pocz\u0105tku skryptu. Nast\u0119pnie, zamieniam &#8220;jeleniagora&#8221; na parametr city i \u0142\u0105cz\u0119 je u\u017cywaj\u0105c znaku &amp; &#8211; zupe\u0142nie jak w Excelu. Gotowy skrypt wygl\u0105da tak:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/M_2-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-213 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/M_2-1.png\" alt=\"\" width=\"943\" height=\"190\" \/><\/a><\/p>\n<p>Jest on bardzo podobny do skryptu z pierwszej tabeli. Zmieniam nazw\u0119 na get_weather. Mog\u0119 wywo\u0142a\u0107 funkcj\u0119 poprzez wpisanie parametru.<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/M_query.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-215 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/M_query.png\" alt=\"\" width=\"290\" height=\"178\" \/><\/a><\/p>\n<p>Trzeci krok polega na wywo\u0142aniu funkcji get_weather dla ka\u017cdego z miast w jednej tabeli. Wybieram puste zapytanie i wpisuje skrypt taki jak poni\u017cej:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-214 aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/M_3.png\" alt=\"\" width=\"454\" height=\"87\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/M_3.png 454w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/M_3-300x57.png 300w\" sizes=\"auto, (max-width: 454px) 100vw, 454px\" \/><\/p>\n<p>City_names daje mi list\u0119 miast, dla kt\u00f3rych chc\u0119 otrzyma\u0107 dane pogodowe. Poprzez u\u017cycie funkcji List.Transform(city_names, each get_weather(_)) Power BI wywo\u0142uje funkcj\u0119 dla ka\u017cdego z miast na li\u015bcie i skleja odpowiedzi w list\u0119. Wynik transformacji powinien wygl\u0105da\u0107 tak:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Loop_1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-210 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Loop_1.png\" alt=\"\" width=\"130\" height=\"177\" \/><\/a><\/p>\n<p>Aby otrzyma\u0107 dane musz\u0119 przekonwertowa\u0107 list\u0119 na tabel\u0119:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Loop_2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-211 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Loop_2.png\" alt=\"\" width=\"352\" height=\"254\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Loop_2.png 352w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Loop_2-300x216.png 300w\" sizes=\"auto, (max-width: 352px) 100vw, 352px\" \/><\/a><\/p>\n<p>A nast\u0119pnie j\u0105 rozwin\u0105\u0107:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Expand_1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-208 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Expand_1.png\" alt=\"\" width=\"369\" height=\"439\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Expand_1.png 369w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Expand_1-252x300.png 252w\" sizes=\"auto, (max-width: 369px) 100vw, 369px\" \/><\/a><\/p>\n<p>To daje mi tabel\u0119 z danymi dla ka\u017cdego z miast:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Final.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-209 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Final.png\" alt=\"\" width=\"1485\" height=\"198\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Final.png 1485w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Final-300x40.png 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Final-768x102.png 768w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Final-1024x137.png 1024w\" sizes=\"auto, (max-width: 1485px) 100vw, 1485px\" \/><\/a><\/p>\n<p>To podej\u015bcie mo\u017cna zastosowa\u0107 r\u00f3wnie\u017c dla innych \u017ar\u00f3de\u0142 danych. Wa\u017cn\u0105 informacj\u0105 do zapami\u0119tania jest mo\u017cliwo\u015b\u0107 iteracji po elementach w li\u015bcie za pomoc\u0105 funkcji List.Transform(). Je\u015bli znacie inne sposoby, prosz\u0119 podzielcie si\u0119 z nimi!<\/p>\n<p>Dzi\u0119ki,<br \/>\nMicha\u0142<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Moje pierwsze kr\u00f3tkie zadanie w nowej pracy polega\u0142o na wsparciu klienta przy \u0142\u0105czeniu si\u0119 z API w Power BI. Pilota\u017cowy raport by\u0142 po\u0142\u0105czony tylko z jedn\u0105 stron\u0105 internetow\u0105. Klient wymaga\u0142 natomiast, \u017ceby raport pobiera\u0142 dane z wielu r\u00f3\u017cnych stron. Wymaga\u0142o to dynamicznego odpytywania strony internetowej i postanowi\u0142em napisa\u0107 to w j\u0119zyku M.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_-1.jpg\" alt=\"\" width=\"1200\" height=\"628\" class=\"alignnone size-full wp-image-235\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_-1.jpg 1200w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_-1-300x157.jpg 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_-1-768x402.jpg 768w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artyku\u0142_01_-1-1024x536.jpg 1024w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/p>\n<div class=\"tech_read_more\"><a href=\"https:\/\/cwiok.pl\/index.php\/pl\/2018\/05\/23\/zapetlenie-zapytania-internetowego-po-wierszach-w-tabeli-w-powerbi\/\">Read More<\/a><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32],"tags":[],"class_list":["post-203","post","type-post","status-publish","format-standard","hentry","category-powerbi-pl"],"_links":{"self":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/203","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/comments?post=203"}],"version-history":[{"count":0,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/203\/revisions"}],"wp:attachment":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/media?parent=203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/categories?post=203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/tags?post=203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}