{"id":1401,"date":"2019-02-01T09:22:06","date_gmt":"2019-02-01T08:22:06","guid":{"rendered":"https:\/\/d365bc.info.pl\/?p=1401"},"modified":"2019-02-01T11:53:10","modified_gmt":"2019-02-01T10:53:10","slug":"od-zera-do-extension-cz-5-pierwsze-extension","status":"publish","type":"post","link":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/","title":{"rendered":"Od zera do extension &#8211; cz. 5 Pierwsze Extension"},"content":{"rendered":"\n<p>Dzisiaj poka\u017ce Ci, ju\u017c ostatni krok na drodze do Twojego pierwszego Extension. Po ma\u0142ym teoretycznym wst\u0119pie odpalimy Visual Studio Code i utworzymy pierwszy mikro dodatek do systemu Dynamics 365 Business Central.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">Czym tak w\u0142a\u015bciwie s\u0105 Extensions?<\/h3>\n\n\n\n<p>Extensions (czyli rozszerzenia) to nowe podej\u015bcie do programowania w Business Central (wcze\u015bniej NAV). Ju\u017c jaki\u015b czas temu Microsoft zaprezentowa\u0142 Extensions 1.0 &#8211; niestety nie by\u0142o to udane podej\u015bcie do tematu, a ca\u0142a technologia wykorzystana w wersji 1.0 odesz\u0142a do lamusa zanim na dobre si\u0119 pojawi\u0142a. Niemniej na dzie\u0144 dzisiejszy mamy do czynienia z Extensions 2.0 &#8211; czym\u015b zgo\u0142a innym. Niestety nie spos\u00f3b by\u0142o wprowadzi\u0107 nowej koncepcji programowania ograniczaj\u0105c si\u0119 tylko do zmian kosmetycznych. Dlatego dzisiaj mamy nowy j\u0119zyk, \u015brodowisko programowania, ale tak\u017ce ca\u0142kowicie nowe podej\u015bcie do dostosowywania sytemu. G\u0142\u00f3wn\u0105 koncepcj\u0105 jest rezygnacja z modyfikacji kodu standardowego. S\u0142ysz\u0105c te herezje po raz pierwszy ka\u017cdy \u0142apie si\u0119 za g\u0142ow\u0119 (b\u0119dzie jeszcze jeden szok w dalszej cz\u0119\u015bci wpisu). Niemniej aby program uczyni\u0107 \u0142atwym w zarz\u0105dzaniu, aktualizacjach, a przede wszystkim dostosowa\u0107 go do pracy w modelu wynajmu oprogramowania, podj\u0119cie takich krok\u00f3w by\u0142o niezb\u0119dne. <\/p>\n\n\n\n<p>Idea jest prosta, klient dostaje bazowy system i za po\u015brednictwem &#8220;sklepu&#8221; mo\u017ce rozszerza\u0107 go o dodatki tworzone przez partner\u00f3w. Dodatkowo system ten jest zawsze aktualny, bo w jego aktualizacji nie przeszkadzaj\u0105 zmiany dokonywane w kodzie standardowym.  <\/p>\n\n\n\n<p>Oczywi\u015bcie mo\u017cliwo\u015b\u0107 modyfikacji kodu sytemu pozostanie (w wersji OnPremis) &#8211; pytanie tylko na jak d\u0142ugo? I czy faktycznie warto z tej opcji dalej korzysta\u0107?<br \/><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zdarzenia<\/h3>\n\n\n\n<p>Teraz pewnie zastanawiasz si\u0119 jak mam co\u015b napisa\u0107, skoro nie mog\u0119 zmienia\u0107 obiekt\u00f3w standardowych? Jak chocia\u017cby doda\u0107 nowe pole do zaksi\u0119gowanej faktury sprzeda\u017cy, kt\u00f3re b\u0119dzie wylicza\u0142o si\u0119 podczas jej ksi\u0119gowania?! No c\u00f3\u017c &#8211; \u017caden problem. Od niedawna mamy w systemie co\u015b takiego jak zdarzenia &#8211; odpowiednik tych znanych z wielu j\u0119zyk\u00f3w programowania. Je\u017celi chcesz oprogramowa\u0107 proces ksi\u0119gowania faktury wystarczy, \u017ce skorzystasz z jednego z wielu dost\u0119pnych zdarze\u0144. Przyk\u0142adowo mo\u017cesz stworzy\u0107 w\u0142asn\u0105 funkcj\u0119 podpinaj\u0105c j\u0105 pod zdarzenie OnAfterPostSalesDoc() z Codeunitu 80-tego. Teraz naprawd\u0119 nie ma potrzeby modyfikowa\u0107 do tego celu Codeunitu 80 \ud83d\ude42<\/p>\n\n\n\n<p><em>Tutaj jednak ma\u0142a uwaga &#8211; na chwil\u0119 obecn\u0105 mo\u017cemy wiele rzeczy do systemu doda\u0107 &#8211; rozszerzy\u0107 standardowe funkcje &#8211; niemniej modyfikacja standardu nie jest ju\u017c taka prosta a czasami wr\u0119cz niemo\u017cliwa.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">J\u0119zyk AL w telegraficznym skr\u00f3cie<\/h3>\n\n\n\n<p>Tutaj przyszed\u0142 czas na kolejne zaskoczenie. Je\u017celi jeste\u015b programist\u0105 to zapewne kojarzysz obiekty w plikach tekstowych? Sp\u00f3jrz teraz na por\u00f3wnanie obiektu w pliku TXT i pliku \u017ar\u00f3d\u0142owym AL:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1488\" height=\"978\" data-attachment-id=\"1409\" data-permalink=\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/txt-vs-al\/\" data-orig-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/txt-vs-al.png?fit=1488%2C978&amp;ssl=1\" data-orig-size=\"1488,978\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"txt vs al\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/txt-vs-al.png?fit=300%2C197&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/txt-vs-al.png?fit=1024%2C673&amp;ssl=1\" src=\"https:\/\/i1.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/txt-vs-al.png?fit=1024%2C673&amp;ssl=1\" alt=\"\" class=\"wp-image-1409\" srcset=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/txt-vs-al.png?w=1488&amp;ssl=1 1488w, https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/txt-vs-al.png?resize=300%2C197&amp;ssl=1 300w, https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/txt-vs-al.png?resize=768%2C505&amp;ssl=1 768w, https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/txt-vs-al.png?resize=1024%2C673&amp;ssl=1 1024w\" sizes=\"(max-width: 1110px) 100vw, 1110px\" \/><\/figure>\n\n\n\n<p>Ale spokojnie &#8211; to faktycznie wygl\u0105da podobnie i faktem jest, \u017ce teraz b\u0119dziemy pisali obiekty w postaci tekstowej. Niemniej twoje pierwsze wra\u017cenie, \u017ce jest to krok wstecz jest b\u0142\u0119dne. Przekonasz si\u0119 o tym jak tylko zaczniesz korzysta\u0107 z nowego j\u0119zyka.<\/p>\n\n\n\n<p>Kilka fakt\u00f3w o j\u0119zyku AL:<\/p>\n\n\n\n<ul><li>Sk\u0142adnia jest w\u0142a\u015bciwie taka sama jak j\u0119zyka C\/AL<\/li><li>Typy .NET s\u0105 niedozwolone w j\u0119zyku AL (poza rozwi\u0105zaniami On-Premis, zamiast tego sprawd\u017a:  <a style=\"\" href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-restapi-overview\">HTTP, JSON, TextBuilder, i XML API Overview<\/a>)<\/li><li>Mo\u017cemy tworzy\u0107 nast\u0119puj\u0105ce typy obiekt\u00f3w: <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-table-object\">Table<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-table-ext-object\">Table Extension<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-page-object\">Page<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-page-ext-object\">Page Extension<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-page-customization-object\">Page Customization<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-report-object\">Report<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-profile-object\">Profile<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-codeunit-object\">Codeunit<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-query-object\">Query<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-xmlport-object\">XML Port<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-control-addin-object\">Control Add-In<\/a>, <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-extensible-enums\">Enum<\/a><\/li><li>Nie ma obiekt\u00f3w typu MenuSuite<\/li><\/ul>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><em>Warto po\u015bwi\u0119ci\u0107 troch\u0119 czasu i przeczyta\u0107 materia\u0142y na stronie <\/em><a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-dev-overview\"><em>Microsoft dotycz\u0105ce programowania w j\u0119zyku AL<\/em><\/a><em>. Jest tam wszystko czego nie dam rady opisa\u0107.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Jak zacz\u0105\u0107 ?<\/h3>\n\n\n\n<p>Zr\u00f3bmy pierwsze Extension 2.0 na podstawie prostego przyk\u0142adu. Cel jest prosty: <\/p>\n\n\n\n<ul><li>stworzy\u0107 now\u0105 tabel\u0119 w kt\u00f3rej przechowywane b\u0119d\u0105 wszystkie zmiany limitu kredytowego nabywcy<\/li><li>po zmianie limitu kredytowego dla nabywcy zmiana zostanie zapisana w nowej tabeli<\/li><li>na kartotece klienta wy\u015bwietlona b\u0119dzie ilo\u015b\u0107 zmian zapisanych w naszej tabeli<\/li><\/ul>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><em>Przed rozpocz\u0119ciem upewnij si\u0119, \u017ce masz poprawnie zainstalowane <a href=\"https:\/\/d365bc.info.pl\/od-zera-do-extension-cz1-visual-studio-code\/\">VS Sutdio Code<\/a>, oraz tw\u00f3j <a href=\"https:\/\/d365bc.info.pl\/od-zera-do-extension-cz-4-business-central-sandbox\/\">kontener z systemem Business Central<\/a> dzia\u0142a. <\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Instalacja dodatku AL do Visual Studio Code<\/h4>\n\n\n\n<p>Aby m\u00f3c programowa\u0107 w j\u0119zyku AL, trzeba zainstalowa\u0107 wersj\u0119 dodatku do Visual Studio Code zgodn\u0105 z wersj\u0105 systemu Business Central, na kt\u00f3rej mamy zamiar programowa\u0107. Je\u017celi chodzi o kontenery to dodatek znajdziesz zawsze uruchamiaj\u0105c stron\u0119 hostowan\u0105 na twoim kontenerze. W naszym przypadku b\u0119dzie to <a href=\"http:\/\/businesscentral:8080\/\">http:\/\/businesscentral:8080\/ <\/a>(http:\/\/[nazwa_kontenera]:8080). <\/p>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><em>Je\u017celi korzystasz z wersji zainstalowanej standardowo to musisz pami\u0119ta\u0107 o doinstalowaniu sk\u0142adnika &#8220;Modern Development&#8230;&#8221;. Po jego zainstalowanie plik z rozszerzeniem znajdziesz np. w katalogu: C:\\Program Files (x86)\\Microsoft Dynamics NAV\\130\\Modern Development Environment\\ALLanguage.vsix<\/em><br \/><\/p>\n\n\n\n<p>Je\u017celi masz ju\u017c odpowiedni plik (*.vsix) to aby go zainstalowa\u0107 uruchom Visual Studio Code, a nast\u0119pnie palet\u0119 komend (Shift+Ctrl+P) i wpisz polecenie: &#8220;Extensions: Install from VSIX&#8230;&#8221;, nast\u0119pnie wybierz plik z rozszerzeniem. Po prze\u0142adowaniu VS Code b\u0119dzie gotowe do pracy.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1022\" height=\"767\" data-attachment-id=\"1413\" data-permalink=\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/install-al-language-extension-vs-code-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/install-al-language-extension-vs-code-1.gif?fit=1022%2C767&amp;ssl=1\" data-orig-size=\"1022,767\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"install al language extension vs code\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/install-al-language-extension-vs-code-1.gif?fit=300%2C225&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/install-al-language-extension-vs-code-1.gif?fit=1022%2C767&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/install-al-language-extension-vs-code-1.gif?resize=1022%2C767&#038;ssl=1\" alt=\"\" class=\"wp-image-1413\" data-recalc-dims=\"1\"\/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Tworzymy projekt<\/h4>\n\n\n\n<p>Skoro dodatek masz ju\u017c zainstalowany. Utw\u00f3rz pierwszy projekt:<\/p>\n\n\n\n<ul><li>W Visual Studio Code uruchom komend\u0119: AL:GO<\/li><li>Wybierz katalog w kt\u00f3rym ma zosta\u0107 utworzony projekt<\/li><li>Wybierz opcj\u0119 ze \u015brodowiskiem lokalnym<\/li><li>Po utworzeniu projektu otworzy si\u0119 plik konfiguracyjny w kt\u00f3rym trzeba poda\u0107 aktualne dane lokalnego serwera Business Central &#8211; w naszym przypadku powinno by\u0107 wymagana tylko zmiana nazwy instancji na &#8220;businessventral&#8221;. Tak zmodyfikowany plik nale\u017cy zapisa\u0107<\/li><li>Nast\u0119pnym krokiem jest pobranie symboli z naszego serwera, w tym celu uruchom komend\u0119 &#8220;AL:Download Symbols&#8221;. Symbole to nic innego jak definicja obiekt\u00f3w zapisanych w bazie danych (table, codunity, etc.)<\/li><li>Podaj nazw\u0119 u\u017cytkownika i has\u0142o (to samo jakim logujesz si\u0119 do Business Central)<\/li><li>Po pobraniu symboli projekt jest gotowy do uruchomienia<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-attachment-id=\"1420\" data-permalink=\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/al-create-first-project\/\" data-orig-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/AL-Create-First-Project.gif?fit=1024%2C768&amp;ssl=1\" data-orig-size=\"1024,768\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"AL Create First Project\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/AL-Create-First-Project.gif?fit=300%2C225&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/AL-Create-First-Project.gif?fit=1024%2C768&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/AL-Create-First-Project.gif?fit=1024%2C768&amp;ssl=1\" alt=\"\" class=\"wp-image-1420\"\/><\/figure>\n\n\n\n<p><strong>Pliki konfiguracyjne<\/strong><\/p>\n\n\n\n<p>W utworzonym projekcie znajduj\u0105 si\u0119 dwa pliki konfiguracyjne:<\/p>\n\n\n\n<ul><li><em>launch.json<\/em> &#8211; to tutaj znajduj\u0105 si\u0119 parametry do uruchomienia skompilowanego rozszerzenia (nazwa serwera, itp.)<\/li><li><em>app.json<\/em> &#8211; tutaj za\u015b s\u0105 dane naszego rozszerzenia (nazwa naszego extension itp)<\/li><\/ul>\n\n\n\n<p>Nie chc\u0119 tutaj zag\u0142\u0119bia\u0107 si\u0119 w opis tych plik\u00f3w, zapoznaj si\u0119 z nim u \u017ar\u00f3d\u0142a: <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-json-files\">https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-json-files<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Snippets<\/strong><\/h4>\n\n\n\n<p>Zanim zaczniemy tworzy\u0107 obiekty chcia\u0142bym Ci tylko powiedzie\u0107, \u017ce nale\u017cy korzysta\u0107 z przygotowanych snippets\u00f3w. Je\u017celi nie wiesz co to takiego to cofnij si\u0119 do wpisu o <a href=\"https:\/\/d365bc.info.pl\/od-zera-do-extension-cz1-visual-studio-code\/\">Visual Studio Code<\/a>. Wszystkie snippetsy przygotowane dla j\u0119zyka AL rozpoczynaj\u0105 si\u0119 od przedrostka &#8220;t&#8221;, czyli aby utworzy\u0107 tabel\u0119 nale\u017cy zacz\u0105\u0107 po prostu pisa\u0107 &#8220;ttable&#8221;, a nast\u0119pnie za pomoc\u0105 tabulatora przechodzi\u0107 do kolejnych p\u00f3l.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Tworzymy now\u0105 tabel\u0119<\/h4>\n\n\n\n<p>Czas zacz\u0105\u0107 tworzy\u0107 nasze pierwsze extension o zbudowania pierwszej tabeli. A jak to zrobi\u0107? Najlepiej w praktyce. Stw\u00f3rz i zapisz plik o nazwie: &#8220;Tab50100.Credit Limit History.al&#8221;. B\u0119dzie to nasza tabela przechowuj\u0105ca histori\u0119 zmian limitu kredytowego nabywcy.<\/p>\n\n\n\n<p>W stworzonym pliku korzystaj\u0105c ze snippets\u00f3w (<strong>ttable, tfield<\/strong>..) stw\u00f3rz struktur\u0119 nowej tabeli:<\/p>\n\n\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/><\/div><\/td><td><div class=\"text codecolorer\">table 50100 &quot;Credit Limit Hist.&quot;<br \/>\n{<br \/>\n&nbsp; &nbsp; DataClassification = ToBeClassified;<br \/>\n&nbsp; &nbsp; LookupPageId = &quot;Credit Limit History&quot;; #stron\u0119 stworzymy w nast\u0119pnym kroku<br \/>\n&nbsp; &nbsp; DrillDownPageId = &quot;Credit Limit History&quot;;<br \/>\n<br \/>\n&nbsp; &nbsp; fields<br \/>\n&nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; field(1; &quot;Customer No.&quot;; Code[20])<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TableRelation = Customer.&quot;No.&quot;;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; field(2; &quot;Modification date time&quot;; Datetime)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; field(3; &quot;Credit Limit Amout&quot;; Decimal)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; field(4; &quot;User ID&quot;; Text[50])<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TableRelation = User.&quot;User Name&quot;;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; keys<br \/>\n&nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; key(PK; &quot;Customer No.&quot;, &quot;Modification date time&quot;)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Clustered = true;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; }<br \/>\n}<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Tworzenie tabeli z u\u017cyciem snippets\u00f3w wygl\u0105da mniej wi\u0119cej tak:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1035\" height=\"783\" data-attachment-id=\"1437\" data-permalink=\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/create-new-table-in-al-language-business-central\/\" data-orig-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/create-new-table-in-al-language-business-central.gif?fit=1035%2C783&amp;ssl=1\" data-orig-size=\"1035,783\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"create new table in al language &#8211; business central\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/create-new-table-in-al-language-business-central.gif?fit=300%2C227&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/create-new-table-in-al-language-business-central.gif?fit=1024%2C775&amp;ssl=1\" src=\"https:\/\/i1.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/create-new-table-in-al-language-business-central.gif?fit=1024%2C775&amp;ssl=1\" alt=\"\" class=\"wp-image-1437\"\/><figcaption>(jak nagrywa\u0142em to nie zauwa\u017cy\u0142em przypadkowej zmiany w\u0142a\u015bciwo\u015bci DataClasification &#8211; powinna zosta\u0107 standardowa)<\/figcaption><\/figure>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><em>Jak widzisz tabela wygl\u0105da prawie tak samo jakby\u015b wyeksportowa\u0142 j\u0105 do tekstu prosto z Development Environment.<\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Tworzymy nowy page<\/h4>\n\n\n\n<p>Aby mo\u017cna by\u0142o wy\u015bwietli\u0107 zawarto\u015b\u0107 nowej tabeli potrzebny b\u0119dzie page typu lista. Nowy page zapiszmy w pliku o nazwie: &#8220;Pag50100.Credit Limit History.al&#8221;. Nowy plik mo\u017cna stworzy\u0107 przy pomocy snippetsu <strong>tpage<\/strong>. Struktura nowego pliku powinna wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/p>\n\n\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/><\/div><\/td><td><div class=\"text codecolorer\">page 50100 &quot;Credit Limit History&quot;<br \/>\n{<br \/>\n&nbsp; &nbsp; PageType = List;<br \/>\n&nbsp; &nbsp; SourceTable = &quot;Credit Limit Hist.&quot;;<br \/>\n<br \/>\n&nbsp; &nbsp; layout<br \/>\n&nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; area(content)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; repeater(Group)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; field(&quot;Modification date time&quot;;&quot;Modification date time&quot;)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; field(&quot;Credit Limit Amout&quot;;&quot;Credit Limit Amout&quot;)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; field(&quot;User ID&quot;;&quot;User ID&quot;)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; area(factboxes)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; }<br \/>\n<br \/>\n&nbsp; &nbsp; actions<br \/>\n&nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; area(processing)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; }<br \/>\n}<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\">Specjalnie pozostawi\u0142em sekcje area(factboxes) i actions &#8211; aby by\u0142o wida\u0107 jak stworzy\u0107 podstawowe elementy strony.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Dodanie pola do tabeli Customer<\/h4>\n\n\n\n<p>Chcia\u0142bym Ci tak\u017ce zademonstrowa\u0107 jak rozszerza\u0107 istniej\u0105ce tabele, w tym celu do tabeli nabywcy dodamy pole zliczaj\u0105ce ilo\u015b\u0107 zapisanych zmian limitu kredytowego.<\/p>\n\n\n\n<p>Aby doda\u0107 pole do istniej\u0105cej tabeli nale\u017cy stworzy\u0107 obiekt typu Table Extension. Utw\u00f3rz i zapisz nowy plik Tab18-Ext.Customer.al<\/p>\n\n\n\n<p>Nast\u0119pnie utw\u00f3rz wst\u0119pn\u0105 struktur\u0119 zacznaj\u0105c od wpisania snipeetsu <strong>ttableext<\/strong> i korzystaj\u0105c z tabulatora uzupe\u0142nij wszystkie elementy tak aby struktura wygl\u0105da\u0142a nast\u0119puj\u0105co:<\/p>\n\n\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/><\/div><\/td><td><div class=\"text codecolorer\">tableextension 50100 CustomerExt extends Customer<br \/>\n{<br \/>\n&nbsp; &nbsp; fields<br \/>\n&nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; field(50100;&quot;Credit Limit History Changes&quot;;Integer)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FieldClass=FlowField;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CalcFormula=count(&quot;Credit Limit Hist.&quot; where(&quot;Customer No.&quot;=field(&quot;No.&quot;)));<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; } &nbsp; &nbsp;<br \/>\n}<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Dodanie nowego pola do kartoteki nabywcy<\/h4>\n\n\n\n<p>Aby zobaczy\u0107 w systemie nowo dodane pole nale\u017cy je doda\u0107 (poza tabel\u0105) do strony &#8220;Customer Page&#8221;. W tym celu utw\u00f3rz obiekt Page Extension o nazwie: Pag21-Ext.Customer Card.al. I korzystaj\u0105c ze snippetu tpageext utw\u00f3rz nast\u0119puj\u0105cy plik:<\/p>\n\n\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/><\/div><\/td><td><div class=\"text codecolorer\">pageextension 50100 CustomerCardExt extends &quot;Customer Card&quot;<br \/>\n{<br \/>\n&nbsp; &nbsp; layout<br \/>\n&nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; addafter(&quot;Credit Limit (LCY)&quot;)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; field(&quot;Credit Limit History Changes&quot;;&quot;Credit Limit History Changes&quot;)<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; }<br \/>\n&nbsp; &nbsp; }<br \/>\n}<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><em>Tutaj wida\u0107 elementy do\u015b\u0107 ciekawe jak np. addafter &#8211; czyli dodaj po polu. Zach\u0119cam do zajrzenia w dokumentacj\u0119 wszystkich typ\u00f3w obiekt\u00f3w aby przekona\u0107 si\u0119 o dost\u0119pnych mo\u017cliwo\u015bciach. <\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Nowy Codeunit<\/h4>\n\n\n\n<p>Teraz trzeba stworzy\u0107 Codeunit, kt\u00f3ry wykryje zdarzenie walidacji pola limitu kredytowego na kartotece nabywcy i zapisze t\u0105 zmian\u0119 w naszej tabeli. Tak\u017ce do dzie\u0142a &#8211; stw\u00f3rz i zapisz plik &#8220;Cod50100.Credit Limit History Mgt.al&#8221;. Nast\u0119pnie nadaj mu tre\u015b\u0107 mniej wi\u0119cej tak\u0105 jak poni\u017cej:<\/p>\n\n\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/><\/div><\/td><td><div class=\"text codecolorer\">codeunit 50100 &quot;Credit Limit History Mgt&quot;<br \/>\n{<br \/>\n&nbsp; &nbsp; trigger OnRun();<br \/>\n&nbsp; &nbsp; begin<br \/>\n&nbsp; &nbsp; end;<br \/>\n<br \/>\n&nbsp; &nbsp; [EventSubscriber(ObjectType::Table, Database::Customer, 'OnAfterValidateEvent', 'Credit Limit (LCY)', true,true)]<br \/>\n&nbsp; &nbsp; procedure onValidateCustCreditLimit(Rec:Record Customer;xRec:Record Customer;CurrFieldNo:Integer)<br \/>\n&nbsp; &nbsp; var<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; CustLimitHist:Record &quot;Credit Limit Hist.&quot;;<br \/>\n&nbsp; &nbsp; begin<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; CustLimitHist.Init();<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; CustLimitHist.&quot;Customer No.&quot; := Rec.&quot;No.&quot;;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; CustLimitHist.&quot;Modification date time&quot; := CurrentDateTime();<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; CustLimitHist.&quot;Credit Limit Amout&quot; := Rec.&quot;Credit Limit (LCY)&quot;;<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; CustLimitHist.&quot;User ID&quot; := UserId();<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; CustLimitHist.Insert(); &nbsp; &nbsp;<br \/>\n&nbsp; &nbsp; end;<br \/>\n}<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><em>Jak wida\u0107 stworzona funkcja jest typu EventSubscriber &#8211; podpi\u0119ty do zdarzenia &#8220;Credit Limit (LCY)&#8221;.onValidate() wywo\u0142ywanego na tabli Customer. Oznacza to, ze nasza funkcja wywo\u0142a si\u0119 po walidacji tego\u017c pola. Wi\u0119cej o zdarzeniach mo\u017cesz przeczyta\u0107 np. <\/em><a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics-nav\/introducing-events\"><em>tutaj<\/em><\/a><em>.<\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Uruchomienie extension<\/h4>\n\n\n\n<p>Aby uruchomi\u0107 extension wystarczy nacisn\u0105\u0107 przycisk F5 &#8211; oczywi\u015bcie je\u017celi dobrze skonfigurowa\u0142e\u015b(a\u015b) plik <strong>launch.json<\/strong>. Po kompilacji powinno otworzy\u0107 si\u0119 okno przegl\u0105darki z systemem Business Central. Po otwarciu kartoteki nabywcy mo\u017cna przetestowa\u0107 to co stworzyli\u015bmy:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1035\" height=\"783\" data-attachment-id=\"1441\" data-permalink=\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/run-extension-in-business-central\/\" data-orig-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/run-extension-in-business-central.gif?fit=1035%2C783&amp;ssl=1\" data-orig-size=\"1035,783\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"run extension in business central\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/run-extension-in-business-central.gif?fit=300%2C227&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/run-extension-in-business-central.gif?fit=1024%2C775&amp;ssl=1\" src=\"https:\/\/i2.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/run-extension-in-business-central.gif?fit=1024%2C775&amp;ssl=1\" alt=\"\" class=\"wp-image-1441\"\/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Debugger<\/h4>\n\n\n\n<p>Oczywi\u015bcie mamy tak\u017ce mo\u017cliwo\u015b\u0107 debuggowania kodu. Wystarczy przed uruchomieniem utworzy\u0107 breakpoint:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1035\" height=\"783\" data-attachment-id=\"1444\" data-permalink=\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/visual-studio-code-debugger\/\" data-orig-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/visual-studio-code-debugger.gif?fit=1035%2C783&amp;ssl=1\" data-orig-size=\"1035,783\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"visual studio code debugger\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/visual-studio-code-debugger.gif?fit=300%2C227&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/visual-studio-code-debugger.gif?fit=1024%2C775&amp;ssl=1\" src=\"https:\/\/i1.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/visual-studio-code-debugger.gif?fit=1024%2C775&amp;ssl=1\" alt=\"\" class=\"wp-image-1444\"\/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">TXT2AL<\/h4>\n\n\n\n<p>Warto w tym miejscu wspomnie\u0107 tak\u017ce o narz\u0119dziu dost\u0119pnym z poziomu wiersza polece\u0144. Pozwala ono na konwertowanie obiekt\u00f3w wyeksportowanych w formacie .txt do nowego formatu .al. Narz\u0119dzie znajdziecie w katalogu: C:\\Program Files (x86)\\Microsoft Dynamics NAV\\130\\RoleTailored Client\\Txt2Al.exe. Korzystanie z niego jest banalnie proste wystarczy poda\u0107 dwa parametry: <br \/>txt2al.exe &#8211;source &#8220;c:\\txt\\&#8221; &#8211;target &#8220;c:\\al\\&#8221;.<\/p>\n\n\n\n<p>Wi\u0119cej informacji na stronie: <a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-txt2al-tool\">https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-txt2al-tool<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Podsumowanie<\/h3>\n\n\n\n<p>To tyle je\u017celi chodzi o pierwsze extension. Wpis i tak jest ju\u017c d\u0142ugi dlatego pomin\u0105\u0142em chocia\u017cby temat raport\u00f3w. Niemniej je\u017celi b\u0119dzie zainteresowanie tym tematem ch\u0119tnie stworz\u0119 kilka kolejnych wpis\u00f3w.<\/p>\n\n\n\n<p>Na koniec archiwum z kodem \u017ar\u00f3d\u0142owym do pobrania <a href=\"https:\/\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/Credit-Limit.zip\">tutaj<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do poczytania<\/h3>\n\n\n\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-dev-overview\">https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-dev-overview<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-extension-advanced-example\">https:\/\/docs.microsoft.com\/en-us\/dynamics365\/business-central\/dev-itpro\/developer\/devenv-extension-advanced-example<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/d365bc.info.pl\/od-zera-do-extension-cz1-visual-studio-code\/\">Od zera do Extension &#8211; cz.1 Visual Studio Code<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/d365bc.info.pl\/od-zera-do-extansion-cz-2-powershell\/\">Od zera do Extension &#8211; cz2. PowerShell<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/d365bc.info.pl\/od-zera-do-extension-cz-3-docker\/\">Od zera do Extension &#8211; cz3. Docker<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/d365bc.info.pl\/od-zera-do-extension-cz-4-business-central-sandbox\/\">Od zera do Extension &#8211; cz4. Business Central Sandbox<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj poka\u017ce Ci, ju\u017c ostatni krok na drodze do Twojego pierwszego Extension. Po ma\u0142ym teoretycznym wst\u0119pie odpalimy Visual Studio Code i utworzymy pierwszy mikro dodatek do systemu Dynamics 365 Business Central.<\/p>\n","protected":false},"author":1,"featured_media":1402,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false,"jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[127,128,13],"tags":[149,133,146,129,123,138,151,143,144,145],"jetpack_publicize_connections":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Od zera do extension - cz. 5 Pierwsze Extension - Blog o Microsoft Dynamics 365 Business Central<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:locale:alternate\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Od zera do extension - cz. 5 Pierwsze Extension - Blog o Microsoft Dynamics 365 Business Central\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj poka\u017ce Ci, ju\u017c ostatni krok na drodze do Twojego pierwszego Extension. Po ma\u0142ym teoretycznym wst\u0119pie odpalimy Visual Studio Code i utworzymy pierwszy mikro dodatek do systemu Dynamics 365 Business Central.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog o Microsoft Dynamics 365 Business Central\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-01T08:22:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-02-01T10:53:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/odzera_5.png?fit=1895%2C926&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1895\" \/>\n\t<meta property=\"og:image:height\" content=\"926\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"rafal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rbabaczyk\" \/>\n<meta name=\"twitter:site\" content=\"@rbabaczyk\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"rafal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/\",\"url\":\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/\",\"name\":\"Od zera do extension - cz. 5 Pierwsze Extension - Blog o Microsoft Dynamics 365 Business Central\",\"isPartOf\":{\"@id\":\"https:\/\/d365bc.info.pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/odzera_5.png?fit=1895%2C926&ssl=1\",\"datePublished\":\"2019-02-01T08:22:06+00:00\",\"dateModified\":\"2019-02-01T10:53:10+00:00\",\"author\":{\"@id\":\"https:\/\/d365bc.info.pl\/#\/schema\/person\/f5cb8e045a4a97815cd6e40491adefad\"},\"breadcrumb\":{\"@id\":\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/odzera_5.png?fit=1895%2C926&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/odzera_5.png?fit=1895%2C926&ssl=1\",\"width\":1895,\"height\":926},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/d365bc.info.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Od zera do extension &#8211; cz. 5 Pierwsze Extension\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/d365bc.info.pl\/#website\",\"url\":\"https:\/\/d365bc.info.pl\/\",\"name\":\"Blog o Microsoft Dynamics 365 Business Central\",\"description\":\"Polski blog o Microsoft Dynamics 365 Business Central (dawniej Dynamics NAV)\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/d365bc.info.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/d365bc.info.pl\/#\/schema\/person\/f5cb8e045a4a97815cd6e40491adefad\",\"name\":\"rafal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/d365bc.info.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/76728b0891ff455b2cb63205ba51106e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/76728b0891ff455b2cb63205ba51106e?s=96&d=mm&r=g\",\"caption\":\"rafal\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Od zera do extension - cz. 5 Pierwsze Extension - Blog o Microsoft Dynamics 365 Business Central","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/","og_locale":"en_US","og_type":"article","og_title":"Od zera do extension - cz. 5 Pierwsze Extension - Blog o Microsoft Dynamics 365 Business Central","og_description":"Dzisiaj poka\u017ce Ci, ju\u017c ostatni krok na drodze do Twojego pierwszego Extension. Po ma\u0142ym teoretycznym wst\u0119pie odpalimy Visual Studio Code i utworzymy pierwszy mikro dodatek do systemu Dynamics 365 Business Central.","og_url":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/","og_site_name":"Blog o Microsoft Dynamics 365 Business Central","article_published_time":"2019-02-01T08:22:06+00:00","article_modified_time":"2019-02-01T10:53:10+00:00","og_image":[{"width":1895,"height":926,"url":"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/odzera_5.png?fit=1895%2C926&ssl=1","type":"image\/png"}],"author":"rafal","twitter_card":"summary_large_image","twitter_creator":"@rbabaczyk","twitter_site":"@rbabaczyk","twitter_misc":{"Written by":"rafal","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/","url":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/","name":"Od zera do extension - cz. 5 Pierwsze Extension - Blog o Microsoft Dynamics 365 Business Central","isPartOf":{"@id":"https:\/\/d365bc.info.pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#primaryimage"},"image":{"@id":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/odzera_5.png?fit=1895%2C926&ssl=1","datePublished":"2019-02-01T08:22:06+00:00","dateModified":"2019-02-01T10:53:10+00:00","author":{"@id":"https:\/\/d365bc.info.pl\/#\/schema\/person\/f5cb8e045a4a97815cd6e40491adefad"},"breadcrumb":{"@id":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#primaryimage","url":"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/odzera_5.png?fit=1895%2C926&ssl=1","contentUrl":"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/odzera_5.png?fit=1895%2C926&ssl=1","width":1895,"height":926},{"@type":"BreadcrumbList","@id":"https:\/\/d365bc.info.pl\/en\/od-zera-do-extension-cz-5-pierwsze-extension\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/d365bc.info.pl\/"},{"@type":"ListItem","position":2,"name":"Od zera do extension &#8211; cz. 5 Pierwsze Extension"}]},{"@type":"WebSite","@id":"https:\/\/d365bc.info.pl\/#website","url":"https:\/\/d365bc.info.pl\/","name":"Blog o Microsoft Dynamics 365 Business Central","description":"Polski blog o Microsoft Dynamics 365 Business Central (dawniej Dynamics NAV)","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/d365bc.info.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/d365bc.info.pl\/#\/schema\/person\/f5cb8e045a4a97815cd6e40491adefad","name":"rafal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/d365bc.info.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/76728b0891ff455b2cb63205ba51106e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/76728b0891ff455b2cb63205ba51106e?s=96&d=mm&r=g","caption":"rafal"}}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/d365bc.info.pl\/wp-content\/uploads\/2019\/01\/odzera_5.png?fit=1895%2C926&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3iarJ-mB","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/posts\/1401"}],"collection":[{"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/comments?post=1401"}],"version-history":[{"count":36,"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/posts\/1401\/revisions"}],"predecessor-version":[{"id":1450,"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/posts\/1401\/revisions\/1450"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/media\/1402"}],"wp:attachment":[{"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/media?parent=1401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/categories?post=1401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d365bc.info.pl\/en\/wp-json\/wp\/v2\/tags?post=1401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}