<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Al on Wingate365</title><link>https://blog.wingate365.com/tags/al/</link><description>Recent content in Al on Wingate365</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Sat, 20 Apr 2024 12:39:26 +0000</lastBuildDate><atom:link href="https://blog.wingate365.com/tags/al/index.xml" rel="self" type="application/rss+xml"/><item><title>Exploring the Middle Ground: Simple Dev for Dynamics 365 Business Central</title><link>https://blog.wingate365.com/2024/04/dynamics-365-bc-al-for-coding.html</link><pubDate>Sat, 20 Apr 2024 11:18:00 +0000</pubDate><guid>https://blog.wingate365.com/2024/04/dynamics-365-bc-al-for-coding.html</guid><description>&lt;p&gt;&lt;strong&gt;Microsoft’s low-code solutions&lt;/strong&gt;, particularly in the realm of &lt;strong&gt;business applications&lt;/strong&gt; and &lt;strong&gt;Dynamics 365 (D365)&lt;/strong&gt;, offer several compelling advantages:&lt;/p&gt;&lt;div aria-description="Your personal and company data are protected" class="content" tabindex="0"&gt;&lt;div class="ac-container ac-adaptiveCard"&gt;&lt;div class="ac-textBlock"&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faster Development&lt;/strong&gt;: Low-code platforms, such as &lt;strong&gt;Power Apps&lt;/strong&gt;, allow developers to create applications with &lt;strong&gt;minimal coding effort&lt;/strong&gt;. This accelerates the development process, enabling businesses to meet demand more swiftly.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost-Effectiveness&lt;/strong&gt;: By reducing the need for extensive custom code, low-code solutions lead to &lt;strong&gt;lower development costs&lt;/strong&gt;. Organizations can achieve their goals without investing excessive time and resources.&lt;/p&gt;</description></item><item><title>Power up D365BC Power Automate Flows with API Pages</title><link>https://blog.wingate365.com/2024/03/power-up-d365bc-power-automate-flows.html</link><pubDate>Sat, 16 Mar 2024 13:00:00 +0000</pubDate><guid>https://blog.wingate365.com/2024/03/power-up-d365bc-power-automate-flows.html</guid><description>&lt;p&gt;The opportunity to extend functionality in Dynamics 365 BC with Power Automate is huge. One of the most critical concepts for me is the general ability to trigger flows, based on certain events or simply on demand, perform a automated / semi- automated business process or approval and then write back the decision as a change to a record in BC.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The standard set of API&amp;rsquo;s are pretty great to get started on this - check out the docs here &lt;a href="https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/"&gt;API (v2.0) for Dynamics 365 Business Central - Business Central | Microsoft Learn&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, sometimes the field you want is not defined or the record type has been added to the set yet. This can be a bit of a blocker. Thankfully you can create your own API very easily. This post is aimed at BC consultants who want to do just this using API pages.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is a similar exercise from MSFT for reference &lt;a href="https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-develop-custom-api"&gt;Developing a custom API - Business Central | Microsoft Learn&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For this example below will create and publish a small extension that contains an API page to interact with the vendor table through OData web services. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We will use VS code &lt;a href="https://code.visualstudio.com/download"&gt;Download Visual Studio Code - Mac, Linux, Windows&lt;/a&gt; and a few addons  &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-dynamics-smb.al"&gt;AL Language extension for Microsoft Dynamics 365 Business Central - Visual Studio Marketplace&lt;/a&gt; &amp;amp; &lt;a href="https://marketplace.visualstudio.com/items?itemName=andrzejzwierzchowski.al-code-outline"&gt;AZ AL Dev Tools/AL Code Outline - Visual Studio Marketplace&lt;/a&gt;&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Getting started &lt;/h2&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Create a new AL in VS code project by tapping F1, use the AL:Go! from the command pallet&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Connect your project to a BC trial sandbox / CDX / other instance&lt;/li&gt;&lt;li&gt;You will need to have full admin access and SUPER permission granted &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA84ctCHqx7UH9IqxOc9HzZA44-XodK1Ysntp25eSSUjlKB-3L47atP_cFRJk19hJn_El006iGXAC59AhVhfE72amS65UhGV70Nl2cOo-ijDcNp6jWWDISmJxmsSquE1oMqMStYpF6V0Dtb3aIx_Jjrth8pMqINRg-gzC0Wg6dv1zrpgzieLLf/s1016/2024-03-16_11h24_17.png"&gt;&lt;img border="0" data-original-height="196" data-original-width="1016" height="124" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA84ctCHqx7UH9IqxOc9HzZA44-XodK1Ysntp25eSSUjlKB-3L47atP_cFRJk19hJn_El006iGXAC59AhVhfE72amS65UhGV70Nl2cOo-ijDcNp6jWWDISmJxmsSquE1oMqMStYpF6V0Dtb3aIx_Jjrth8pMqINRg-gzC0Wg6dv1zrpgzieLLf/w640-h124/2024-03-16_11h24_17.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh87fU7CCmGFPc9dReZItDBrHVV9NS9Z8RTg2RkzspSJGRYD-nr8wUiwMY7w0Zp1DobG5OUhKhhyphenhyphenzrKmVc3iObbG0W0IWpk3tMxRgwYr6aQst6FfMafeZ14WnGCiAQ4Mw5VKJTEC0FITsxvqjxJ6QACBuhyphenhyphenFgpfjWlm183bPivvZxONyzxEQLYx/s1261/2024-03-16_11h06_10.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="500" data-original-width="1261" height="254" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh87fU7CCmGFPc9dReZItDBrHVV9NS9Z8RTg2RkzspSJGRYD-nr8wUiwMY7w0Zp1DobG5OUhKhhyphenhyphenzrKmVc3iObbG0W0IWpk3tMxRgwYr6aQst6FfMafeZ14WnGCiAQ4Mw5VKJTEC0FITsxvqjxJ6QACBuhyphenhyphenFgpfjWlm183bPivvZxONyzxEQLYx/w640-h254/2024-03-16_11h06_10.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="text-align: left;"&gt;Add a tenant definition line to the launch.json to define your tenancy ID, update the sandbox name if needed&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;F1 &amp;gt; AL: Download Symbols &lt;/li&gt;&lt;/ul&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvUdhd6IeUpBCIPw-rfPfVD1s8ouc-mRKEHT_sdDA3g58n-XH8nFvht8hMmf_O-wCfHxjB_hwEosJZNwRmwMkZZZNgxoGcpzaYPsiwPK8eZ-vNC6ogoSVjmrl1hnniM4GUQAIfor8dJ9kQ5RhURd-5sbGlvbEs2JaVYY5x9_bu6c57QrYi1O0d/s1250/2024-03-16_11h29_09.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="335" data-original-width="1250" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvUdhd6IeUpBCIPw-rfPfVD1s8ouc-mRKEHT_sdDA3g58n-XH8nFvht8hMmf_O-wCfHxjB_hwEosJZNwRmwMkZZZNgxoGcpzaYPsiwPK8eZ-vNC6ogoSVjmrl1hnniM4GUQAIfor8dJ9kQ5RhURd-5sbGlvbEs2JaVYY5x9_bu6c57QrYi1O0d/w640-h172/2024-03-16_11h29_09.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="text-align: left;"&gt;This action gets the source code / lists of objects from the sandbox you defined above&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilK11Nx17GMCPEx7foc9gSlN_dmPmIa74tOc1NhPNqn2NGSGNTwR9QmQbcKSvat9gtzhGagkMRbEbiR2_LAU-s-PAaRXvqZ9WJaNRD-cfFy_Z0nG_5Ryd3bxNtI4bPsS_a3EnxQvHy7orReGzzk5ZQ1iP62kNfRPlVtVG3_PEaDoVIDEp1Doba/s1259/2024-03-16_11h28_32.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="768" data-original-width="1259" height="390" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilK11Nx17GMCPEx7foc9gSlN_dmPmIa74tOc1NhPNqn2NGSGNTwR9QmQbcKSvat9gtzhGagkMRbEbiR2_LAU-s-PAaRXvqZ9WJaNRD-cfFy_Z0nG_5Ryd3bxNtI4bPsS_a3EnxQvHy7orReGzzk5ZQ1iP62kNfRPlVtVG3_PEaDoVIDEp1Doba/w640-h390/2024-03-16_11h28_32.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The system will ask you to authenticate on the through the use of a one time code, paste the code into the web page it opens, and check the symbols downloaded ok back in VS code. You will need a login with SUPER permission set for this.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 style="text-align: left;"&gt;Create an API page&lt;/h2&gt;&lt;div&gt;Now we are ready to make some new objects and deploy them to the sandbox as a DEV extension. &lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Use the AZ New AL file wizard, from the right click menu or command pallet, to start creating a new object of type PAGE&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyKvGc6HGzP6H5DZ-wlR5haWJtU9H4skFLyr8oNQU3R5sz2t4juQ6xpVv9IpljuDF_5B5xUiUhr8BxWJ8FevusmXRDSTdsEBqIINKVaAfOX9C9CVf5QDvYJ4dQO1-AokdTBhJro93Zmobs3Eq6CC5VY8mIEA7XOnR0TxJNfXs9c-2gHVNsInaM/s1251/Screenshot%202024-03-16%20113629.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="111" data-original-width="1251" height="56" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyKvGc6HGzP6H5DZ-wlR5haWJtU9H4skFLyr8oNQU3R5sz2t4juQ6xpVv9IpljuDF_5B5xUiUhr8BxWJ8FevusmXRDSTdsEBqIINKVaAfOX9C9CVf5QDvYJ4dQO1-AokdTBhJro93Zmobs3Eq6CC5VY8mIEA7XOnR0TxJNfXs9c-2gHVNsInaM/w640-h56/Screenshot%202024-03-16%20113629.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQWM8K8uP3yiepUMLKwMamIUF0_A_rrXMtvMppxsEEgaSNe1oH2uWVoVpx28qEgBlUi8-Jj3dGHHNb_nK1zaE1XEFkZnUJx7RQS7qCDXRSWoxKoeBeaytoCp06I3Jk-wwGNakN4J-SAwtHGmECRfSJSyZJoKrTwPRNQ8-gq8j-Z3u7TsYgbQzu/s617/2024-03-16_11h39_49.png"&gt;&lt;img border="0" data-original-height="325" data-original-width="617" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQWM8K8uP3yiepUMLKwMamIUF0_A_rrXMtvMppxsEEgaSNe1oH2uWVoVpx28qEgBlUi8-Jj3dGHHNb_nK1zaE1XEFkZnUJx7RQS7qCDXRSWoxKoeBeaytoCp06I3Jk-wwGNakN4J-SAwtHGmECRfSJSyZJoKrTwPRNQ8-gq8j-Z3u7TsYgbQzu/w400-h211/2024-03-16_11h39_49.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBKNsalpD7rBYo810ga8YauJRVcUu9oq77DJEfvTm26UpAYLbCzPT52eLQHOKTdGSNSjOgejc1CHtbsiZYTpHwKAo2wMBsKhb3wYlYWIKEzNeo_WIBEwOJiaAkDFn0rWQwqVi4i54zy2BX9ISUtQrM8YEoDZ1Qujl0maw-o-SQOhdSy7P62YyH/s1039/2024-03-16_11h41_42.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="537" data-original-width="1039" height="330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBKNsalpD7rBYo810ga8YauJRVcUu9oq77DJEfvTm26UpAYLbCzPT52eLQHOKTdGSNSjOgejc1CHtbsiZYTpHwKAo2wMBsKhb3wYlYWIKEzNeo_WIBEwOJiaAkDFn0rWQwqVi4i54zy2BX9ISUtQrM8YEoDZ1Qujl0maw-o-SQOhdSy7P62YyH/w640-h330/2024-03-16_11h41_42.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Object Id&lt;/b&gt;: Leave the suggestion and if you get stuck read this &lt;a href="https://yzhums.com/21335/"&gt;Dynamics 365 Business Central: View the all object details (Type, ID, Name…) and find out what extension an object belong to without using VS Code | Dynamics 365 Lab (yzhums.com)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Object Name&lt;/b&gt;: Use something sensible here, you can have spaces&lt;/li&gt;&lt;li&gt;&lt;b&gt;Source Table Name&lt;/b&gt;: Start typing to filter all the tables in BC, this is the single table that all the fields in you API will come from &lt;/li&gt;&lt;li&gt;&lt;b&gt;Page Type&lt;/b&gt;: Set to API&lt;/li&gt;&lt;li&gt;&lt;b&gt;API Publisher&lt;/b&gt;: this best defines an organisational level term &lt;/li&gt;&lt;li&gt;&lt;b&gt;API Group&lt;/b&gt;: this best defines the type of API&lt;/li&gt;&lt;li&gt;&lt;b&gt;API Version&lt;/b&gt;: Set a version number&lt;/li&gt;&lt;li&gt;&lt;b&gt;Entity name&lt;/b&gt;: what is defined by 1 row of the table ?&lt;/li&gt;&lt;li&gt;&lt;b&gt;EntitySet Name&lt;/b&gt;: what is the collective term for many rows ?&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Just to give a sneak peek on what the impact of those last few choices - this is how the API Page shows up in Power Automate, take not of the API Publisher, API Group, API Version and EntitySet Name. This may help you name the API page for best effect. &lt;/div&gt;&lt;div&gt; &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI7x3OQqgNiz0aJqbOUEY9To5pmapPUax-Xkhtc461_IIDUHGSwCIYhM7ETJOp8E0jU03PATpCyBaK44URDJ7tnKGc-LhuqBeulb3RQ3-ZHi02GMwfe3XO_63IgmGZLF9A4TuZjA05p_iVQF8SPV8GesZOH4aPZ6P6m4_yvxX9MxQWxf5vgEJ5/s1092/2024-03-16_11h57_06.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="570" data-original-width="1092" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI7x3OQqgNiz0aJqbOUEY9To5pmapPUax-Xkhtc461_IIDUHGSwCIYhM7ETJOp8E0jU03PATpCyBaK44URDJ7tnKGc-LhuqBeulb3RQ3-ZHi02GMwfe3XO_63IgmGZLF9A4TuZjA05p_iVQF8SPV8GesZOH4aPZ6P6m4_yvxX9MxQWxf5vgEJ5/w400-h209/2024-03-16_11h57_06.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Back to the wizard - next we can pick which fields in include - or all them add. Naturally only add what you need! To test the performance I did add them all&amp;hellip; &lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;The API page can be used to read and write data. Flow fields like &amp;lsquo;Balance&amp;rsquo; etc can be read, but naturally cannot be written to. If in a later flow you try to write to a flow field the process will fail.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHaexdKlO0_xCUgLy9QiBzW0LuFO_9OxqZKEUWCWO6QRnKSaC08K1OyQnC4YoJBU9SGJ6ZnyzbpYlLzTqC_10wyuFeStV6Y5W9V5B_a2pjWxOzIe0Ds1HvA7pT1_xNxmHQRB50vXcxM_0O3iM7tVYWrjKnF43SxgH5GU72S_D3QEyzEMQ9bAoq/s1037/2024-03-16_11h42_17.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="529" data-original-width="1037" height="326" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHaexdKlO0_xCUgLy9QiBzW0LuFO_9OxqZKEUWCWO6QRnKSaC08K1OyQnC4YoJBU9SGJ6ZnyzbpYlLzTqC_10wyuFeStV6Y5W9V5B_a2pjWxOzIe0Ds1HvA7pT1_xNxmHQRB50vXcxM_0O3iM7tVYWrjKnF43SxgH5GU72S_D3QEyzEMQ9bAoq/w640-h326/2024-03-16_11h42_17.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;If you do want things in a particular order, define it here, or tweak the code of the file that&amp;rsquo;s created&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;You can click finish as this point and review the new API page object that you have just created&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6gsiIwpDRzcVsM0MAqe1KBAXUjKUje6927Guvz0EN4U40lyoNsF3YHhMOzOrEXgkxPcWuY0jVunXC8EXTLrnWs_gHtuZiZvMThYTU1Pbtr1I4MfOJldhKfshXD5dCB4mPeXl6AN1SUk-K2lmbXvsdQ8OO4nCYntTFtGqplkiIdn9AtA3ha2LU/s1284/2024-03-16_12h22_28.png"&gt;&lt;img border="0" data-original-height="563" data-original-width="1284" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6gsiIwpDRzcVsM0MAqe1KBAXUjKUje6927Guvz0EN4U40lyoNsF3YHhMOzOrEXgkxPcWuY0jVunXC8EXTLrnWs_gHtuZiZvMThYTU1Pbtr1I4MfOJldhKfshXD5dCB4mPeXl6AN1SUk-K2lmbXvsdQ8OO4nCYntTFtGqplkiIdn9AtA3ha2LU/w640-h280/2024-03-16_12h22_28.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;But before your API is available (as above) in Power Automate we need to publish the app to the sandbox&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;F1 &amp;gt; AL Publish (ok ctrl+F5)&lt;/li&gt;&lt;/ul&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUMP2RCWuz1WgBQewvuv_mUb4qLalfvX-yS4ZeyL5skVFExgHsgFeOy3KLTFNSHYVzWxDz_Zh90wkKYtruvs5T16L4TnC3nZjkWjNHg7iaQW9NIFpGYsMdrR0sQ8wYQZ6VxQM0dz3yAakaSQTlUMSR0WaETr1uVoYjcfIetDn_I0iF47JAR1ft/s1397/2024-03-16_12h01_59.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="280" data-original-width="1397" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUMP2RCWuz1WgBQewvuv_mUb4qLalfvX-yS4ZeyL5skVFExgHsgFeOy3KLTFNSHYVzWxDz_Zh90wkKYtruvs5T16L4TnC3nZjkWjNHg7iaQW9NIFpGYsMdrR0sQ8wYQZ6VxQM0dz3yAakaSQTlUMSR0WaETr1uVoYjcfIetDn_I0iF47JAR1ft/w640-h128/2024-03-16_12h01_59.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Publish without debugging will simply install / update the app on the sandbox and open BC for you on page 22 (that&amp;rsquo;s what we asked it to do in launch.json)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;Now the app is published ok&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw0bgX_SFj9r1kCeB0HlFhZFW0c0ot0UwVFcUpPDF8fwy0hQvvd6eT6Z6bnplQgkeIymU5hmArV6KNVxVeSZnJ0UHDTMSb5UAUOhgs16zc5doXiUTFP_S1Xi4hK32VTcVgK0wwGYCkIHbpcL0piScCSp7GfOnbSPVru-dWSB-AWAs_6Qi0DYy5/s1460/2024-03-16_12h00_53.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="830" data-original-width="1460" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw0bgX_SFj9r1kCeB0HlFhZFW0c0ot0UwVFcUpPDF8fwy0hQvvd6eT6Z6bnplQgkeIymU5hmArV6KNVxVeSZnJ0UHDTMSb5UAUOhgs16zc5doXiUTFP_S1Xi4hK32VTcVgK0wwGYCkIHbpcL0piScCSp7GfOnbSPVru-dWSB-AWAs_6Qi0DYy5/w640-h364/2024-03-16_12h00_53.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;We can check the extension on the Extension Management page in BC. The App is published as Dev. as we pushed it directly from VS Code. When we did the publish you will notice the .app file was also added to the folder. This .app file can be used to upload the ext to any environment. When you do this its published as type PTE. &lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;The main practical difference of PTE and Dev ext, is that PTE ext remain present when BC is updated. Dev ext are removed. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZakHW6ayP_x_woznvkjCKwGDlEiG5ZIOye6z8P7rBIeM_fyN9Xa0P7-moFYFkntFsgYe-bu-8BQKyrZHuIbFaTJNybsEl-aSXQfJ9rZB0JGI3veWOMRYm6BolCvP6MsE2Ehu4KXfrbwCSt7dzyuMzJGdpo-dPw6qTL_5DgOb1xTx18gJfdy7U/s1290/2024-03-16_12h06_07.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="314" data-original-width="1290" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZakHW6ayP_x_woznvkjCKwGDlEiG5ZIOye6z8P7rBIeM_fyN9Xa0P7-moFYFkntFsgYe-bu-8BQKyrZHuIbFaTJNybsEl-aSXQfJ9rZB0JGI3veWOMRYm6BolCvP6MsE2Ehu4KXfrbwCSt7dzyuMzJGdpo-dPw6qTL_5DgOb1xTx18gJfdy7U/w640-h156/2024-03-16_12h06_07.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Additionally, in a Power Automate flow that connects to a company in this envienment we will also now see our new API.&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Writing data&lt;/h2&gt;&lt;div&gt;The API pages can be used to read and update records - the usual validation applies - but I now have access to all the fields I added during the API page creation (which was all of them!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEium21DcoTC_saaJf7AnvOXDH_gsxFvU0of2hdpFPtrf28XI2bfdp83DyAMgLiQ_4wZEgJu_efAUzFxQYvdMjMQJd3wNHspQHa0FXL5paUIfWtgva11vqmkfbA6kJyH9onnQcDMQlzk6i08RroSkhmNki8qBS_YdvZxBYT_uU7LB4l30uWORowj/s1099/2024-03-16_12h26_08.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="912" data-original-width="1099" height="532" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEium21DcoTC_saaJf7AnvOXDH_gsxFvU0of2hdpFPtrf28XI2bfdp83DyAMgLiQ_4wZEgJu_efAUzFxQYvdMjMQJd3wNHspQHa0FXL5paUIfWtgva11vqmkfbA6kJyH9onnQcDMQlzk6i08RroSkhmNki8qBS_YdvZxBYT_uU7LB4l30uWORowj/w640-h532/2024-03-16_12h26_08.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Naturally these parameters would be better set using variables from an earlier step in the flow, perhaps reading from a row in a sharepoint list, or from an ms form etc - in this simple example I&amp;rsquo;ve just hardcoded in some text. &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Save and test the flow&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj30D2hDlOERIYBODwMUTXZAN5VDvJPLsx2917pa0tjggnKOEVvZ5haL0Be92LRvtlU1ZuqutgyLT2R4lG0Hz9lzcm4tYLu7GeWkukXvXmJtaaCChK6XKdz4ZBePuiIqtQq_E_nSC3OQnvOgiDOwd3NuARb_4kaR2aO6roiUWxGga9Sw2EkNK1W/s1136/2024-03-16_12h28_50.png"&gt;&lt;img border="0" data-original-height="834" data-original-width="1136" height="470" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj30D2hDlOERIYBODwMUTXZAN5VDvJPLsx2917pa0tjggnKOEVvZ5haL0Be92LRvtlU1ZuqutgyLT2R4lG0Hz9lzcm4tYLu7GeWkukXvXmJtaaCChK6XKdz4ZBePuiIqtQq_E_nSC3OQnvOgiDOwd3NuARb_4kaR2aO6roiUWxGga9Sw2EkNK1W/w640-h470/2024-03-16_12h28_50.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Over in BC - a new vendor as defined by the params I supplied:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY4dTjOUdKGHdc_5mbcFZQO1dJPoqyRMvB_p7efoEoJqEIzdffJ0ojA_smvaK00eTDz1ZWMs_X49_zCjUuat0aBD-_ahP7VWtttvidl9P7XC7c8n65LgvAUVZNn8bt5fkhD9RwAUbrnlQGIiAtvbku_MoIm9JzwnwvaGL6c1UKB-EuEl3aIJZC/s1906/2024-03-16_12h33_06.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="863" data-original-width="1906" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY4dTjOUdKGHdc_5mbcFZQO1dJPoqyRMvB_p7efoEoJqEIzdffJ0ojA_smvaK00eTDz1ZWMs_X49_zCjUuat0aBD-_ahP7VWtttvidl9P7XC7c8n65LgvAUVZNn8bt5fkhD9RwAUbrnlQGIiAtvbku_MoIm9JzwnwvaGL6c1UKB-EuEl3aIJZC/w640-h290/2024-03-16_12h33_06.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Shows as created by the flow owner, who naturally would need a BC license&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;h2 style="text-align: left;"&gt;Reading data&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;Data out - this API can also now be found in PowerBI for pulling out all the vendor data&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcUYcVOz-Qv9rkf9qbcmTLIo6T4EmceEuM4BIscr1WouG2hgfMbGSYNBDLXA3o4J8GjSdSoy1z_7qlqJDfoGDAwszoMyobXB_kBOQSawruTTZH4W6qOlfZDfilGafr3VLtAo3KzUGrPztBCkTwHvvJo45IniGBYpnPG1Id9Gl5rDoLvINC820w/s882/2024-03-16_12h37_30.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="702" data-original-width="882" height="510" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcUYcVOz-Qv9rkf9qbcmTLIo6T4EmceEuM4BIscr1WouG2hgfMbGSYNBDLXA3o4J8GjSdSoy1z_7qlqJDfoGDAwszoMyobXB_kBOQSawruTTZH4W6qOlfZDfilGafr3VLtAo3KzUGrPztBCkTwHvvJo45IniGBYpnPG1Id9Gl5rDoLvINC820w/w640-h510/2024-03-16_12h37_30.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD7Rv5v-Ye-PYEmPr4U1NTtflJZUITaKhNNRQmfd7qd1c6ljxRgEBn6h8pkVSgfujRzxgssV1NA7r7S5HWO20QQlabpDkXss7h70noNMJxsVX2V0ld2Gk76fqvN1x1k1dq66Owloh6WgYLDoXbY4kI8OAgSU3iFbM5EX_02tPChVFtV2Xh_E64/s1322/2024-03-16_12h38_35.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1053" data-original-width="1322" height="510" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD7Rv5v-Ye-PYEmPr4U1NTtflJZUITaKhNNRQmfd7qd1c6ljxRgEBn6h8pkVSgfujRzxgssV1NA7r7S5HWO20QQlabpDkXss7h70noNMJxsVX2V0ld2Gk76fqvN1x1k1dq66Owloh6WgYLDoXbY4kI8OAgSU3iFbM5EX_02tPChVFtV2Xh_E64/w640-h510/2024-03-16_12h38_35.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Finally if you need the full end point URL of the API page - here is how to build it up - &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://api.businesscentral.dynamics.com/v2.0/&amp;amp;lt;tenant"&gt;https://api.businesscentral.dynamics.com/v2.0/&amp;amp;lt;tenant&lt;/a&gt; Id&amp;gt;/&amp;lt;environment name&amp;gt;/api/&amp;lt;API publisher&amp;gt;/&amp;lt;API group&amp;gt;/&amp;lt;API version&amp;gt;/companies(&amp;lt;company id&amp;gt;)/&amp;lt;EntitySetName&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So we have all of that, apart from the company name which you will need to look up in BC from the companies page - get the system Id guid&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6SXBX9Z16xG9jnNov_PFHJl0NmiQ5UcaY7QC0t9zFY6NK-4FHUMx28mC_eYs-fgHSDslDZaA4jZrCcXrpUOBrmRi1MvYUA7yLe1i7LpiUgstFGHXgqoaMC9mX4qWtTxJTlkXKF7lG-w4VLJFO53mzHy8doQeWq9RXWt70bpE9C1rJFkGmsrL/s1406/2024-03-16_12h48_56.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="767" data-original-width="1406" height="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6SXBX9Z16xG9jnNov_PFHJl0NmiQ5UcaY7QC0t9zFY6NK-4FHUMx28mC_eYs-fgHSDslDZaA4jZrCcXrpUOBrmRi1MvYUA7yLe1i7LpiUgstFGHXgqoaMC9mX4qWtTxJTlkXKF7lG-w4VLJFO53mzHy8doQeWq9RXWt70bpE9C1rJFkGmsrL/w640-h350/2024-03-16_12h48_56.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is my API as a URL endpoint &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://api.businesscentral.dynamics.com/v2.0/b1c26eb6-ffc0-4887-b427-234b2db89ac4/sandbox/api/andywingate/pa/v1.0/companies(7368d553-0c5c-ee11-8df4-6045bdc89477)/vendors"&gt;https://api.businesscentral.dynamics.com/v2.0/b1c26eb6-ffc0-4887-b427-234b2db89ac4/sandbox/api/andywingate/pa/v1.0/companies(7368d553-0c5c-ee11-8df4-6045bdc89477)/vendors&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Read more about URL formatting here &lt;a href="https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-develop-custom-api"&gt;Developing a custom API - Business Central | Microsoft Learn&lt;/a&gt; &amp;amp; &lt;a href="https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/api-reference/v2.0/endpoints-apis-for-dynamics"&gt;Endpoints for the APIs for Microsoft Dynamics 365 Business Central - Business Central | Microsoft Learn&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tested using an OData feed in PowerBI&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIZD-adFQkY0GqDVAENqNALsw1rDY5R9AM3tmCcR11BzXX24_yMBAvAhkhcMySlJYuqHsJmP7FhkIOm6VBOqc5erxCOXhxWJqaG-sd-O3ee2aZ-9438XyWJfNIDj3yVAd3prWHJXdbdqRTJHF9aY3bXujJ5E1IjEaenca-DmeCPLPkh6mwEttJ/s1902/2024-03-16_12h56_21.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1018" data-original-width="1902" height="342" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIZD-adFQkY0GqDVAENqNALsw1rDY5R9AM3tmCcR11BzXX24_yMBAvAhkhcMySlJYuqHsJmP7FhkIOm6VBOqc5erxCOXhxWJqaG-sd-O3ee2aZ-9438XyWJfNIDj3yVAd3prWHJXdbdqRTJHF9aY3bXujJ5E1IjEaenca-DmeCPLPkh6mwEttJ/w640-h342/2024-03-16_12h56_21.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Source code of the vendor table API page here &lt;a href="https://github.com/andywingate/d365bc-api4pa"&gt;GitHub - andywingate/d365bc-api4pa&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;That&amp;rsquo;s it, give it a try!&lt;/p&gt;</description></item><item><title>To Validate or Not to Validate: Line validation in Dynamics 365 Business Central Documents</title><link>https://blog.wingate365.com/2023/03/to-validate-or-not-to-validate-line.html</link><pubDate>Sun, 05 Mar 2023 19:54:00 +0000</pubDate><guid>https://blog.wingate365.com/2023/03/to-validate-or-not-to-validate-line.html</guid><description>&lt;p&gt;This is a short note on how to add further validation to the sales or purchase document lines in Dynamics 365 Business Central with a small AL code extension.&amp;nbsp;&lt;/p&gt;&lt;p&gt;There are a number of validations operating in the background for sales and purchase lines. Sometimes you need to add to this, in this example I'll build a small app to meet the following requirement.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Prevent sales lines with zero value&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This is a great starting point for building apps &lt;a href="https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-get-started"&gt;https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-get-started&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To meet this requirement I'll use the OnAfterInsert trigger which will carry out the checks after the system already validated at the database level.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/triggers-auto/tableextension/devenv-onafterinsert-tableextension-trigger"&gt;https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/triggers-auto/tableextension/devenv-onafterinsert-tableextension-trigger&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is the example code:&lt;/div&gt;&lt;script src="https://emgithub.com/embed-v2.js?target=https%3A%2F%2Fgithub.com%2Fandywingate%2Fd365bc-validatesalesline%2Fblob%2Fmain%2FSalesLine.TableExt.al&amp;amp;style=default&amp;amp;type=code&amp;amp;showBorder=on&amp;amp;showLineNumbers=on&amp;amp;showFileMeta=on&amp;amp;showFullPath=on&amp;amp;showCopy=on"&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Lets see what ChatGPT has to say about this&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pretty handy!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What if we want more? I asked to validate in a different way: "Please rewrite the code to also prevent the job and job task from being blank"&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;script src="https://gist.github.com/andywingate/dbd1b85d1b65c34cd4b5e47454291c52.js"&gt;&lt;/script&gt;
&lt;div&gt;Looks good, I liked the way it also updated the error message, very handy. Would need testing of course.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The original simple .app and code can be found here&amp;nbsp;&lt;a href="https://github.com/andywingate/d365bc-validatesalesline"&gt;https://github.com/andywingate/d365bc-validatesalesline&lt;/a&gt;&lt;/div&gt;</description></item></channel></rss>