<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Microsoft Dynamics AX Tools</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/axtools/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/axtools/feed.xml</link>
    <description>To do the job right you need the right tools.</description>
    <lastBuildDate>Tue, 16 Apr 2019 04:43:52 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Parallel X++ Compilation for Microsoft Dynamics AX 2012 R2 with Cumulative Update 7</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/parallel-x-compilation-for-microsoft-dynamics-ax-2012-r2-with-cumulative-update-7</link>
      <pubDate>Mon, 04 Nov 2013 01:47:00 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2013/11/04/parallel-x-compilation-for-microsoft-dynamics-ax-2012-r2-with-cumulative-update-7/</guid>
      <description><![CDATA[In this post we describe the new AXBuild.exe utility that you can use to increase the speed of a...]]></description>
      <content:encoded><![CDATA[<p>In this post we describe the new AXBuild.exe utility that you can use to increase the speed of a compilation of all X++ source code and metadata validation. AXBuild became available in November 2013 as part of cumulative update 7 (cu7) for Microsoft Dynamics AX 2012 R2.</p>
<p>There are initial clarifications to understand about AXBuild:</p>
<ul>
<li>The legacy compilation options in the MorphX client remain available.</li>
<li>AXBuild involves the compilation of X++ source code into AX p-code and metadata validation, but it does not involve the subsequent generation from p-code into .NET Framework CIL.</li>
<li>AXBuild can compile all&nbsp;the&nbsp;elements in&nbsp;the system, but its scope cannot be narrowed to compiling just a subset of classes and other elements.</li>
</ul>
<p>Sometimes a compilation of all the AOT elements is needed. Such occasions include:</p>
<ul>
<li>Setup of AX 2012 R2.</li>
<li>Installation of upgrades and hotfixes.</li>
<li>Migration from development to test, staging, and production environments.</li>
</ul>
<h1>1&nbsp;&nbsp;Phases of any X++ Compile Process</h1>
<p>In the earlier blog post, <a title="How the X++ Compiler works for AX2012" href="https://blogs.msdn.com/b/axtools/archive/2013/06/11/how-the-x-compiler-works-for-ax2012.aspx">How the X++ Compiler works for AX2012</a> we gave a high level explanation of the processes that compile X++.&nbsp; Three major phases were described:</p>
<ul>
<li>Phase 1:&nbsp;&nbsp;&nbsp; Declarations and method signatures.</li>
<li>Phase 2:&nbsp;&nbsp;&nbsp; Metadata validation and method bodies.</li>
<li>Phase 3:&nbsp;&nbsp;&nbsp; Recompilation of elements that had preliminary errors.</li>
</ul>
<p>These phases apply to the compile process under AXBuild just as they apply to the compile process you initiate by clicking in the MorphX client menus.</p>
<h1>2&nbsp;&nbsp;Legacy Client Tier Compile of Full X++</h1>
<p>Until today the X++ compilation and metadata validation processes were always executed on the client tier using one single thread. Figure 1 represents the X++ compilation process that runs on the client. The client requests metadata from the Application Object Server (AOS) tier. Metadata is needed for every element that must be compiled or validated. The metadata stored in SQL Server is de-serialized by the AOS into the internal representation of a TreeNode. Then the metadata is transferred over the network to the client. If the client and AOS are installed on the same computer (the &ldquo;one box&rdquo; configuration), a process-to-process communication over RPCs is used in place of a two tier network communication.</p>
<p>After the client received the metadata, the client compiles the X++ source code. The X++ source code is translated in AX p-code. The AX runtime understands the p-code and can execute it. The compile process also validates any references to other elements that are specified through properties. Information about any errors is written to&nbsp;the compilation&nbsp;log. After each element is compiled, the client enriches its representation of the element with updated metadata and p-code. Next the client sends the enriched representation to the AOS. The AOS saves the updated element in the model store database.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/86/72/7220.MarcosC-20131101-Xpp-Client.PNG" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-86-72/7220.MarcosC_2D00_20131101_2D00_Xpp_2D00_Client.PNG"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/86/72/7220.MarcosC-20131101-Xpp-Client.PNG" original-url="https://blogs.msdn.com/resized-image.ashx/__size/200x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-86-72/7220.MarcosC_2D00_20131101_2D00_Xpp_2D00_Client.PNG" alt="" border="0" /></a></p>
<p style="text-align: center; padding-left: 30px;"><strong>Figure 1</strong>. Metadata transfer during compilation and validation process.</p>
<p>Agile development benefits from the client tier compile of X++, because the development cycles often require compilation of a narrow subset of all classes and forms etc. In the MorphX client the developer can compile individual elements such as one class. The developer can test the change, fix the code, recompile the one class, and retest. The compilations of individual classes complete in a second or two, so these agile development cycles are kept efficient.</p>
<p>Also, the compiler on the client tier is fully leveraged and integrated with productivity tools like Cross Reference, IntelliSense, and Visual Studio.</p>
<h1>3&nbsp;&nbsp;AOS Tier Compile of Full X++ (only in cu7)</h1>
<p>For a full X++ compile, the legacy client tier scenario is slow. Having the compilation run on the client is ironic for the following reasons:</p>
<ul>
<li>One irony is that the source code and the metadata are on the server computer, yet the compilation that needs the source and metadata is run on the client computer.</li>
<li>The server computer is typically more powerful in terms of hardware.</li>
</ul>
<p>In cu7 we are introducing AXBuild, an X++ compilation management utility that you run on the same server computer that hosts the AOS. AXBuild achieves its speed gains for the following major reasons:</p>
<ul>
<li>The client is excluded from the scenario. This eliminates the network communication from the AOS to the client and back. See Figure 2.</li>
<li>AXBuild runs on a server computer that typically has more powerful hardware than the client computer has.</li>
<li>AXBuild runs the compilation as a 64 bit process, instead of a 32 bit process as with MorphX. This allows more active memory to be addressed.</li>
<li>AXBuild compiles subsets of AOT elements in parallel, whereas the client compilations process uses just a single thread.</li>
</ul>
<p style="text-align: center;"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/86/72/0131.MarcosC-20131101-Xpp-AOS.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-86-72/0131.MarcosC_2D00_20131101_2D00_Xpp_2D00_AOS.png"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/86/72/0131.MarcosC-20131101-Xpp-AOS.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-86-72/0131.MarcosC_2D00_20131101_2D00_Xpp_2D00_AOS.png" alt="" border="0" /></a>&nbsp;</p>
<p style="text-align: center; padding-left: 30px;">&nbsp;<strong>Figure 2</strong>. Parallel compilation on the server tier.</p>
<p><em>Exclusion of the Client Tier:</em>&nbsp;In the legacy full X++ compilation that runs on the MorphX client, the network transmission of information from the AOS to the client and back adds 28% to the wall clock duration of the compilation process. Even if the client is installed on the same computer with the AOS, transmissions through RPCs are needed.</p>
<p><em>Parallel Compilation:</em>&nbsp;AXBuild starts multiple temporary AOS processes. These AOS worker processes run in parallel.&nbsp; AXBuild coordinates their compilation acitivities. AXBuild does the following:</p>
<ul>
<li>Assigns a subset of AOT elements for compilation to each temporary AOS.</li>
<li>Collects the results from each temporary AOS, and writes the results to a single combined compilation&nbsp;log file.</li>
</ul>
<p>AXBuild calculates the optimal number of temporary AOS workers as best it can, and it reports its calculation to its console. The calculation is based on the number of CPUs that the server computer has. However, you can fine tune and control the number of AOS workers by using the /workers= parameter. Factors you might consider include:</p>
<ul>
<li>Amount of active memory that the server computer has.</li>
<li>CPU demands that other processes might make while the compilation runs.</li>
</ul>
<p>&nbsp;</p>
<h1>4&nbsp;&nbsp;New compiler constraints</h1>
<p><strong>Calls to COM Objects Cannot be Chained Together</strong></p>
<p>When your X++ method contains calls to COM objects, the syntax shortcut of chaining methods calls together can cause the compiler to report an error.&nbsp; The simple solution is to rewrite a couple lines of code make the variable types more explicit and discoverable by the compiler.</p>
<p>&nbsp;<strong>A.&nbsp;&nbsp;&nbsp; Example that Fails:</strong>&nbsp;&nbsp;&nbsp; The following X++ code example chains the method2 call to the end of the method1 call. &nbsp;The server compiler reports an error for the method2 call:</p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">void methodXpp()</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">{</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">&nbsp;&nbsp;&nbsp; COM comInstanceA = new COM("My_COM_Type_A");</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">&nbsp;&nbsp;&nbsp; comInstanceA.method1().method2();&nbsp;&nbsp;&nbsp; // methods call chained together</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">}</span></p>
<p>&nbsp;<em>Underlying Details:</em>&nbsp;&nbsp;&nbsp; Often COM objects that are called by X++ code are installed only on the client tier, and are not installed on the server tier.&nbsp; In the preceding code example, the underlying problem is that the server compiler cannot know whether method1 returns another COM object or just an integer.&nbsp; A plain integer would not have a method named method2, so the compile cannot validate the call to method2.&nbsp; For the call to method1, the compiler accepts the late-binding approach by inserting into the p-code a call to the COM method named dispatch.</p>
<p>&nbsp;<strong>B.&nbsp;&nbsp;&nbsp; Example that Succeeds:</strong>&nbsp;&nbsp;&nbsp; The following rewrite of the preceding X++ code example eliminates the chain, and the server compile passes without error:</p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">void methodXpp()</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">{</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">&nbsp;&nbsp;&nbsp; COM comInstanceA = new COM("My_COM_Type_A");</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">&nbsp;&nbsp;&nbsp; COM comInstanceB;</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">&nbsp;&nbsp;&nbsp; comInstanceB = comInstanceA.method1();</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">&nbsp;&nbsp;&nbsp; comInstanceB.method2();</span></p>
<p style="padding-left: 60px;"><span style="color: #3366ff;">}</span></p>
<p>&nbsp;</p>
<p><em>Underlying Details:</em>&nbsp;&nbsp;&nbsp; In the preceding code example, the X++ compiler is told by an explicit type declaration that variable comInstanceB is a COM object.&nbsp; This gives the compiler justification to insert a call to the dispatch method for method2.</p>
<p>If you install cu7 all the application code exposing this pattern has been addressed and fixed, so no compilation errors should be reported. However if you choose not to install the application code portion of the cumulative update, you are going to get some compilation errors due to this pattern (Figure 3).</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/34/69/1460.cu7%20compile%20errors%20and%20warnings.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-34-69/1460.cu7-compile-errors-and-warnings.jpg"><img style="margin-right: auto; margin-left: auto; display: block;" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/34/69/1460.cu7%20compile%20errors%20and%20warnings.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-34-69/1460.cu7-compile-errors-and-warnings.jpg" alt="" width="564" height="82" border="0" /></a></p>
<p style="text-align: center;"><strong>Figure 3</strong>. Compilation errors generated if application code is not installed as part of cu7 setup.</p>
<h1>5&nbsp;&nbsp;Performance Gain</h1>
<p>The performance gain depends on the available resources in the computer where the parallel compilation process is being executed, including number of CPU&rsquo;s and memory available. However to put some numbers in perspective, we have taken some careful measurements.</p>
<h2>5.1&nbsp;&nbsp;Configuration</h2>
<ul>
<li>MorphX client, AOS and SQL Server installed on the same computer.</li>
<li>4 Cores 3.7 GHertz.</li>
<ul>
<li>Hyper-Threading enabled, which logically doubles the CPU count.</li>
</ul>
<li>32 GBytes of physical active memory.</li>
<li>6.0 Gigabits/s SATA Controller</li>
<li>Windows Server 2012</li>
<li>SQL Server 2012&nbsp;Enterprise with SP1&nbsp;(no memory constraint)</li>
<li>Windows virtual page caching disabled.</li>
<li>Fresh AX 2012 R2, with cu7 installed.</li>
</ul>
<h2>5.2&nbsp;&nbsp;Results of Performance Test</h2>
<ul>
<li><em>Compilation using AXBuild.exe running 9 AOS workers: </em>10 minutes and 40 seconds.</li>
<li><em>Compilation using MorphX client (for comparison): </em>2 hours and 26 minutes.</li>
</ul>
<p>Both measurements were done using the same hardware and software setup.</p>
<h1>6&nbsp;&nbsp;Miscellaneous Details</h1>
<ul>
<li>When you use the AOT of the MorphX client to import a .XPO file, the resulting X++ compile occurs only on the client tier &nbsp;(.XPO files import operation remains unchanged in&nbsp;cu7).&nbsp;</li>
<li>All generation of .NET Framework CIL remains unchanged in cu7.</li>
<li>The MorphX client is the Development Workspace window in ax32.exe.</li>
<li>Even though the name of the AOS program ax32serv.exe contains &lsquo;32&rsquo;, it is a 64 bit program.</li>
<li>Hotfix&nbsp;<a title="KB2844240" href="https://blogs.msdn.com/b/axtools/archive/2013/04/30/ax2012-r2-hotfix-available-improves-compile-speed.aspx?utm_source=feedly">KB2844240</a> is still relevant, getting better performance during compilation on top of AXBuild and legacy compilation from the client. This hotfix does not have to be installed independently from cu7, it is already included as part of the cumulative update, however you have to make sure it is executed against your model store using "AxUtil.exe schema".</li>
<li>AXBuild.exe needs&nbsp;to be executed with hot-swap&nbsp;disabled. For more information about hot-swap mode refer to&nbsp;<a title="Hot-swapping of .NET Assemblies in the AOS [AX 2012]" href="https://msdn.microsoft.com/en-us/library/hh538487.aspx">Hot-swapping of .NET Assemblies in the AOS [AX 2012]</a>.</li>
<li>AXBuild.exe is not a tool that can be ported independently from cu7 (copying it to a computer with a previous Dynamics AX2012 R2 version), since it needs additional support introduced into the Ax32Serv.exe (AOS) and other binaries&nbsp;only available starting in cu7 version.</li>
<li>For additional important information about AXBuild, see our formal Help topic on MSDN titled <a title="AxBuild.exe for Parallel Compile on AOS of X++ to p-code" href="https://msdn.microsoft.com/library/d6da631b-6a9d-42c0-9ffe-26c5bfb488e3.aspx">AxBuild.exe for Parallel Compile on AOS of X++ to p-code</a>.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>AxErd - New site with AX2012 R2 entity relationship diagrams</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/axerd-new-site-with-ax2012-r2-entity-relationship-diagrams</link>
      <pubDate>Tue, 11 Jun 2013 14:03:00 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2013/06/11/axerd-new-site-with-ax2012-r2-entity-relationship-diagrams/</guid>
      <description><![CDATA[A small commercial for those who missed the new site that provides database entity relationship...]]></description>
      <content:encoded><![CDATA[<p>A small commercial for those who missed the new site that provides database entity relationship diagrams for tables of Microsoft Dynamics AX 2012 R2.</p>
<p>Now you can get diagrams like this - prebuilt for key areas:</p>
<p><a href="https://www.microsoft.com/dynamics/ax/erd/ax2012r2/Erd-One-AcctPay-AP1-VendTrans-vsd.png"><img style="max-width: 550px;" src="https://www.microsoft.com/dynamics/ax/erd/ax2012r2/Erd-One-AcctPay-AP1-VendTrans-vsd.png" alt="" border="0" /></a></p>
<p>This is where you find it: <a href="https://www.microsoft.com/dynamics/ax/erd/ax2012r2/">https://www.microsoft.com/dynamics/ax/erd/ax2012r2/</a></p>
<p>Also check out this blog post: <a href="https://blogs.msdn.com/b/x/archive/2013/05/23/announcing-the-axerd-website-for-dynamics-ax-2012.aspx">https://blogs.msdn.com/b/x/archive/2013/05/23/announcing-the-axerd-website-for-dynamics-ax-2012.aspx</a></p>
<p>Enjoy! :)</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>How the X++ compiler works for AX2012</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/how-the-x-compiler-works-for-ax2012</link>
      <pubDate>Tue, 11 Jun 2013 12:27:00 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2013/06/11/how-the-x-compiler-works-for-ax2012/</guid>
      <description><![CDATA[By request, today's blog attempts to explains the sequence of phases that are performed by the X++...]]></description>
      <content:encoded><![CDATA[<p>By request, today's blog attempts to explains the sequence of phases that are performed by the X++ compiler in AX 2012.</p>
<p>The compile process is a little bit involved, so a drawing quickly becomes quite complicated. Instead we've tried to present the explanation&nbsp;in two modes that compliment each other:<br />A. C#-ish pseudocode<br />B. Corresponding paragraphs of verbiage</p>
<h3>C#-ISH PSEUDOCODE</h3>
<p>// Phase1: Limited compile only for metadata<br />// (of class declarations and method signatures).</p>
<p>foreach(Element in AOT)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element.CompileHeaders();<br />}</p>
<p>// Phase2: Full compile for metadata and code bodies.</p>
<p>foreach(Element in AOT)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compileSuceeded = Element.Compile();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (compileSuceeded == false)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListOfBadElements.Add(Element);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />}</p>
<p>// Phase3 to PhaseN: Recompile the errored elements<br />// until success or error stabilization.</p>
<p>if (ListOfBadElements.Count &gt; 0)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach(Element in ListOfBadElements)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compileSuceeded = Element.Compile();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (compileSuceeded == false)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NewListOfBadElements.Add(Element)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ListOfBadElements.Count == NewListOfBadElements.Count)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; // The list of elements with errors has been stabilized.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListOfBadElements = NewListOfBadElements.GetCopy();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NewListOfBadElements.Reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />}</p>
<h3>VERBAL EXPLANATION</h3>
<p>During a complete AOT compilation, there are at least two full compilation phases, plus the potential for N iterations of Phase3.</p>
<p>Phase1 is a pass over all the AOT elements. For now the compile operations concern only the class declarations and the method signatures. These limited compile operations create metadata about the types and their methods.<br />Reference errors are ignored during Phase1 because they are uninteresting consequences of the compile sequence. For example, the first class that is compiled might reference another class that has not quite yet been compiled, but which will be compiled a moment later in Phase1.</p>
<p>Phase2 is a pass over each AOT element to perform a full compile of each. The compiler validates all metadata, all references, and all X++ code. The compiler emits p-code (which the interpreter can later execute).<br />Any AOT element that suffers an error is added to a list of bad elements. In the explanatory pseudo code this list collection is named ListOfBadElements.</p>
<p>Phase3 occurs only if ListOfBadElements is not empty at the end of Phase2.<br />Phase3 is a pass through ListOfBadElements, so that each previously bad element can be recompiled. The elements that fail this recompile are added to a new list that is named NewListOfBadElements.<br />At the end of Phase3 there are three possible outcomes:</p>
<p>A. NewListOfBadElements.Count == 0<br />This means the overall compile has completed successfully. Error log will be empty. There might be warnings or informational messages (TODOs)</p>
<p>B. NewListOfBadElements.Count == ListOfBadElements.Count<br />This means the set of errors has stabilized (at a number above zero), which means the overall compile has failed. Error log will contain the errors, warnings and informational messages.</p>
<p>C. NewListOfBadElements.Count &lt; ListOfBadElements.Count<br />This means that Phase3 made useful progress in reducing the count of errors. Therefore another phase like Phase3 must be run. This leads to Phase4, Phase5, and PhaseN for as many iterations as progress continues.<br />The more elements the AOT contains, the more likely it is that iterations beyond Phase3 will be needed.</p>
<h3>AND THEN SOME...</h3>
<p>Also note that the compile pass is doing more than&nbsp;crunching X++ code into executable p-code. It's performing a vast number of metadata validations and it's updating the security information&nbsp;by running the Security Inference process on applicable constructs to update the security information available.&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Worth knowing when you leave part of your application broken</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/worth-knowing-when-you-leave-part-of-your-application-broken</link>
      <pubDate>Fri, 17 May 2013 13:07:55 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2013/05/17/worth-knowing-when-you-leave-part-of-your-application-broken/</guid>
      <description><![CDATA[We've seen a number of instances where part of the application was left in broken state "because we...]]></description>
      <content:encoded><![CDATA[<p>We've seen a number of instances where part of the application was left in broken state "because we don't use that part anyway". While we understand the sentiment behind this statement and attempt to accommodate the behavior through e.g. the suppression list for IL generation, there's something you need to understand when you do this: <strong>your compile time will suffer</strong> - sometimes quite significantly. So why is that? Let's examine how the X++ compiler and metadata validation works:</p>
<p>AX doesn't employ a dependency driven build system, but rather an algorithm that is driven by the amount of errors it encounters&nbsp;in each compile pass through the AOT. This strategy requires a minimum of two passes - exactly two in the best case, and more if there are "unfortunate" dependencies as these might turn out as errors in the second pass as dependencies are yet to be compiled. The third pass will typically take care of this subset. However, the compile time is proportional to the size of each pass and the elements processed. If an element fails to compile successfully in a pass, it is added to the next pass and thus increases the effort in that next pass. Compilation ends (success or fail) when the last pass didn't provide further progress on resolving the pending errors.</p>
<p>So you see how that gets effected by broken application? You've effectively added dead weight to each pass after the second and depending on what you've left broken, it might entail quite significant increase in compile time. E.g. forms are quite intricate to compile and verify, so are tables and classes, so if you leave a significant number of these broken, your compile time might suffer quite significantly.</p>
<p>Bottom line: leaving part of your application broken is not just a risk from an execution perspective. It also negatively effects the turn-around time when you need to compile.</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>AX2012 R2 hotfix available to improve compile speed</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/ax2012-r2-hotfix-available-to-improve-compile-speed</link>
      <pubDate>Tue, 30 Apr 2013 11:29:00 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2013/04/30/ax2012-r2-hotfix-available-to-improve-compile-speed/</guid>
      <description><![CDATA[As you probably know, we've been working on providing a hotfix to cut the overhead in compile time...]]></description>
      <content:encoded><![CDATA[<p>As you probably know, we've been working on providing a hotfix to cut the overhead in compile time experienced between AX2012 RTM and R2. For some of the systems where the issue&nbsp;was reported, the fix improved performance by as much as 50% - quite visible when comparing to previous compile times achieved with AX 2012. Not all installations will benefit equally from this tuning due to vast differences in performance characteristics as covered in earlier blog post.</p>
<p>At the time of blogging this, the hotfix is so hot off the press and freshly published that the KB information isn't fully available yet, however&nbsp;the testing&nbsp;is completed, the hotfix is final and can be downloaded/requested from the following link:</p>
<p style="padding-left: 30px;"><a href="https://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2844240">https://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2844240</a></p>
<p>Like all the other hotfixes to the product binaries, it's a full service roll up of hotfixes to all the binaries.</p>
<p>The core of the fix is in the Model Store schema managed by axutil and, if you don't rely on SQL&nbsp;replication for your model store, you can get a very similar effect by deleting the Primary Key index defined for the table ModelSecurityPermission (<strong>DISCLAIMER</strong>: This requires tinkering directly with the SQL schema, so it's only advised for experimental use. For all production scenarios, please apply the hotfix in completeness.)&nbsp;The hotfix is different and a little bit more involved since it redefines a PK for the table, to ensure that replication is still possible, while maintaining the best possible query plan. The hotfix will be part of the upcoming CU<span style="text-decoration: line-through;">6</span> release for AX2012 R2.</p>
<p><strong>Note: when you've applied the hotfix, you need to run "axutil schema" against the model stores you want updated.</strong></p>
<p>With this fix, we're addressing&nbsp;the loss in compile speed that surfaced with the R2 release, relative to AX2012 RTM. With that one done, we're continuing the pursuit of other improvements. Stay tuned...</p>]]></content:encoded>
    </item>
    <item>
      <title>Compile… oh no!</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/compile-oh-no</link>
      <pubDate>Thu, 25 Apr 2013 12:20:00 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2013/04/25/compile-oh-no/</guid>
      <description><![CDATA[With AX it takes time to crunch through all the code and metadata. However, many are seeing...]]></description>
      <content:encoded><![CDATA[<p>With AX it takes time to crunch through all the code and metadata. However, many are seeing &ldquo;extremely long&rdquo; compile times. In one of the earlier blogs, we reference compile times just under 2 hours on a VM when compiling AX2012 RTM. I&rsquo;m hearing from an increasing number of people that they are spending way more than that. So why is that the case and is there something to do about it?</p>
<p>First off, it&rsquo;s important to recognize that AX is single threaded in nature. Only one element is being compiled at a time and since compilation process is exercising all three tiers of the architecture (client, AOS and model store), it is extremely bound to the execution speed of each of these tiers and in the communication between them. The size of the application will also affect the compile time proportionally.</p>
<p>Now with this premise, the differences we&rsquo;re seeing are starting to make sense. Turns out that to minimize the &ldquo;friction&rdquo; and thus optimize compile performance, proximity of the three tiers is the most significant. This can be achieved through colocation so more of the involved components are running on the same machine. The more the merrier. This of cause with obvious limitations like saturation of the machine etc. The fastest compile is typically achieved by creating a &ldquo;1-box&rdquo; setup: SQL, AOS and Client on the same machine. This limits network impact between the tiers, which has a dramatic impact on the compile time.</p>
<p>When creating a 1-box setup it&rsquo;s important to manage the saturation of the box. Since SQL Server is a server product, unless instructed, it will take over the box to optimize SQL performance. The main limitation to incur on SQL is how much memory it uses. If the box has 16GB memory, allowing for 4GB SQL memory looks like a good setting. With an 8GB box, 3GB seems to be the sweet spot for optimal compile in our tests with an 8GB VM on a single 3.6GHz XEON processor, 4 + HT core host, with standard 7200rpm SATA disk. On such a VM, compile times for RTM out of the box showed to be one hour and fifty minutes. Note that these are ad hoc measurements with every possible caveat, so we&rsquo;ll be working on real reference numbers for different topologies.</p>
<p>Back to tuning again&hellip;. Then there&rsquo;s the SQL IO. We are reading and writing a lot, so SQL is benefitting from fast disks. Whether 10.000/15.000rpm disks, SSD or even RAM disk, it will improve, but results vary a lot and generally shouldn&rsquo;t be the first place to tune. However, once you start really tuning, this might be interesting. Similar for SQL Server connectivity where local systems can communicate faster through shared memory than through TCP. We have no solid quantification of the gains from this particular tuning at this point, but some system configurations might deprive SQL from choosing the most optimal configuration, so it might be worth checking those configuration options, when you want to take tuning to the next level.</p>
<p><strong>So what&rsquo;s the big problem - less than two hours is not that bad?</strong> Well, many of us are driving for virtualization of machines to get simplicity in our deployments and leverage the investments better. This calls for massive scale servers and those servers are typically equipped with extensive multi-core processors. However, these are typically not running at the same high clock-frequencies as those with less cores (no over-clocking, turbo, &hellip;). With the compile time being very connected to the clock frequency, these servers will yield worse compile times than many laptops, despite their sophistication in architecture, scalability and IO. In essence, they are massive, but slow. With AX2012RTM and R2, there&rsquo;s a good reason to think of this when creating your build machine. Small and nimble still beats big and slow.</p>
<p>One problem remains &ndash; the compile necessary when shipping models to other environments. With the freedom of not having to deal with element IDs between vendors came a need to compile in the scenarios where we add new/changed models to an environment. If that happens on a server-grade machine (with slower cores) and with multiple tiers involved, we&rsquo;re back at paying the big price for the compile. The recommendation here is to leverage the customer test system instead of the production system and ensure that the test system supports as close to &ldquo;1-box&rdquo; setup for the particular task of compiling the application after model install. Then when the test system is compiled (faster than the production system could do it), the whole model store is moved to the production system, which would also allow for very quick switch over to the new application. The ALM papers for AX2012 describe staging in quite some details on how to baseline systems to allow all this.</p>
<p>While all these tips can bring down compile time for many, they are not the end of the story. We continue our work to improve this and ensure that we can provide as much efficiency as possible, through new tools, instructions and product fixes and changes. We will need a way to handle the ever growing code base in a productive way. As a side note to those working with R2, we&rsquo;ve lately identified the cause for a quite significant degradation of compile performance for R2, which is going to be addressed by a hotfix being made available within the next very few weeks. And the work continues on.</p>
<p>A few white papers that might be of interest in this context:</p>
<p>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Change management and TFS integration for multi-developer projects:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://technet.microsoft.com/EN-US/library/jj713631.aspx">https://technet.microsoft.com/EN-US/library/jj713631.aspx</a></p>
<p>2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Deploying Customizations Across Microsoft Dynamics AX 2012 Environments:</p>
<p style="padding-left: 60px;"><a href="https://technet.microsoft.com/EN-US/library/hh292604.aspx">https://technet.microsoft.com/EN-US/library/hh292604.aspx</a></p>
<p>Feel free to share your own tuning results here as comments.</p>
<p>&nbsp;</p>
<p>Jakob on behalf of the X++ compiler team.</p>]]></content:encoded>
    </item>
    <item>
      <title>CombineXPOs - new version - official beta has started</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/combinexpos-new-version-official-beta-has-started</link>
      <pubDate>Fri, 29 Jun 2012 12:51:11 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2012/06/29/combinexpos-new-version-official-beta-has-started/</guid>
      <description><![CDATA[Those who have worked to establish an automated build for a larger AX app have likely used or...]]></description>
      <content:encoded><![CDATA[<p>Those who have worked to establish an automated build for a larger AX app have likely used or experimented with CombineXPOs.exe - a nifty tool for stitching a number of XPO files into one single, optimized XPO. Recognizing the importance and value of this tool, we're been working on making a new version of it available to you all.</p>
<p>Amongst the most significant improvements are:</p>
<ol>
<li>Performance - leveraging the x64 architecture and multi-threading, we get 40-50% improvements in execution time.</li>
<li>Better optimization of the sequencing for EDTs, Queries and Views, making the import faster.</li>
</ol>
<p>We'll be writing more about using CombineXPOs later, but for now you can get the beta version of the "Microsoft Dynamics AX2012 Combine XPO Tool" here:</p>
<p><span style="font-family: 'Calibri','sans-serif'; font-size: 11pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"><a href="https://informationsource.dynamics.com/RFPServicesOnline/Rfpservicesonline.aspx?ToolName=Microsoft+Dynamics+AX+2012+Combine+XPO+Tool+Beta+1.0">https://informationsource.dynamics.com//RFPServicesOnline/Rfpservicesonline.aspx?ToolName=Microsoft+Dynamics+AX+2012+Combine+XPO+Tool+Beta+1.0</a></span></p>
<p><span style="font-family: 'Calibri','sans-serif'; font-size: 11pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"></span>&nbsp;</p>
<p><span style="font-family: 'Calibri','sans-serif'; font-size: 11pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;"></span>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Let's compile the thing!</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/lets-compile-the-thing</link>
      <pubDate>Mon, 02 Apr 2012 11:13:00 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2012/04/02/lets-compile-the-thing/</guid>
      <description><![CDATA[By Jakob Steen Hansen, Development Manager, Dynamics AX Developer Tools and Business...]]></description>
      <content:encoded><![CDATA[<p><span style="font-size: x-small;"><em> By Jakob Steen Hansen, Development Manager, Dynamics AX Developer Tools and Business Intelligence.</em></span></p>
<p>One thing that can only be underestimated is the value of having a <em>heartbeat</em> for your product. The heartbeat provides a regular rhythm to your engineering process, ensuring that the state of the product is well-known on an ongoing basis. A heartbeat consists of many different parts, the build process being one of the most prominent ones. When working with AX, how are you going to get this heartbeat? It all depends on how advanced your engineering practices are.</p>
<p>In this blog post and some to follow, I&rsquo;ll talk about the purpose of a heartbeat and show how to establishing various levels of automation, including a <i>nightly build</i> and tools/techniques we can use to optimize the engineering system when we have a nightly build. My examples are going to be focused on AX 2012, but many of them apply to AX 2009 with little or no change.</p>
<p>Let&rsquo;s look into the specifics for the two extremes of engineering systems I see used:</p>
<ol>
<li>Opportunistic shared one box development &ndash; one or more developers share AOS and database. What is on this shared machine defines the product at any given time.</li>
<li>True distributed development &ndash; external version control system as your universal truth and every developer has their own local setup.</li>
</ol>
<p>For (1), the basic heartbeat is making sure that what you have is in the right shape. When I say shape in this context, it&rsquo;s typically fundamentals like &ldquo;does it compile?&rdquo; &ldquo;Are we consistent with the best practices?&rdquo; Sometimes it extends into &ldquo;do our unit tests pass?&rdquo; Multiple people working real time on a shared server will leave us with a frequent consistency issue. A heartbeat for such a system will likely have to be timed to the project schedule as the system will be in a more or less broken state for parts of the development as someone will always be working on something new and unfinished. The value of a daily run depends largely on the ability the team has to filter noise from true failures. We&rsquo;re going to look at the individual tools necessary to orchestrate the automation, but we cannot generally solve for the ad hoc nature of this kind of concurrent engineering.</p>
<p>For (2) it&rsquo;s a somewhat more formal process, ensuring that what we have under version control will actually turn into a product when we put it all together. It is also a process that has the potential to deliver output to streamline the daily system setup for development and test.</p>
<p>There are no specific requirements around the frequency of the heartbeat &ndash; as with many things in life it&rsquo;s about balance. Don&rsquo;t go overboard with too high a frequency as you will probably spend too much time maintaining a system that will not provide enough value back iteration by iteration. Don&rsquo;t make frequency too low either as issues will accumulate (snowball) and you will only realize when you&rsquo;re already in too deep. A daily heartbeat &ndash; typically referred to as &ldquo;the nightly build&rdquo; - can satisfy most.</p>
<p>Before venturing into the details, I&rsquo;d like to run down a practice that I consider <i>non-negotiable</i> for a successful heartbeat:</p>
<p><b><i>The product builds cleanly</i>.</b> While we can have large arguments about whether a certain class really needs to compile when the customer is not using that functionality, it&rsquo;s just a dead end conversation. It is only going to be more costly in the future if you have<br />broken code sitting around. If you have part of the code base you don&rsquo;t want to deal with <i>functionally</i>, you should do what it takes to make it compile and make sure it throws an exception if ever called anyway. Go ahead and comment out offending code you don&rsquo;t want to fix up, but make sure it compiles and make sure that even if someone else changes the system to call this code (trust me &ndash; happens too often), it will fail visibly and with good diagnostics. This includes all test assets in the product by the way, so since you&rsquo;re adding unit tests (wink-wink), these need to compile cleanly too!</p>
<p>Then there&rsquo;s a set of practices, which I favor, but where your individual approach will have to weigh in:</p>
<p style="padding-left: 30px;"><b><i>Unit tests execute successfully. </i></b>At least they need to execute and when you&rsquo;re really at it, they should be successful.</p>
<p style="padding-left: 30px;"><b><i>Code is well written and complete.</i></b> Ensure that best practice tools are leveraged to maintain high code quality. With a well-established heartbeat you might even introduce a set of rules that you apply after the fact to increase your due diligence, but where you don&rsquo;t want to burden every developer with them as they do the change. These <i>baby-sitter tasks</i> are a great source of quality improvements when you have an automated engineering system.</p>
<p>Enough said - now let's get to it! The first level of automation we&rsquo;ll look into is the compile. This is helpful regardless whether you&rsquo;re running on a shared environment or on your own. The main purpose is to ensure that we know the syntactical state of the application. Typically, this is what you do by choosing compile from the AOT root node, but for automation purposes, this process can be executed from the command line using the following command:</p>
<p align="center"><span style="font-family: courier new,courier;">ax32.exe -startupcmd=compileall -development</span></p>
<p>By adding -development, we save a few cycles otherwise used to setup the application workspace, main menu etc. In the big picture it&rsquo;s not much of a difference, but no reason not to take it. As the compile process is extensive and takes a good while to complete, we want to cut all the excess we can. Ensuring that you&rsquo;ve disabled VCS (if using a file based one) is another way of saving some time during compile. At some point, I'll post about what can be done with respect to the hardware and configuration to generally optimize the execution. To give a sense of what&rsquo;s to expect, a full compile with warning level 3 set in development options and an application that is about 20% larger than SYS alone, takes around 4 hours to complete on a Hyper-V VM &nbsp;configured with 2 cores/6GB/one virtual disk on an aging 2.3GHz XEON workstation with 7200 rpm SATA-3 disks. This is not a very sophisticated setup (no RAID, no ultra-fast disks, tons of memory, etc.), so there&rsquo;s quite some headroom for improving the times. As comparison, a top of the line server can accomplish this in less than 40 minutes due to its efficient I/O system. But unfortunately that&rsquo;s not the box under my desk&hellip;</p>
<p>When the process completes, it will have written a log file with the results of the compilation. The log file can be found here:</p>
<p align="center"><span style="font-family: courier new,courier;">"%userprofile%\Microsoft\Dynamics AX\Log\AxCompileAll.html"</span></p>
<p>The log file will list errors, warnings and best practice deviations. By creating a simple cmd file with the command, it can be executed at given scheduled intervals. There are many obvious additions to this basic script. As an example, you could copy the log file to some archive directory adding the current date to have a history of logs. Or you could send off the result as email to yourself or to the team. Also, only a little magic is needed to decipher the actual result of the build from the build log and paint the mail red or green depending on the result. Once you have the basic script going, you&rsquo;ll quickly find ways to improve your engineering automation.</p>
<p>With this simple automation we've established the basic heartbeat of our application development. Many other parts are needed to complete the picture. I&rsquo;ll share some insights on those in later posts.</p>
<p><em></em>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Convergence 2012 Houston is winding down</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/convergence-2012-houston-is-winding-down</link>
      <pubDate>Wed, 21 Mar 2012 12:24:00 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2012/03/21/convergence-2012-houston-is-winding-down/</guid>
      <description><![CDATA[After some great sessions with customers and partners, a lot of engaging discussions, exchange of...]]></description>
      <content:encoded><![CDATA[<p>After some great sessions with customers and partners, a lot of engaging discussions, exchange of ideas and solving problems, we&rsquo;re now slowly winding down in Houston. It was energizing to see all the passion and commitment across the board.</p>
<p>While this blog has been sleeping for quite a while, the topics discussed these last few days have called for a revival. With the conference behind us, we&rsquo;ll get going on tips, tricks and links to help deal with the complexities of building quality applications and managing the development cycle and environment.</p>
<p>Also, once again, thanks for the huge contribution from everyone attending our sessions and taking the time to talk to us in the breaks.</p>
<p>On behalf of the AX Tools folks.</p>
<p>Jakob</p>]]></content:encoded>
    </item>
    <item>
      <title>The next version of Microsoft Dynamics AX will be launched in 2011</title>
      <link>https://docs.microsoft.com/archive/blogs/axtools/the-next-version-of-microsoft-dynamics-ax-will-be-launched-in-2011</link>
      <pubDate>Fri, 17 Sep 2010 02:23:53 GMT</pubDate>
      <dc:creator><![CDATA[axtools]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/axtools/2010/09/17/the-next-version-of-microsoft-dynamics-ax-will-be-launched-in-2011/</guid>
      <description><![CDATA[But you can jumpstart your product and technology learning and planning by attending three days of...]]></description>
      <content:encoded><![CDATA[<p></p>  <p>But you can jumpstart your product and technology learning and planning by attending three days of deep technical content delivered by Microsoft leaders and technology experts. This is your chance to learn, get inspired, and see how Microsoft Dynamics AX can help you provide innovative solutions for your business.</p>  <p><a href="https://www.microsoft.com/dynamics/DynamicsAXtechnicalconference2011">https://www.microsoft.com/dynamics/DynamicsAXtechnicalconference2011</a></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/34/69/metablogapi/7245.image_4AA9E20A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-34-69-metablogapi/7245.image_5F00_4AA9E20A.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/34/69/metablogapi/8284.image_thumb_06758C8C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-34-69-metablogapi/8284.image_5F00_thumb_5F00_06758C8C.png" width="616" height="213" /></a> </p>  <p><strong>Who will attend?</strong></p>  <ul>   <li>Developers building and implementing solutions on Microsoft Dynamics AX. Understand how you can be more productive and provide innovative vertical solutions. Understand the philosophy behind the model-driven design and the service-based architecture built on the foundation provided by the Microsoft .NET Framework. </li>    <li>Technical Implementation Consultants can learn about the simplification of the deployment architecture, and integration with the Microsoft platform components like Microsoft SharePoint 2010, Microsoft SQL Server 2008 R2, Microsoft Visual Studio 2010, and Microsoft Office 2010. </li>    <li>Functional Implementation Consultants can get a jumpstart on the massive innovation and expansion of horizontal and industry functionality. </li>    <li>Customers can benefit by understanding the evolution of the technology and functionality and can plan their upgrade. </li> </ul>  <p><b>The event is on the Redmond campus, running from January 17 through January 20, 2011.</b></p>  <p><strong>Why should you attend?</strong></p>  <ul>   <li>Get hands-on experience with the upcoming release of Microsoft Dynamics AX. </li>    <li>Talk directly to the team building the product. </li>    <li>Network and learn from other partners and customers to plan your upgrade. </li>    <li>Get a pre-release version to continue your learning and development when you get back to the office. </li> </ul>  <p>The new Microsoft Dynamics AX adheres to the needs of your people and the demands of your industry.</p>  <p>Join our community. Learn. Inspire. Innovate.</p>]]></content:encoded>
    </item>
  </channel>
</rss>