Żeby móc opowiedzieć o języku M musimy rozpocząć od podstaw, czyli odpowiedzieć sobie na pytania gdzie język ten możemy znaleźć? Jak on jest wykorzystywany? Do czego jest podobny? I dlaczego warto go znać?
Z niniejszego artykułu dowiesz się w jakich produktach Microsoftu możesz wykorzystać język M. Zobaczysz kilka przykładów jego zastosowania, a także odkryjemy przed Tobą pierwsze kroki jakie należy postawić wchodząc w świat kodowania w języku M.
Programowanie w dowolnym języku jest obszernym zagadnieniem. Na łamach jednego artykułu nikt nie jest w stanie odkryć wszystkich tajemnic języka. Dlatego też, jeśli chcesz dowiedzieć się dużo więcej i przetestować rozwiązania w praktyce, koniecznie zapisz się na nasze szkolenia. Dzięki nim pisanie kodu stanie się łatwiejsze i przyjemniejsze!
Jeśli chcemy mówić o języku M warto rozpocząć od narzędzia jakim jest Power Query. W tym narzędziu możesz wykorzystać język M i prawdopodobnie z jego powodu trafiasz na ten artykuł😉. Tak naprawdę język „M” to nieformalna nazwa tego języka. Choć przyjęta przez użytkowników całego świata ochoczo, to pełna nazwa języka jaką podaje Microsoft to Power Query Formula Language.
Ta nazwa już wiele nam mówi. W największym skrócie język M jest językiem do tworzenia formuł w narzędziu Power Query. Wykorzystać go możemy w wielu produktach z rodziny Microsoftu, które zajmują się przetwarzaniem danych, np. Excel, Power BI, Analysis Services czy Dataverse. Język M rozpoznaje wielkość liter i swoją budową przypomina język programowania F#.
Power Query to narzędzie stworzone do pobierania danych z różnych źródeł i przekształcania ich. Celem jest, aby dane te tworzyły jednolitą, czytelną i dającą się łatwo analizować całość. Cały ten proces z angielskiego można potocznie nazwać „Mash-up”. To właśnie tutaj kryje się rozwiązanie zagadki dlaczego język M zaczyna się właśnie tą literą. 😉
Jeśli chcesz dowiedzieć się więcej na temat samego Power Query koniecznie sprawdź ten artykuł!
Używając Power Query zapewne przyzwyczajeni jesteśmy do klikania w przyciski – i bardzo dobrze, bo do tego właśnie służy ten program! Jednakże trzeba wiedzieć, że pod każdym kliknięciem kryje się kod. Znaczy to tyle, iż każda nasza czynność wykonana w programie jest automatycznie zapisywana w postaci kodu napisanego w języku M.
Bardziej zaawansowani użytkownicy na pewno wiedzą, że nie wszystko co chcielibyśmy zrobić da się „wyklikać”. Dodatkowo przy niektórych przekształceniach możemy się niemiło zdziwić, gdy okaże się, że program zarejestrował inne polecenie niż oczekiwaliśmy.
Dlatego też warto poznać podstawy języka M, bo dzięki prostym zmianom jesteśmy w stanie uzyskać duże efekty.
Skoro każde przekształcenie wykonane w Power Query jest zapisywane w postaci kodu to warto ten kod podejrzeć. Do tego będzie nam potrzebny pasek formuły. Aby go włączyć należy przejść na kartę Widok i w sekcji Układ zaznaczyć przycisk Pasek formuły. Od tej pory nad widokiem danych będziemy widzieli polecenia języka M odnoszące się do kroku, w którym aktualnie jesteśmy.
Dokonując nieznacznych modyfikacji kodu w pasku formuły jesteśmy w stanie bardzo często usprawnić działanie poleceń, które wykonuje Power Query.
Drugim miejscem, gdzie używamy języka M są kolumny niestandardowe. Jeśli zdarzyło Ci się kiedyś dodawać taką kolumnę do swoich danych to na pewno zwróciło twoją uwagę okno, w którym podaje się formułę oraz informacja na dole o błędach składniowych. Tutaj formuły tworzy się właśnie z wykorzystaniem języka M.
Ostatnim miejscem gdzie znajdziemy język M jest Edytor zaawansowany, w którym zapisane są wszystkie przekształcenia dokonywane na danych. To jest „serce” wszelkich operacji. W tym miejscu możemy dowolnie modyfikować każdy z zastosowanych kroków, tworzyć nowe, usuwać, zmieniać im nazwy itp. To właśnie ten kod obsługuje całe nasze zapytanie w Power Query – poniżej przykładowy wygląd okna:
Aby wyświetlić Edytora zaawansowanego należy przejść na kartę Widok i z sekcji Zaawansowane wybrać przycisk Edytor zaawansowany.
Żeby móc edytować czy pisać kod trzeba najpierw zrozumieć podstawy jakimi rządzi się dany język. W języku M praktycznie zawsze napotkamy na klauzulę let … in, która to pozwala nam rozbijać zapytania na kroki. Tak wygląda praktycznie każde zapytanie – przekształcenia, które wykonujemy składają się z kroków.
Po słowie let zawsze pojawia się nazwa kroku. Następnie znak równości i polecenie, które krok ma wykonać, a kończy się słowem in. Po słowie in najczęściej pojawia się nazwa ostatniego kroku. Wynika to z tego, że finalnym wynikiem całego zapytania będzie zawsze to co występuje po słowie in.
Upraszczając sprawę: po słowie let wpisujemy przekształcenia w języku M zwane „krokami”. Po słowie in wskazujemy nazwę kroku, który ma być ostatnim w zapytaniu. Przykład zapytania z jednym krokiem o nazwie Źródło, który wyświetla tekst Witaj! poniżej:
Istotną rzeczą, o której należy zawsze pamiętać jest to, że język M rozpoznaje wielkość liter, więc słowo Krok1 to nie jest to samo co krok1.
Nazwy kroków mogą być jednowyrazowe (bez odstępów), wtedy wystarczy podać nazwę i znak równości lub wielowyrazowe (z odstępami) natomiast wtedy taka nazwa musi być umieszczona w cudzysłowie i zostać poprzedzona hashem np. #”długa nazwa kroku”.
W zapytaniu języka M każdy krok należy oddzielać od poprzedniego przecinkiem, a także można w kodzie umieszczać komentarze – występują dwa rodzaje: jednolinijkowe i blokowe.
Komentarz jednolinijkowy może być wpisany przed albo za krokiem i rozpoczyna się dwoma ukośnikami //, komentarz wielolinijkowy (blokowy) natomiast rozpoczyna się ukośnikiem i gwiazdką /* oraz kończy się gwiazdką ukośnikiem */.
Przykład bardziej rozbudowanego zapytania poniżej zawierającego powyższe zasady:
Warto zauważyć, że polecenia w języku M nie muszą być wprowadzane w kolejności. Program automatycznie rozpoznaje kolejność wykonywania kroków na podstawie zależności pomiędzy nimi – na grafice krok trzeci wykorzystuje do połączenia z krokiem drugim nazwę, która pojawia się dopiero w kroku czwartym, mimo to, wszystko działa perfekcyjnie. 😊
O tym gdzie zastosować język M pisaliśmy trochę w rozdziale Wyświetlanie kodu, ale teraz przyszedł czas na pokazanie tego w praktyce.
Pierwszym przykładem będzie drobna zmiana w już istniejącym kodzie, który wygenerowany został automatycznie – wszystkie kroki były „wyklikane” w programie natomiast wynik jaki nam wychodzi to nieskończoność. Prawidłowy wynik to 560. W jednym z kroków kryje się błąd, została tam zastosowana niepoprawna funkcja. Drobna zmiana w pasku formuły sprawi, że wszystko wróci na swoje miejsce – wykorzystana jest tutaj funkcja Number.Sqrt, czyli funkcja obliczająca pierwiastek kwadratowy z liczby.
Innym zastosowaniem języka M w praktyce jest tworzenie własnych funkcji. W Power Query mamy znaną z Excela funkcję TRIM, która służy do przycinania wyrazów pozbywając się zbędnych spacji, aczkolwiek w PQ usuwane są tylko spacje początkowe i końcowe. Jeśli chcielibyśmy używać tej funkcji dokładnie tak jak w Excelu, czyli z jednoczesnym usunięciem wewnętrznych, nadmiarowych spacji to… nie da się 😉, chyba że napiszemy funkcję niestandardową. Można to wykonać w trzech krokach.
Najpierw należy na samym początku zadeklarować funkcję wpisując nawiasy okrągłe, wewnątrz nich argumenty funkcji i na koniec operator wynikania, który składa się ze znaków =>.
Krokiem pierwszym naszej funkcji będzie rozbicie całego tekstu po spacjach, tak aby stworzyła się lista pojedynczych wyrazów – wykorzystamy funkcję Text.Split(). Warto tu zwrócić uwagę na to, że po każdym wystąpieniu spacji następuje podział, więc jeśli mamy sytuację, gdzie występują 3 spacje jedna po drugiej to pomiędzy tymi spacjami też występuje podział, ale skoro pomiędzy nimi nie było nic, to taką „pustą wartość” dostaniemy również w wyniku jako jedną z pozycji listy.
Drugim krokiem będzie pozbycie się z listy pustych elementów „”, które nam się stworzyły – wykorzystamy funkcję List.RemoveItems().
Ostatni krok to połączenie tekstów, które pozostały w jeden, z separatorem będącym pojedynczą spacją – wykorzystamy funkcję Text.Combine().
Finalne rozwiązanie wygląda tak:
Kod naszego zapytania poniżej:
Zagadnienia przedstawione w artykule pobieżnie omawiają temat jakim jest język M. Mamy natomiast nadzieję, że nawet ta chwilowa styczność z nim pokazała Ci jak duży potencjał drzemie w tym języku.
Dzięki znajomości podstaw języka możesz w stosunkowo prosty sposób usprawniać swoje codzienne przekształcenia. Z czasem zaczniesz konstruować swoje funkcje, aby finalnie pisać całe zapytania opierając się wyłącznie na własnej znajomości języka M.
Po więcej informacji na temat programów z rodziny Power czy różnych języków programowania zapraszamy na jedno z naszych szkoleń. Dzięki nim nie tylko dowiesz się więcej, ale również przetestujesz wszystkie rozwiązania w praktyce!