{"id":34669,"date":"2026-08-26T05:00:00","date_gmt":"2026-08-26T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=34669"},"modified":"2026-08-21T11:03:24","modified_gmt":"2026-08-21T09:03:24","slug":"automatyzacja-pracy-z-ssas-czyli-jak-nie-zwariowac-klikajac-500-razy-to-samo","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/automatyzacja-pracy-z-ssas-czyli-jak-nie-zwariowac-klikajac-500-razy-to-samo\/","title":{"rendered":"Automatyzacja pracy z SSAS, czyli jak nie zwariowa\u0107, klikaj\u0105c 500 razy to samo"},"content":{"rendered":"\n<p>Je\u015bli kiedykolwiek tworzy\u0142e\u015b model w SSAS Tabular albo PowerBI Desktop i r\u0119cznie ustawia\u0142e\u015b formatowanie, poprawia\u0142e\u015b nazwy, dodawa\u0142e\u015b prawie identyczne miary, to wiesz, \u017ce szybko mo\u017cna zacz\u0105\u0107 kwestionowa\u0107 swoje wybory \u017cyciowe. Klikasz w te same opcje raz za razem w niesko\u0144czono\u015b\u0107\u2026 To nie jest praca, to katorga. Na szcz\u0119\u015bcie istnieje lepszy spos\u00f3b i w\u0142a\u015bnie o nim b\u0119dzie ten artyku\u0142.<\/p>\n\n\n\n<p>Zapraszam do poznania <strong>Advanced Scripting w Tabular Editorze<\/strong> \u2013 narz\u0119dzia, kt\u00f3re pozwala zautomatyzowa\u0107 powtarzalne zadania, oszcz\u0119dzi\u0107 czas i zachowa\u0107 resztki zdrowego rozs\u0105dku. <strong>Poka\u017c\u0119 konkretne przyk\u0142ady skrypt\u00f3w, przydatne triki i sposoby na to, jak sprawi\u0107, \u017ceby model \u201erobi\u0142 si\u0119 sam\u201d. No, prawie sam.<\/strong><\/p>\n\n\n\n<p>Potrzebne oprogramowanie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tabular Editor \u2013 np. wersja portable, artyku\u0142 opracowano przy u\u017cyciu wersji 2.27.2<\/li>\n\n\n\n<li>Power BI Desktop artyku\u0142 opracowano przy u\u017cyciu wersji 2.156.951.0 64-bit<\/li>\n<\/ul>\n\n\n\n<p>Na potrzeby tego case study b\u0119dziemy u\u017cywa\u0107 modelu SSAS tworzonego automatycznie przez Power BI desktop, jednak te same operacje mo\u017cna wykona\u0107 na dowolnym modelu SSAS Tabular oraz dowolnym modelu stworzonym w Power BI Desktop.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jakie mo\u017cliwo\u015bci daje Advanced Scripting w Tabular Editor?<\/strong><\/h2>\n\n\n\n<p>Najkr\u00f3cej \u2013 ogromne.<\/p>\n\n\n\n<p>Ze wzgl\u0119du na relatywnie proste operacje i dobr\u0105 dokumentacj\u0119 tego procesu na stronie Tabular Editor oraz Microsoft, <strong>nie jest konieczna znajomo\u015b\u0107 C#<\/strong> \u2013 najpowszechniejsze operacje mo\u017cna dopasowa\u0107 z opisanych przyk\u0142ad\u00f3w i opracowa\u0107 intuicyjnie.<\/p>\n\n\n\n<p>Wykorzystuj\u0105c proste skrypty C#, mo\u017cemy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>zautomatyzowa\u0107 tworzenie miar,<\/li>\n\n\n\n<li>doda\u0107 automatycznie opisy p\u00f3l,<\/li>\n\n\n\n<li>zmieni\u0107 wybrane znaki lub s\u0142owa w nazwach kolumn,<\/li>\n\n\n\n<li>doda\u0107 translacje,<\/li>\n\n\n\n<li>doda\u0107 miary zdefiniowane w osobnym pliku<\/li>\n<\/ul>\n\n\n\n<p>i wiele, wiele wi\u0119cej.<\/p>\n\n\n\n<p>W tym artykule skupimy si\u0119 na najpowszechniejszych operacjach, kt\u00f3re mog\u0105 by\u0107 u\u017cyteczne dla in\u017cynier\u00f3w analitycznych modeli danych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Case study<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Definicja modelu<\/strong><\/h3>\n\n\n\n<p>\u0179r\u00f3d\u0142em danych dla naszego przyk\u0142adowego modelu b\u0119dzie sztucznie wygenerowany zestaw informacji o przesy\u0142kach.<\/p>\n\n\n\n<p>Do rozpocz\u0119cia pracy z Tabular Editorem potrzebujemy otworzy\u0107 model \u2013 w naszym przypadku wykorzystamy opcj\u0119 otworzenia modelu z istniej\u0105cej bazy:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23ed4cb&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23ed4cb\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"727\" height=\"267\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image1-3.png\" alt=\"screen programu\" class=\"wp-image-34670\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image1-3.png 727w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image1-3-300x110.png 300w\" sizes=\"(max-width: 727px) 100vw, 727px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Z dost\u0119pnych opcji wybieramy Local instance oraz localhost:Przesylki.pbix \u2013 pami\u0119taj, by zobaczy\u0107 tu plik, musi by\u0107 on w danej chwili otwarty na Twoim komputerze w Power BI Desktop!<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23edc74&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23edc74\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"486\" height=\"257\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image2-3.png\" alt=\"screen programu\" class=\"wp-image-34672\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image2-3.png 486w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image2-3-300x159.png 300w\" sizes=\"(max-width: 486px) 100vw, 486px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Dodanie translacji ze zmienionym znakiem w nazwie<\/strong><\/h3>\n\n\n\n<p>Cz\u0119stym problemem przy importowaniu danych, szczeg\u00f3lnie do Power BI Desktop, s\u0105 mocno techniczne nazwy kolumn, kt\u00f3re trzeba r\u0119cznie zmienia\u0107, niejednokrotnie przepisuj\u0105c t\u0119 sam\u0105 nazw\u0119, ale zamieniaj\u0105c znak podkre\u015blenia na spacj\u0119 lub zmieniaj\u0105c wielko\u015b\u0107 liter. Z advanced scripting mo\u017cemy zrobi\u0107 to w par\u0119 chwil.<\/p>\n\n\n\n<p>Wykorzystamy translacj\u0119 \u2013 funkcj\u0119 umo\u017cliwiaj\u0105c\u0105 tworzenie wieloj\u0119zycznych modeli. Zale\u017cnie od wybranego j\u0119zyka nazwy obiekt\u00f3w widoczne dla u\u017cytkownika b\u0119d\u0105 r\u00f3\u017cne, mimo \u017ce fizycznie nadal jest to jedna kolumna (tabela, miara itp.). W pliku pbix mamy domy\u015bln\u0105 translacj\u0119 zale\u017cn\u0105 od j\u0119zyka modelu, kt\u00f3ry sprawdzi\u0107 mo\u017cemy w opcjach pliku w ustawieniach regionalnych. W przypadku pliku, na kt\u00f3rym pracujemy, jest to j\u0119zyk aplikacji, czyli angielski. Sprawia to, \u017ce w modelu domy\u015blnie mamy dodan\u0105 translacj\u0119 \u2018en-US\u2019.<\/p>\n\n\n\n<p>W poni\u017cszym skrypcie nazwy przypisywane s\u0105 do domy\u015blnej translacji modelu, ale nie jest to zalecana praktyka \u2013 zazwyczaj dodajemy translacje dla innych j\u0119zyk\u00f3w. W innym przypadku plik mo\u017ce raz u\u017cywa\u0107 nazw oryginalnych, a innym razem przet\u0142umaczonych.<\/p>\n\n\n\n<p>U\u017cywaj\u0105c tabular editora, mo\u017cemy doda\u0107 do modelu wiele r\u00f3\u017cnych translacji. W artykule odwo\u0142ujemy si\u0119 do \u201een-US\u201d jako przyk\u0142adu.<\/p>\n\n\n\n<p>W naszym modelu mamy nazwy zawieraj\u0105ce _. Skrypt doda do kolumn translacj\u0119, kt\u00f3ra zamiast tego b\u0119dzie mie\u0107 spacj\u0119. Kod, kt\u00f3ry musimy wklei\u0107 w zak\u0142adk\u0119 C#:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nforeach (var col in Selected.Columns)\n{\n    if (col.Name.Contains(&quot;_&quot;))\n    {\n        col.TranslatedNames&#x5B;&quot;en-US&quot;]  = col.Name.Replace(&quot;_&quot;, &quot; &quot;);\n    }\n}\n<\/pre><\/div>\n\n\n<p>Po wklejeniu kodu wystarczy zaznaczy\u0107 kolumny, w kt\u00f3rych chcemy dokona\u0107 zmiany i nacisn\u0105\u0107 zielony przycisk \u201erun\u201d:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23ee702&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23ee702\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"648\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image3-2-1024x648.png\" alt=\"screen programu\" class=\"wp-image-34674\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image3-2-1024x648.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image3-2-300x190.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image3-2-768x486.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image3-2.png 1062w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Po sekundzie widzimy, \u017ce w kolumnach pojawi\u0142y si\u0119 translacje, kt\u00f3re nie zawieraj\u0105 ju\u017c _, ale bardziej przyjazn\u0105 dla u\u017cytkownik\u00f3w biznesowych nazw\u0119 ze spacj\u0105:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23eedfe&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23eedfe\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"198\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image4-1024x198.png\" alt=\"screen programu\" class=\"wp-image-34676\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image4-1024x198.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image4-300x58.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image4-768x149.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image4.png 1380w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Co istotne, zmiana zosta\u0142a wykonana <strong>tylko dla zaznaczonych kolumn<\/strong>.<\/p>\n\n\n\n<p>Zmiany te nie s\u0105 widoczne bezpo\u015brednio w Power BI Desktop; stan\u0105 si\u0119 widoczne dopiero w Power BI Service po opublikowaniu raportu dla okre\u015blonych ustawie\u0144 j\u0119zyka. Translacje inne ni\u017c domy\u015blna przetestowa\u0107 mo\u017cna tak\u017ce, pod\u0142\u0105czaj\u0105c si\u0119 do modelu przez MS Excel i dodaj\u0105c do ConnectionString Locale Identifier=1045 (j\u0119zyk polski).<\/p>\n\n\n\n<p>U\u017cywaj\u0105c takiego Connection File w MS Excel, zobaczymy zmienione nazwy, je\u015bli dodali\u015bmy je dla j\u0119zyka polskiego do modelu:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23ef610&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23ef610\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"365\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image5-1024x365.png\" alt=\"screen programu\" class=\"wp-image-34678\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image5-1024x365.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image5-300x107.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image5-768x273.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image5-1536x547.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image5.png 1800w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23efcad&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23efcad\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"477\" height=\"290\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image6.png\" alt=\"screen programu\" class=\"wp-image-34680\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image6.png 477w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image6-300x182.png 300w\" sizes=\"(max-width: 477px) 100vw, 477px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Zmiana wielko\u015bci liter w nazwie<\/strong><\/h3>\n\n\n\n<p>Zdarza si\u0119 jednak, \u017ce nazwy kolumn w \u017ar\u00f3d\u0142ach podawane s\u0105 wy\u0142\u0105cznie wielkimi literami. W przyk\u0142adowym modelu dzieje si\u0119 tak dla tabel County_origin oraz County_destination. Z advanced scripting mo\u017cemy bardzo szybko sprawi\u0107, by nazwy by\u0142y bardziej przyjazne dla naszych u\u017cytkownik\u00f3w.<\/p>\n\n\n\n<p>U\u017cywaj\u0105c poni\u017cszego kodu, zamieniamy nazwy tak, by jedynie pierwsza litera by\u0142a wielka, a reszta ma\u0142a:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nforeach (var col in Selected.Columns)\n{\n    var lower = col.Name.ToLower(); \/\/ przypisanie do lower nazwy kolumny z literami zamienionymi na ma\u0142e\n    col.Name = char.ToUpper(lower&#x5B;0]) + lower.Substring(1); \/\/ zmiana nazwy tak, aby pierwszy znak by\u0142 wielki, a pozosta\u0142e ma\u0142e\n}\n<\/pre><\/div>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23f050e&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23f050e\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"173\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image7-1024x173.png\" alt=\"screen programu\" class=\"wp-image-34682\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image7-1024x173.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image7-300x51.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image7-768x130.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image7-1536x260.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image7.png 1561w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Warto zauwa\u017cy\u0107, \u017ce zmieniona zosta\u0142a nazwa kolumny, ale kolumna \u017ar\u00f3d\u0142owa pozosta\u0142a taka sama, co mo\u017ce mie\u0107 znaczenie dla \u017ar\u00f3d\u0142a danych:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23f0b31&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23f0b31\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"456\" height=\"277\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image8.png\" alt=\"screen programu\" class=\"wp-image-34684\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image8.png 456w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image8-300x182.png 300w\" sizes=\"(max-width: 456px) 100vw, 456px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Dodanie przedrostka do nazwy kolumny<\/strong><\/h3>\n\n\n\n<p>Na poprzednim przyk\u0142adzie wida\u0107 jednak, \u017ce nazwy kolumn w obu tabelach s\u0105 identyczne. W takiej sytuacji warto rozwa\u017cy\u0107 dodanie przedrostka do nazwy kolumny, by \u0142atwiej by\u0142o j\u0105 p\u00f3\u017aniej zidentyfikowa\u0107. Tu r\u00f3wnie\u017c z pomoc\u0105 przychodzi skrypt C#, z kt\u00f3rym zrobimy to w kilka chwil.<\/p>\n\n\n\n<p>Do kolumn w tabeli \u201eCounty_destination\u201d dodamy przedrostek z nazw\u0105 tabeli. Jednak by kolumna nadal wygl\u0105da\u0142a \u0142adnie dla naszych u\u017cytkownik\u00f3w, w translacji znak _ zast\u0105piony b\u0119dzie spacj\u0105.<\/p>\n\n\n\n<p>Do kolumn w tabeli \u201eCounty_origin\u201d r\u00f3wnie\u017c dodamy przedrostek \u201eOrigin_\u201d i tu r\u00f3wnie\u017c w translacji zast\u0105pimy _ spacj\u0105.<\/p>\n\n\n\n<p>Dokonuj\u0105c zmian nazw obiekt\u00f3w, musimy pami\u0119ta\u0107, \u017ce je\u015bli do zmienianych przez nas kolumn odwo\u0142uj\u0105 si\u0119 raporty albo inne obiekty w modelu, to relacje te zostan\u0105 zniszczone, a obiekty i raporty b\u0119d\u0105 zg\u0142asza\u0107 b\u0142\u0119dy. Dlatego tego typu operacje nale\u017cy przeprowadza\u0107 po wcze\u015bniejszym upewnieniu si\u0119, jakie b\u0119d\u0105 ich konsekwencje.<\/p>\n\n\n\n<p>Zaczniemy od prostszej wersji w tabeli County_origin, dodaj\u0105c jednocze\u015bnie opis pola:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nforeach (var col in Selected.Columns)\n{\n \n    col.Name = &quot;Origin_&quot;+col.Name ;   \/\/zmiana nazwy kolumny przeprzedzaj\u0105c j\u0105 sta\u0142ym tekstem oraz _\n    col.TranslatedNames&#x5B;&quot;en-US&quot;]  = col.Name.Replace(&quot;_&quot;, &quot; &quot;); \/\/ustawienie nazwy w translacji jako nowej nazwy kolumny, z _ zamienionym na spacj\u0119\n    col.Description = &quot;Identifying &quot;+col.TranslatedNames&#x5B;&quot;en-US&quot;]; \/\/ustawienie opisu pola\n\n}\n<\/pre><\/div>\n\n\n<p>Pola przed zmian\u0105:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23f1511&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23f1511\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"275\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image9-1024x275.png\" alt=\"screen programu\" class=\"wp-image-34686\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image9-1024x275.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image9-300x81.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image9-768x207.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image9.png 1030w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Po zmianie:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23f1b7c&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23f1b7c\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"1001\" height=\"504\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image10.png\" alt=\"screeen programu\" class=\"wp-image-34688\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image10.png 1001w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image10-300x151.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image10-768x387.png 768w\" sizes=\"(max-width: 1001px) 100vw, 1001px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Dla tabeli County_destination jako przedrostka nazwy kolumn mo\u017cemy u\u017cy\u0107 nazwy tabeli. Wykonamy bardzo podobne operacje, ale nasze rozszerzenie nazwy nie b\u0119dzie sta\u0142ym tekstem, ale dynamiczn\u0105 nazw\u0105 tabeli:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nforeach (var col in Selected.Columns)\n{\n \n    col.Name = Selected.Table.Name +&quot;_&quot;+col.Name ;  \/\/zmiana nazwy kolumny przeprzedzaj\u0105c j\u0105 nazw\u0105 tabeli oraz _ \n    col.TranslatedNames&#x5B;&quot;en-US&quot;]  = col.Name.Replace(&quot;_&quot;, &quot; &quot;); \/\/ustawienie nazwy w translacji jako nowej nazwy kolumny, z _ zamienionym na spacj\u0119\n    col.Description = &quot;Identifying &quot;+col.TranslatedNames&#x5B;&quot;en-US&quot;]; \/\/ustawienie opisu pola\n\n}\n<\/pre><\/div>\n\n\n<p>Pola przed zmian\u0105:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23f2307&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23f2307\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"986\" height=\"195\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image11.png\" alt=\"screen programu\" class=\"wp-image-34690\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image11.png 986w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image11-300x59.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image11-768x152.png 768w\" sizes=\"(max-width: 986px) 100vw, 986px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Pola po zamianie:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23f297b&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23f297b\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"848\" height=\"500\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image12.png\" alt=\"screen programu\" class=\"wp-image-34692\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image12.png 848w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image12-300x177.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image12-768x453.png 768w\" sizes=\"(max-width: 848px) 100vw, 848px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Dodanie miar na podstawie istniej\u0105cych kolumn<\/strong><\/h3>\n\n\n\n<p>Kiedy przygotowali\u015bmy ju\u017c kolumny w naszym modelu, warto przygotowa\u0107 r\u00f3wnie\u017c miary bazuj\u0105ce na kolumnach, no sumy, \u015brednie itp.<\/p>\n\n\n\n<p>Poni\u017cszy skrypt pozwoli nam przygotowa\u0107 sumy wybranych kolumn, jednocze\u015bnie nadaj\u0105c im odpowiednie formatowanie i opis, a tak\u017ce umie\u015bci je w nowym folderze oraz ukryje kolumn\u0119 bazow\u0105 w modelu:<br><em><br>c \u2013 kolumna bazowa, newMeasure \u2013 nowa miara bazuj\u0105ca na kolumnie bazowej c<\/em><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nforeach(var c in Selected.Columns)\n{\n    var newMeasure = c.Table.AddMeasure(\n        c.Name+&quot;_sum&quot;,                    \/\/ Nazwa nowej miary\n        &quot;SUM(&quot; + c.DaxObjectFullName + &quot;)&quot;    \/\/ DAX expression\n    );\n    \/\/ ukrycie kolumny, na kt\u00f3rej bazujemy miar\u0119:\n    c.IsHidden = true; \n    \/\/ustawienie formatowania nowej miary:\n    newMeasure.FormatString = &quot;0.00&quot;; \n    \/\/ ustawienie Display Folder dla nowych miar:\n    newMeasure.DisplayFolder = &quot;Measures&quot;; \n     \/\/ustawienie opisu nowej miary:\n    newMeasure.Description = &quot;Sum of column &quot; + c.DaxObjectFullName;  \n}\n<\/pre><\/div>\n\n\n<p>Po uruchomieniu skryptu zostaj\u0105 utworzone 3 nowe miary w nowym folderze \u201eMeasures\u201d, a ich formatowanie i opis b\u0119d\u0105 zgodne z konwencj\u0105, kt\u00f3r\u0105 zdefiniowali\u015bmy. Kolumny bazowe zosta\u0142y ukryte:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23f3209&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23f3209\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"572\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image13-1024x572.png\" alt=\"screen programu\" class=\"wp-image-34694\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image13-1024x572.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image13-300x167.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image13-768x429.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image13.png 1132w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Dodawanie obiekt\u00f3w zdefiniowanych w osobnym pliku<\/strong><\/h3>\n\n\n\n<p>Miary i kolumny tworzone w SSAS nie zawsze s\u0105 tak proste i powtarzalne. Czasem trzeba w nich zaszy\u0107 dodatkow\u0105 logik\u0119, kt\u00f3r\u0105 \u0142atwiej zdefiniowa\u0107 w innym narz\u0119dziu, np. Excelu. W sytuacji, gdy takich obiekt\u00f3w jest du\u017co, prostsz\u0105 metod\u0105 ich stworzenia b\u0119dzie u\u017cycie skryptu wczytuj\u0105cego plik z definicj\u0105 zamiast r\u0119cznego przeklejania. Eliminujemy w\u00f3wczas ryzyko zwyk\u0142ego ludzkiego b\u0142\u0119du.<\/p>\n\n\n\n<p>Tabular editor oczekuje od nas pliku w formacie tsv rozdzielanego tabulatorami. Przygotowa\u0107 taki plik mo\u017cemy np. w Excelu.<\/p>\n\n\n\n<p>Przygotowanie pliku:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Zapisujemy nazw\u0119 kolumny, jej opis oraz definicj\u0119 w kolumnach A, B i C. Kolejne wiersze to kolejne kolumny w modelu:<\/li>\n<\/ol>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23f3ac0&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23f3ac0\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"976\" height=\"147\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image14.png\" alt=\"screeen tabeli\" class=\"wp-image-34696\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image14.png 976w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image14-300x45.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image14-768x116.png 768w\" sizes=\"(max-width: 976px) 100vw, 976px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Zapisujemy sheet jako plik txt rozdzielany tabulatorami:<\/li>\n<\/ol>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f23f419a&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f23f419a\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"936\" height=\"475\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image15.png\" alt=\"screen pliku\" class=\"wp-image-34698\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image15.png 936w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image15-300x152.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image15-768x390.png 768w\" sizes=\"(max-width: 936px) 100vw, 936px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Nast\u0119pnie we w\u0142a\u015bciwo\u015bciach pliku r\u0119cznie zmieniamy rozszerzenie pliku na .tsv:<\/li>\n<\/ol>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f24006ed&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f24006ed\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"581\" height=\"251\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image16.png\" alt=\"screen pliku\" class=\"wp-image-34700\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image16.png 581w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image16-300x130.png 300w\" sizes=\"(max-width: 581px) 100vw, 581px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p><em>Pami\u0119taj, aby zamkn\u0105\u0107 plik, zanim zaakceptujesz zmian\u0119!<\/em><\/p>\n\n\n\n<p>Plik ze zmienionym rozszerzeniem zawsze mo\u017cemy otworzy\u0107 w Notepad++<\/p>\n\n\n\n<p>W poni\u017cszym skrypcie dodajemy nowe kolumny oraz miary na nich bazuj\u0105ce:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nvar targetTable = Model.Tables&#x5B;&quot;Data&quot;];  \/\/ Nazwa tabeli, do kt\u00f3rej dodajemy kolumny\nvar measureMetadata = ReadFile(@&quot;c:\\Users\\kwyderka\\Documents\\InputForArticle\\MeasureDefinition.tsv&quot;);   \/\/ Przygotowany wcze\u015bniej plik tsv\n\nvar tsvRows = measureMetadata.Split(new&#x5B;] {&#039;\\r&#039;,&#039;\\n&#039;},StringSplitOptions.RemoveEmptyEntries); \/\/ podzia\u0142 pliku tsv na wiersze\n\n\/\/ P\u0119tla id\u0105ca po wierszach, z kt\u00f3rych ka\u017cdy definiuje jedn\u0105 kolumn\u0119\nforeach(var row in tsvRows.Skip(1)) \/\/pomijamy pierwszy wiersz z nag\u0142\u00f3wkiem \n{\n    var tsvColumns = row.Split(&#039;\\t&#039;);     \/\/ okre\u015blamy, \u017ce znakiem rozdzielaj\u0105cym kolumny jest tabulator\n    var name = tsvColumns&#x5B;0];             \/\/ Kolumna nr 1 - Nazwa kolumny\n    var description = tsvColumns&#x5B;1];      \/\/ Kolumna nr 2 - Opis kolumny\n    var expression = tsvColumns&#x5B;2];       \/\/ Kolumna nr 3 - Definicja kolumny\n    var folder = tsvColumns&#x5B;3];           \/\/ Kolumna nr 4 - Folder, do kt\u00f3rego kolumna zostanie dodana\n\n    \/\/dodajemy kolumn\u0119 o okre\u015blonej nazwie do wybranej tabeli oraz dodajemy jej w\u0142a\u015bciwo\u015bci\n    var col = targetTable.AddCalculatedColumn(name); \n    col.Description = description;\n    col.Expression = expression;\n    col.DisplayFolder=folder;\n    \n    \/\/na podstawie dodanej kolumny tworzymy r\u00f3wniez miar\u0119, definiowan\u0105 jako sum\u0119 tej kolumny\n    var measure = targetTable.AddMeasure(col.Name+&quot;_sum&quot;,       \/\/ Nazwa nowej miary\n    &quot;SUM(&quot; + col.DaxObjectFullName + &quot;)&quot;                        \/\/ DAX expression\n    );\n    measure.DisplayFolder=&quot;Measures&quot;;\n}\n<\/pre><\/div>\n\n\n<p>Po uruchomieniu skryptu kolumny opisane w pliku tsv oraz bazuj\u0105ce na nich miary zosta\u0142y dodane do naszego modelu:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f2400fcf&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f2400fcf\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"295\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image17-1024x295.png\" alt=\"screen programu\" class=\"wp-image-34702\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image17-1024x295.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image17-300x87.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image17-768x221.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image17-1536x443.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image17.png 1706w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Zapisywanie zmian w pliku pbix<\/strong><\/h3>\n\n\n\n<p>Dop\u00f3ki nie zapiszemy zmian w Tabular Editor, dokonane przez nas zmiany nie b\u0119d\u0105 widoczne w programie Power BI Desktop i znikn\u0105 po zamkni\u0119ciu narz\u0119dzia. Wyra\u017cenia wymagaj\u0105ce przeliczenia modelu (kolumny kalkulowane, miary) oznaczone b\u0119d\u0105 jako wymagaj\u0105ce deplomentu\/walidacji:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f24016ad&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f24016ad\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"827\" height=\"463\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image18.png\" alt=\"screen programu\" class=\"wp-image-34704\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image18.png 827w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image18-300x168.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image18-768x430.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image18-555x312.png 555w\" sizes=\"(max-width: 827px) 100vw, 827px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>By zapisa\u0107 zmiany w po\u0142\u0105czonej bazie \u2013 w naszym przypadku w pliku pbix \u2013 wystarczy u\u017cy\u0107 opcji File -> Save:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f2401cae&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f2401cae\" class=\"wp-block-image size-full wp-lightbox-container\"><img decoding=\"async\" width=\"270\" height=\"323\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image19.png\" alt=\"screen programu\" class=\"wp-image-34706\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image19.png 270w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image19-251x300.png 251w\" sizes=\"(max-width: 270px) 100vw, 270px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Po zapisaniu wyra\u017cenia zostan\u0105 zwalidowane, a w przypadku b\u0142\u0119d\u00f3w, zostan\u0105 one oznaczone. Natomiast w pliku pbix otworzonym w PowerBI Desktop zobaczymy komunikat o konieczno\u015bci od\u015bwie\u017cenia (przeliczenia) modelu, w zwi\u0105zku z nowymi kolumnami, kt\u00f3re stworzyli\u015bmy w Tabular Editorze:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a8e5f2402283&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a8e5f2402283\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"263\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image20-1024x263.png\" alt=\"screen programu\" class=\"wp-image-34708\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image20-1024x263.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image20-300x77.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image20-768x197.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/image20.png 1136w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Powi\u0119ksz\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p>Po od\u015bwie\u017ceniu modelu kolumny staj\u0105 si\u0119 gotowe do u\u017cycia, a nowe nazwy, miary i inne zmiany obecne s\u0105 w pliku otwartym w Power BI Desktop.<\/p>\n\n\n\n<p>Pami\u0119taj, \u017ce po przeliczeniu zmiany nale\u017cy zapisa\u0107 r\u00f3wnie\u017c w pliku pbix w Power BI Desktop!<\/p>\n\n\n\n<p>Podobnie dzieje si\u0119, je\u015bli pracujemy na modelu SSAS otwartym np. z Power BI Workspace \u2013 po zapisaniu zmian w Tabular Editor staj\u0105 si\u0119 one widoczne w naszym modelu, ale cz\u0119\u015b\u0107 z nich mo\u017ce wymaga\u0107 r\u0119cznego przeliczenia (od\u015bwie\u017cenia), by sta\u0142y si\u0119 dost\u0119pne do u\u017cycia w raportach.<\/p>\n\n\n<div class=\"nsw-o-blogersii-banner\">\n            <picture>\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Data-Analytics-Desktop_.jpg\" media=\"(min-width: 992px)\" >\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Data-Analytics-Mob_.jpg\" media=\"(min-width: 300px)\" >            <img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Data-Analytics-Desktop_.jpg\" alt=\"\"  class=\"\"  >\n        <\/picture>\n        <div class=\"cnt\">\n                    <div class=\"nsw-m-title-block -h3 -invert  -has-title-margin-bottom-0 -has-title-font-weight-bold\">\n                                <h2 class=\"nsw-m-title-block__title\">Data &#038; Analytics<\/h2>\n                <\/div>\n                            <p class=\"has-nsw-p-4-font-size has-invert-color\">\n                Dzi\u0119ki naszym us\u0142ugom analizy i przetwarzania danych b\u0119dziesz podejmowa\u0107 trafne decyzje, zbudujesz skuteczne strategie i znajdziesz nowe \u017ar\u00f3d\u0142a przychod\u00f3w.\n            <\/p>\n                            <a  href=\"https:\/\/sii.pl\/oferta\/data-analytics\/\" class=\"nsw-a-button -ghost -banner-button\"   >\n        <span>Oferta Data&amp;Analytics<\/span>\n    <\/a>\n            <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Wykorzystanie Advanced Scripting w Tabular Editorze daje ogromne mo\u017cliwo\u015bci usprawnienia i zautomatyzowania pracy z modelami tabularycznymi. Powy\u017cszy artyku\u0142 prezentuje jedynie wycinek mo\u017cliwo\u015bci tego narz\u0119dzia, a mimo to pozwala zaoszcz\u0119dzi\u0107 wiele nudnych godzin na przeklejaniu i przepisywaniu kodu miar, kolumn, nazw, formatowania czy translacji.<\/p>\n\n\n\n<p>Niew\u0105tpliw\u0105 zalet\u0105 tego rozwi\u0105zania jest mo\u017cliwo\u015b\u0107 wykorzystania Tabular Editora do edycji modeli dost\u0119pnych wy\u0142\u0105cznie w Power BI Desktop. Sprawia to, \u017ce z usprawnie\u0144 skorzysta\u0107 mo\u017ce niemal ka\u017cdy u\u017cytkownik Power BI \u2013 nawet niemaj\u0105cy dost\u0119pu do \u015brodowiska Premium czy infrastruktury serwerowej.<\/p>\n\n\n\n<p>Automatyzacja pracy to nie tylko oszcz\u0119dno\u015b\u0107 czasu. To tak\u017ce ograniczenie wielu b\u0142\u0119d\u00f3w wynikaj\u0105cych z wykonywania manualnej, powtarzalnej pracy. Dzi\u0119ki temu mo\u017cemy po\u015bwi\u0119ci\u0107 wi\u0119cej uwagi zadaniom, kt\u00f3re wymagaj\u0105 naszej wiedzy i kreatywno\u015bci.<\/p>\n\n\n\n<p>Nie musimy przekleja\u0107 tego samego kodu po raz setny \u2013 mo\u017ce zrobi\u0107 to za nas skrypt, kt\u00f3ry wykona zadanie szybciej, dok\u0142adniej i bezb\u0142\u0119dnie. A dla nas oznacza to mniej frustracji i by\u0107 mo\u017ce znalezienie chwili na spokojn\u0105 kaw\u0119, zanim we\u017amiemy si\u0119 za kolejny model \ud83d\ude0a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przydatne linki<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.tabulareditor.com\/en\/features\/Useful-script-snippets.html\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >Useful script snippets | Tabular Editor Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/TabularEditor\/TabularEditor\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >GitHub &#8211; TabularEditor\/TabularEditor: This is the code repository and issue tracker for Tabular Editor 2.X (free, open-source version). This repository is being maintained by Daniel Otykier. \u00b7 GitHub<\/a><\/li>\n<\/ul>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;34669&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Automatyzacja pracy z SSAS, czyli jak nie zwariowa\u0107, klikaj\u0105c 500 razy to samo&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Je\u015bli kiedykolwiek tworzy\u0142e\u015b model w SSAS Tabular albo PowerBI Desktop i r\u0119cznie ustawia\u0142e\u015b formatowanie, poprawia\u0142e\u015b nazwy, dodawa\u0142e\u015b prawie identyczne miary, &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/automatyzacja-pracy-z-ssas-czyli-jak-nie-zwariowac-klikajac-500-razy-to-samo\/\">Continued<\/a><\/p>\n","protected":false},"author":818,"featured_media":34710,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[2794,1546,354,1032,481],"class_list":["post-34669","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-da","tag-przeglad-narzedzi","tag-automatyzacja","tag-case-study","tag-power-bi"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/Coding_woman_2.jpg","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/34669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=34669"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/34669\/revisions"}],"predecessor-version":[{"id":34717,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/34669\/revisions\/34717"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/34710"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=34669"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=34669"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=34669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}