{"id":370,"date":"2018-06-13T08:00:44","date_gmt":"2018-06-13T06:00:44","guid":{"rendered":"http:\/\/cwiok.pl\/?p=370"},"modified":"2018-06-27T08:52:52","modified_gmt":"2018-06-27T06:52:52","slug":"real-loop-function-in-power-bi","status":"publish","type":"post","link":"https:\/\/cwiok.pl\/index.php\/pl\/2018\/06\/13\/real-loop-function-in-power-bi\/","title":{"rendered":"Funkcja p\u0119tli w Power BI"},"content":{"rendered":"<p>Dzisiaj napisz\u0119 w jaki spos\u00f3b stworzy\u0107 funkcj\u0119 p\u0119tli w Power BI u\u017cywaj\u0105c List.Generate() i funkcji niestandardowej. Zaprezentuje to na przyk\u0142adzie przej\u015bcia przez kolejne strony przy zapytaniu API. W Pythonie pewnie zrobi\u0142bym to w\u0142a\u015bnie ze pomoc\u0105 funkcji &#8220;for&#8221;. <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-372\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer.png\" alt=\"\" width=\"1200\" height=\"628\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer.png 1200w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer-300x157.png 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer-768x402.png 768w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer-1024x536.png 1024w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/p>\n<p>W Power Query i j\u0119zyku M nie ma funkcji, kt\u00f3ra przypomina\u0142aby funkcj\u0119 &#8220;For&#8221;. Jest ona cz\u0119sto potrzebna, wi\u0119c wzgl\u0119du musia\u0142em znale\u017a\u0107 obej\u015bcie. Na forach znalaz\u0142em informacje, \u017ce du\u017co developer\u00f3w stosuj\u0119 funkcj\u0119 List.Generate() do tworzenia listy z kolejnymi liczbami naturalnymi. Jest ona nast\u0119pnie wykorzystywana w funkcji List.Transform(), kt\u00f3ra wywo\u0142uj\u0119 funkcj\u0119 niestandardow\u0105 dla ka\u017cdej z liczb. <\/p>\n<p>Jako przyk\u0142ad b\u0119d\u0119 odpytywa\u0142 API z informacjami dotycz\u0105cymi przepis\u00f3w na piwo. Wiem, \u017ce jest dost\u0119pnych 10 stron. Ta liczba mog\u0142aby r\u00f3wnie\u017c by\u0107 dynamicznym rezultatem innego zapytania. <\/p>\n<pre class=\"toolbar:1 toolbar-delay:false lang:default decode:true\">https:\/\/api.punkapi.com\/v2\/beers<\/pre>\n<p>Pobranie danych z pierwszej strony jest proste: <\/p>\n<pre class=\"toolbar:1 toolbar-delay:false lang:default decode:true\">let\r\n    Source = Json.Document(Web.Contents(\"https:\/\/api.punkapi.com\/v2\/beers?page=1\")),\r\n    Table = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),\r\n   Expanded = Table.ExpandRecordColumn(Table, \"Column1\", {\"id\", \"name\", \"tagline\", \"first_brewed\", \"description\", \"image_url\", \"abv\", \"ibu\", \"target_fg\", \"target_og\", \"ebc\", \"srm\", \"ph\", \"attenuation_level\", \"volume\", \"boil_volume\", \"method\", \"ingredients\", \"food_pairing\", \"brewers_tips\", \"contributed_by\"}, {\"Column1.id\", \"Column1.name\", \"Column1.tagline\", \"Column1.first_brewed\", \"Column1.description\", \"Column1.image_url\", \"Column1.abv\", \"Column1.ibu\", \"Column1.target_fg\", \"Column1.target_og\", \"Column1.ebc\", \"Column1.srm\", \"Column1.ph\", \"Column1.attenuation_level\", \"Column1.volume\", \"Column1.boil_volume\", \"Column1.method\", \"Column1.ingredients\", \"Column1.food_pairing\", \"Column1.brewers_tips\", \"Column1.contributed_by\"})\r\nin\r\n    Expanded<\/pre>\n<p>Natomiast, jak podej\u015b\u0107 do problemu kolejnych stron? Pierwszym krokiem jest stworzenie funkcji niestandardowej. B\u0119dzie ona zwraca\u0142a tabl\u0119 z przepisami z wybranej strony. Wystarczy lekko zedytowa\u0107 kod wy\u017cej:<\/p>\n<pre class=\"toolbar:1 toolbar-delay:false lang:default decode:true\">(page as number) =&gt;\r\n\r\n\r\nlet\r\n    Source = Json.Document(Web.Contents(\"https:\/\/api.punkapi.com\/v2\/beers?page=\"&amp;Text.From(page))),\r\n    Table = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),\r\n   Expanded = Table.ExpandRecordColumn(Table, \"Column1\", {\"id\", \"name\", \"tagline\", \"first_brewed\", \"description\", \"image_url\", \"abv\", \"ibu\", \"target_fg\", \"target_og\", \"ebc\", \"srm\", \"ph\", \"attenuation_level\", \"volume\", \"boil_volume\", \"method\", \"ingredients\", \"food_pairing\", \"brewers_tips\", \"contributed_by\"}, {\"Column1.id\", \"Column1.name\", \"Column1.tagline\", \"Column1.first_brewed\", \"Column1.description\", \"Column1.image_url\", \"Column1.abv\", \"Column1.ibu\", \"Column1.target_fg\", \"Column1.target_og\", \"Column1.ebc\", \"Column1.srm\", \"Column1.ph\", \"Column1.attenuation_level\", \"Column1.volume\", \"Column1.boil_volume\", \"Column1.method\", \"Column1.ingredients\", \"Column1.food_pairing\", \"Column1.brewers_tips\", \"Column1.contributed_by\"})\r\nin\r\n    Expanded<\/pre>\n<p>Z gotow\u0105 funkcj\u0105 niestandardow\u0105, mog\u0119 przej\u015b\u0107 do tworzenia listy z liczbami naturalnymi. Nast\u0119pnie wywo\u0142am moj\u0105 funkcj\u0119 dla ka\u017cego z nich. Wykorzystam do tego List.Transform().<\/p>\n<pre class=\"toolbar:1 toolbar-delay:false lang:default decode:true\">let\r\n\r\n    Pages = 10,\r\n    Numbers = List.Generate(()=&gt;1, each _ &lt;= Pages, each _ +1),\r\n    Beers= List.Transform(Numbers, each Bring_me_some_beer(_)),\r\n   Table = Table.FromList(Beers, Splitter.SplitByNothing(), null, null, ExtraValues.Error),\r\n   Expanded = Table.ExpandTableColumn(Table, \"Column1\", {\"Column1.id\", \"Column1.name\", \"Column1.tagline\", \"Column1.first_brewed\", \"Column1.description\", \"Column1.image_url\", \"Column1.abv\", \"Column1.ibu\", \"Column1.target_fg\", \"Column1.target_og\", \"Column1.ebc\", \"Column1.srm\", \"Column1.ph\", \"Column1.attenuation_level\", \"Column1.volume\", \"Column1.boil_volume\", \"Column1.method\", \"Column1.ingredients\", \"Column1.food_pairing\", \"Column1.brewers_tips\", \"Column1.contributed_by\"}, {\"Column1.id\", \"Column1.name\", \"Column1.tagline\", \"Column1.first_brewed\", \"Column1.description\", \"Column1.image_url\", \"Column1.abv\", \"Column1.ibu\", \"Column1.target_fg\", \"Column1.target_og\", \"Column1.ebc\", \"Column1.srm\", \"Column1.ph\", \"Column1.attenuation_level\", \"Column1.volume\", \"Column1.boil_volume\", \"Column1.method\", \"Column1.ingredients\", \"Column1.food_pairing\", \"Column1.brewers_tips\", \"Column1.contributed_by\"})\r\nin\r\n  Expanded<\/pre>\n<p>Zamiast List.Generate() m\u00f3g\u0142bym r\u00f3wnie\u017c wykorzysta\u0107 List.Numbers(1,10). Da\u0142oby to dok\u0142adnie ten sam efekt. Co my\u015blicie o tym rozwi\u0105zaniu? Dajcie zna\u0107!<\/p>\n<p>Dzi\u0119ki<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj napisz\u0119 w jaki spos\u00f3b stworzy\u0107 funkcj\u0119 p\u0119tli w Power BI u\u017cywaj\u0105c List.Generate() i funkcji niestandardowej. Zaprezentuje jak przej\u015b\u0107 przez kolejne strony przy zapytaniu API. W Pythonie zosta\u0142o by to zrobione w\u0142a\u015bnie ze pomoc\u0105 funkcji &#8220;for&#8221;. <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-372\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer.png\" alt=\"\" width=\"1200\" height=\"628\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer.png 1200w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer-300x157.png 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer-768x402.png 768w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/06\/artyku\u0142_06_sorcerer-1024x536.png 1024w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/p>\n<div class=\"tech_read_more\"><a href=\"https:\/\/cwiok.pl\/index.php\/pl\/2018\/06\/13\/real-loop-function-in-power-bi\/\">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-370","post","type-post","status-publish","format-standard","hentry","category-powerbi-pl"],"_links":{"self":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/370","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=370"}],"version-history":[{"count":0,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/370\/revisions"}],"wp:attachment":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/media?parent=370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/categories?post=370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/tags?post=370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}