<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3546795444588179926</id><updated>2026-05-18T16:52:52.057-07:00</updated><category term="dynamics ax 2009"/><category term="axapta"/><category term="x++"/><category term="AX7"/><category term="D365"/><category term="DAX"/><category term="Facebook"/><category term="React"/><category term="React with Addons"/><category term="address"/><category term="aot"/><category term="ax 2009"/><category term="d3fo"/><category term="dimensions"/><category term="recursion"/><category term="vpc"/><category term="AX 2012"/><category term="AX 2012 Upgrade"/><category term="LedgerJournalEngine"/><category term="LedgerJournalTrans"/><category term="alerts"/><category term="change form background color"/><category term="classfactory"/><category term="containers"/><category term="customer party type change"/><category term="dialog"/><category term="dirpartytable"/><category term="dual boot"/><category term="dynamics ax 2012"/><category term="email"/><category term="email framework"/><category term="email templates"/><category term="enterprise portal"/><category term="ep"/><category term="financial dimension wizard"/><category term="formrun"/><category term="global address book"/><category term="intellimorph"/><category term="job"/><category term="license keys"/><category term="merge"/><category term="modal"/><category term="nested containers"/><category term="projectnode"/><category term="reflection"/><category term="refresh 3.5"/><category term="refresh 4"/><category term="security"/><category term="sharepoint"/><category term="syslastvalue"/><category term="templates"/><category term="tree form control"/><category term="treenode"/><category term="usage data"/><category term="userconnection"/><category term="xpo"/><category term="xrecord"/><category term="zip codes"/><category term="zipcode"/><title type='text'>Alex on DAX (Alex Kwitny)</title><subtitle type='html'>This technical blog will be about my adventures with Microsoft Dynamics 365 for Operations (AX7/D3fo), AX 2012, and AX 2009.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.alexondax.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>82</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-7986299466830597739</id><published>2019-05-09T10:26:00.000-07:00</published><updated>2019-05-09T10:26:09.947-07:00</updated><title type='text'>Print statement in D365 and other interesting bits</title><content type='html'>We all know the &quot;print&quot; statement, but what I find interesting is in Dynamics 365 for Finance and Operations, Enterprise Edition, it has been changed.&lt;br /&gt;
&lt;br /&gt;
It works the same, but it now uses System.Diagnostics.Debug::WriteLine(&quot;Hello World&quot;) to print to the output window.&lt;br /&gt;
&lt;br /&gt;
You can read more about it and other interesting debugger features here:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://docs.microsoft.com/en-us/dynamics365/unified-operations/dev-itpro/dev-tools/new-x-debugger-features&quot;&gt;https://docs.microsoft.com/en-us/dynamics365/unified-operations/dev-itpro/dev-tools/new-x-debugger-features&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/7986299466830597739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2019/05/print-statement-in-d365-and-other.html#comment-form' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/7986299466830597739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/7986299466830597739'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2019/05/print-statement-in-d365-and-other.html' title='Print statement in D365 and other interesting bits'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-2556286044061560289</id><published>2018-10-23T10:03:00.000-07:00</published><updated>2018-10-23T10:03:03.355-07:00</updated><title type='text'>Fun and better method to get Args.Caller() name</title><content type='html'>In any AX/D365 environment, there&#39;s often a need to get the Args.Caller().Name(), except not all possible caller&#39;s will have a .name() method, so here&#39;s a little function that can be added to a form to get the caller&#39;s name in a more proper method.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;private&lt;/span&gt; IdentifierName &lt;span style=&quot;color: #0066BB; font-weight: bold&quot;&gt;getCallerName&lt;/span&gt;()
{
    Object              caller;
    SysDictClass        sysDictClass;
    IdentifierName      callerName;

    &lt;span style=&quot;color: #888888&quot;&gt;// There must be a caller to retrieve a name&lt;/span&gt;
    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;if&lt;/span&gt; (!(element.args() &amp;amp;&amp;amp; element.args().caller()))
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;return&lt;/span&gt; callerName;

    caller          = element.args().caller();
    sysDictClass    = &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;new&lt;/span&gt; SysDictClass(classIdGet(caller));

    &lt;span style=&quot;color: #888888&quot;&gt;// Use reflection &amp;amp; recursion to get the name if possible&lt;/span&gt;
    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;while&lt;/span&gt; (sysDictClass)
    {
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;if&lt;/span&gt; (sysDictClass.hasObjectMethod(identifierStr(Name)))
        {
            callerName      = caller.name();
            sysDictClass    = &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;null&lt;/span&gt;;
        }
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0066BB; font-weight: bold&quot;&gt;if&lt;/span&gt; (sysDictClass.extend())
        {
            sysDictClass    = &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;new&lt;/span&gt; sysDictClass(sysDictClass.extend());
        }
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;else&lt;/span&gt;
        {
            sysDictClass    = &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;null&lt;/span&gt;;
        }
    }

    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;return&lt;/span&gt; callerName;
}
&lt;/pre&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/2556286044061560289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2018/10/fun-and-better-method-to-get-argscaller.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2556286044061560289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2556286044061560289'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2018/10/fun-and-better-method-to-get-argscaller.html' title='Fun and better method to get Args.Caller() name'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-8585018804836663280</id><published>2018-04-24T07:40:00.002-07:00</published><updated>2018-04-24T08:43:04.237-07:00</updated><title type='text'>How to convert a decimal to a fraction in X++ with Dynamics AX or Dynamics 365 FO</title><content type='html'>I had a customer who needed to convert a decimal to fraction, so I just translated this &lt;a href=&quot;https://stackoverflow.com/questions/5124743/algorithm-for-simplifying-decimal-to-fractions/32903747#32903747&quot; target=&quot;_blank&quot;&gt;StackOverflow post&lt;/a&gt;&amp;nbsp;where all credit is due. I&#39;m sure someone else will find it useful at some point.&lt;br /&gt;
&lt;br /&gt;
The two main things in the job below (details taken from StackOverflow) are &quot;_real&quot;, which is the value you want to convert, and &quot;_accuracy&quot;, which specifies the max relative error; not the max absolute error.&lt;br /&gt;
&lt;br /&gt;
So _accuracy = 0.01 would find a fraction within 1% of the value.&lt;br /&gt;
&lt;br /&gt;
I also quickly threw this job together, so I didn&#39;t test for extremely large integers or any edge cases.&lt;br /&gt;
&lt;br /&gt;
Here&#39;s a simple job that demonstrates how it works.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;KW_DecToFrac&lt;/span&gt;(Args _args)
{
    &lt;span style=&quot;color: #888888;&quot;&gt;// Create a function that accepts these two parameters&lt;/span&gt;
    real                _real           = &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;0.45&lt;/span&gt;;
    real                _accuracy       = &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;0.01&lt;/span&gt;;
    
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt;                 sign = _real &amp;lt; &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;0&lt;/span&gt; ? -&lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;1&lt;/span&gt; : (_real == &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;0&lt;/span&gt; ? &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;0&lt;/span&gt; : &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;1&lt;/span&gt;);
    real                maxError;
    System.Decimal      d;
    
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; n;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; lower_n = &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;0&lt;/span&gt;;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; lower_d = &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;1&lt;/span&gt;;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; middle_n;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; middle_d;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; upper_n = &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;1&lt;/span&gt;;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; upper_d = &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;1&lt;/span&gt;;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; z;
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;f&lt;/span&gt;(&lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; _N, &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; _D)
    {
        info(strFmt(&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;%1/%2&quot;&lt;/span&gt;, _N, _D));
    }
    
    _real = abs(_real);
    
    maxError = sign == &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;0&lt;/span&gt; ? _accuracy : _real * _accuracy;
    
    d = System.Math::Floor(_real);
    n = System.Decimal::ToInt32(d);
    
    _real -= n;
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt; (_real &amp;lt; maxError)
    {
        f(sign * n, &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;1&lt;/span&gt;);
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;return&lt;/span&gt;;
    }
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;1&lt;/span&gt; - maxError &amp;lt; _real)
    {
        f(sign * (n+&lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;1&lt;/span&gt;), &lt;span style=&quot;color: #6600ee; font-weight: bold;&quot;&gt;1&lt;/span&gt;);
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;return&lt;/span&gt;;
    }
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;while&lt;/span&gt; (&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;true&lt;/span&gt;)
    {
        z++;
        middle_n = lower_n + upper_n;
        middle_d = lower_d + upper_d;
        
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt; (middle_d * (_real + maxError) &amp;lt; middle_n)
        {
            upper_n = middle_n;
            upper_d = middle_d;
        }
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;if&lt;/span&gt; (middle_n &amp;lt; (_real - maxError) * middle_d)
        {
            lower_n = middle_n;
            lower_d = middle_d;
        }
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;else&lt;/span&gt;          
        {
            f((n * middle_d + middle_n) * sign, middle_d);
            &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;return&lt;/span&gt;;
        }        
    }
    
    info(&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Done&quot;&lt;/span&gt;);
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/8585018804836663280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2018/04/how-to-convert-decimal-to-fraction-in-x.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/8585018804836663280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/8585018804836663280'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2018/04/how-to-convert-decimal-to-fraction-in-x.html' title='How to convert a decimal to a fraction in X++ with Dynamics AX or Dynamics 365 FO'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-2922459785741092</id><published>2018-04-04T15:00:00.000-07:00</published><updated>2018-04-04T15:00:21.556-07:00</updated><title type='text'>[#MsDyn365FO] How to adjust your DeployablePackages cleanup duration</title><content type='html'>Microsoft automatically cleans up the &quot;DeployablePackages&quot; folder for data older than 30 days on your Dynamics 365 for Finance and Operations, Enterprise Edition machine if you are using the LCS servicing flows.&lt;br /&gt;
&lt;br /&gt;
If you prefer to keep less data, such as 10 days, you can add the following registry key to&amp;nbsp;&lt;span style=&quot;background-color: #edeff2; color: #343a41; font-family: &amp;quot;segoe ui westeuropean&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , , &amp;quot;blinkmacsystemfont&amp;quot; , &amp;quot;roboto&amp;quot; , &amp;quot;helvetica neue&amp;quot; , sans-serif; font-size: 15px;&quot;&gt;HKLM:\SOFTWARE\Microsoft\Dynamics\Deployment&lt;/span&gt; :&lt;br /&gt;
&lt;span style=&quot;background-color: #edeff2; color: #343a41; font-family: &amp;quot;segoe ui westeuropean&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , , &amp;quot;blinkmacsystemfont&amp;quot; , &amp;quot;roboto&amp;quot; , &amp;quot;helvetica neue&amp;quot; , sans-serif; font-size: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvrfHD1ZrbGxRvRDQmpYHxvfFpjP2vyaI-GV0XmIl94cBO1jone8PtGW4ETQkpF0qHOHkXsamCkZWu7yI2hRKk9b44MooKfDE33dP2WO1p-qpGVwuNU4na0ntwzf_SbLdrSQ6UfVzj8pyy/s1600/2018-04-04_14-55-57.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;107&quot; data-original-width=&quot;545&quot; height=&quot;123&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvrfHD1ZrbGxRvRDQmpYHxvfFpjP2vyaI-GV0XmIl94cBO1jone8PtGW4ETQkpF0qHOHkXsamCkZWu7yI2hRKk9b44MooKfDE33dP2WO1p-qpGVwuNU4na0ntwzf_SbLdrSQ6UfVzj8pyy/s640/2018-04-04_14-55-57.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: #edeff2; color: #343a41; font-family: &amp;quot;segoe ui westeuropean&amp;quot; , &amp;quot;segoe ui&amp;quot; , &amp;quot;segoe ui emoji&amp;quot; , , &amp;quot;blinkmacsystemfont&amp;quot; , &amp;quot;roboto&amp;quot; , &amp;quot;helvetica neue&amp;quot; , sans-serif; font-size: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
Or copy &amp;amp; paste the below into a *.reg file, and you can add it that way:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;Windows Registry Editor Version 5.00

&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #007020;&quot;&gt;HKEY_LOCAL_MACHINE&lt;/span&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;\SOFTWARE\Microsoft\Dynamics\Deployment]&lt;/span&gt;
&lt;span style=&quot;color: #0000cc;&quot;&gt;&quot;CutoffDaysForCleanup&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;10&quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
See Yammer thread&amp;nbsp;&lt;a href=&quot;https://www.yammer.com/dynamicsaxfeedbackprograms/threads/1031302928&quot; target=&quot;_blank&quot;&gt;here &lt;/a&gt;for Microsoft&#39;s comments.</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/2922459785741092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2018/04/msdyn365fo-how-to-adjust-your.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2922459785741092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2922459785741092'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2018/04/msdyn365fo-how-to-adjust-your.html' title='[#MsDyn365FO] How to adjust your DeployablePackages cleanup duration'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvrfHD1ZrbGxRvRDQmpYHxvfFpjP2vyaI-GV0XmIl94cBO1jone8PtGW4ETQkpF0qHOHkXsamCkZWu7yI2hRKk9b44MooKfDE33dP2WO1p-qpGVwuNU4na0ntwzf_SbLdrSQ6UfVzj8pyy/s72-c/2018-04-04_14-55-57.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-9187310767358649184</id><published>2018-01-02T12:26:00.000-07:00</published><updated>2018-01-02T12:26:27.539-07:00</updated><title type='text'>How to see when AOS service was started/stopped with PowerShell for AX with 1 line of code.</title><content type='html'>I often need to see when an AOS was stopped for various reasons, and scanning the event viewer can be a hassle. Running this simple 1-line PowerShell script will give you that information.&lt;br /&gt;
&lt;br /&gt;
You can also use this script as a guide to run other PowerShell scripts to search the event log for specific text.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Get-WinEvent -ErrorAction SilentlyContinue -FilterHashtable @{logname=&#39;system&#39;; StartTime=(((get-date).AddDays(-30).Date)); EndTime=(((get-date).AddDays(1).Date)); id=7036} -MaxEvents 10000 | ? {$_.Message -like &#39;*Microsoft Dynamics AX Object Server*&#39;}&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz3HBRuptTBkg-UhoCycQK6w74JL_IExuVYD1GeUkjM0YltzyyYRShkI-np9E5qyw6H65RnIkx4N_txQR3gjV-eUTAr347Utyevb6fyDapyd2Mo1u3fa1HXOZpny08NhpEn3eE8puvZh3i/s1600/Powershell.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;262&quot; data-original-width=&quot;1600&quot; height=&quot;104&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz3HBRuptTBkg-UhoCycQK6w74JL_IExuVYD1GeUkjM0YltzyyYRShkI-np9E5qyw6H65RnIkx4N_txQR3gjV-eUTAr347Utyevb6fyDapyd2Mo1u3fa1HXOZpny08NhpEn3eE8puvZh3i/s640/Powershell.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/9187310767358649184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2018/01/how-to-see-when-aos-service-was.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/9187310767358649184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/9187310767358649184'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2018/01/how-to-see-when-aos-service-was.html' title='How to see when AOS service was started/stopped with PowerShell for AX with 1 line of code.'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz3HBRuptTBkg-UhoCycQK6w74JL_IExuVYD1GeUkjM0YltzyyYRShkI-np9E5qyw6H65RnIkx4N_txQR3gjV-eUTAr347Utyevb6fyDapyd2Mo1u3fa1HXOZpny08NhpEn3eE8puvZh3i/s72-c/Powershell.png" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-1159988112249923685</id><published>2017-08-22T13:41:00.000-07:00</published><updated>2017-08-22T13:43:27.768-07:00</updated><title type='text'>Job to export AX 2012 label file in Dynamics 365 FOEE format for easy movement</title><content type='html'>I am maintaining an ISV solution across AX 2012 and Dynamics 365 for Finance and Operations, Enterprise Edition, and when there is development in one, porting those changes to the other can be a hassle.&lt;br /&gt;
&lt;br /&gt;
If I create a label in Dynamics AX 2012, exactly creating it in D365 isn&#39;t straight forward/simple.&lt;br /&gt;
&lt;br /&gt;
I quickly wrote this simple job to export a label to a format that can be easily imported into Dynamics 365. I simply looked at how D365 label text is stored and inferred this, so I haven&#39;t done extensive testing, but it seems to work fine for several hundred labels when comparing via WinMerge what my job outputs vs what D365 contains.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; AlexOnDaxExportLabelToD365(Args _args)
{  
    #File
    str                         labelFileId         = &lt;span class=&quot;str&quot;&gt;&#39;QUA&#39;&lt;/span&gt;;
    str                         language            = &lt;span class=&quot;str&quot;&gt;&#39;en-us&#39;&lt;/span&gt;;
    Filename                    labelFilenameD365   = @&lt;span class=&quot;str&quot;&gt;&#39;C:\Temp\AlexLabel.label.txt&#39;&lt;/span&gt;;
    
    LabelId                     labelId;
    LabelString                 labelString;
    LabelDescription            labelDescription;
    
    Set                         setLabelIds;
    SetEnumerator               se;
    
    SysLabelFileReader          labelFileReader;
    TextIo                      textIo;
    
    SysLabelFile                labelFile = SysLabelFile::newLanguageModule(language, labelFileId);
    
    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!Label::flush(labelFileId, language))
        &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; error(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;Unable to flush label %1 in language %2&quot;&lt;/span&gt;, labelFileId, language));
    
    &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; FileIOPermission(labelFilenameD365, &lt;span class=&quot;str&quot;&gt;&#39;W&#39;&lt;/span&gt;).assert();
    
    &lt;span class=&quot;rem&quot;&gt;// This just create the file if it doesn&#39;t exist&lt;/span&gt;
    textIo = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TextIo(labelFilenameD365, #IO_Write, #utf8Format);
    textIo.write(&lt;span class=&quot;str&quot;&gt;&#39;&#39;&lt;/span&gt;);
    textIo = &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;;

    &lt;span class=&quot;rem&quot;&gt;// We output the file somewhere  &lt;/span&gt;
    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (labelFile.toFile(labelFilenameD365, &lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;))
    {
        labelFileReader = SysLabelFileReader::newFileClient(labelFilenameD365);

        &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (labelFileReader)
        {
            setLabelIds = labelFileReader.labelIds();
        }
    }
    
    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!(setLabelIds &amp;amp;&amp;amp; labelFileReader))
        &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; error(&lt;span class=&quot;str&quot;&gt;&quot;Unable to get label&quot;&lt;/span&gt;);
    
    textIo = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TextIo(labelFilenameD365, #IO_Write, #utf8Format);
    
    se = setLabelIds.getEnumerator();
    
    while (se.moveNext())
    {
        labelId             = se.current();
        labelString         = labelFileReader.labelText(labelId);
        labelDescription    = labelFileReader.labelDescription(labelId);
        
        &lt;span class=&quot;rem&quot;&gt;// There must be a value&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!labelString)
            labelString = &lt;span class=&quot;str&quot;&gt;&#39; &#39;&lt;/span&gt;;
        
        &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (labelDescription)
            textIo.write(labelId + &lt;span class=&quot;str&quot;&gt;&#39;=&#39;&lt;/span&gt; + labelString + &lt;span class=&quot;str&quot;&gt;&#39;\n&#39;&lt;/span&gt; + &lt;span class=&quot;str&quot;&gt;&#39; ;&#39;&lt;/span&gt; + labelDescription);
        &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
            textIo.write(labelId + &lt;span class=&quot;str&quot;&gt;&#39;=&#39;&lt;/span&gt; + labelString);
    }
    
    textIo.write(&lt;span class=&quot;str&quot;&gt;&#39;&#39;&lt;/span&gt;); &lt;span class=&quot;rem&quot;&gt;// Write ending CR&lt;/span&gt;
    textIo = &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;;
        
    CodeAccessPermission::revertAssert(); 
    
    info(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;Finished converting %1 to Dynamics 365 for Operations label file&quot;&lt;/span&gt;, labelFilenameD365));
}&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/1159988112249923685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2017/08/job-to-export-ax-2012-label-file-in.html#comment-form' title='190 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/1159988112249923685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/1159988112249923685'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2017/08/job-to-export-ax-2012-label-file-in.html' title='Job to export AX 2012 label file in Dynamics 365 FOEE format for easy movement'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>190</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-4635688464037347106</id><published>2017-08-16T11:58:00.000-07:00</published><updated>2017-08-16T11:58:46.328-07:00</updated><title type='text'>How to find previously used addresses or other older records in Valid Time State Tables for Date Effective Data in Microsoft Dynamics 365 or AX</title><content type='html'>In Dynamics (AX/365) there is a concept of &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/gg861781.aspx&quot; target=&quot;_blank&quot;&gt;&quot;Valid Time State Tables&quot; that contain date effective data&lt;/a&gt;. &amp;nbsp;In this post, you&#39;ll find code to list all the previous addresses tied to an individual record.&lt;br /&gt;
&lt;br /&gt;
If you are not familiar with this type of data, the simplest example to wrap your head around is postal addresses. If you are, just skip the next paragraph.&lt;br /&gt;
&lt;br /&gt;
Let&#39;s say you send an order/invoice to a customer at &lt;b&gt;123 South St&lt;/b&gt; on 1/1/2017. Then a few months later, the customer moves locations to &lt;b&gt;456 North Ave&lt;/b&gt;&amp;nbsp;and you update their address in Dynamics. All is good so far. Then for some reason you need to reprint the 1/1/2017 invoice...well that address record for &lt;b&gt;123 South St&lt;/b&gt;&amp;nbsp;still exists in the database, but it&#39;s &quot;ValidTo&quot; is in the past. This way you have the historical addresses.&lt;br /&gt;
&lt;br /&gt;
This sample job below takes an address and loops through the older versions of that address. This method can be used to seek any data in valid time state tables though.&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;
&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; AlexOnDAXFindOldAddresses(Args _args)
{
    CustTable                       custTable = CustTable::find(&lt;span class=&quot;str&quot;&gt;&quot;ZZZZ&quot;&lt;/span&gt;);
    LogisticsPostalAddress          logisticsPostalAddress;
    LogisticsPostalAddress          logisticsPostalAddressOld;
    utcDateTime                     utcMinVal = DateTimeUtil::minValue();
    utcDateTime                     utcMaxVal = DateTimeUtil::maxValue();
    
    &lt;span class=&quot;rem&quot;&gt;// Active address&lt;/span&gt;
    logisticsPostalAddress = CustTable.postalAddress();
    info(&lt;span class=&quot;str&quot;&gt;&quot;Current: &quot;&lt;/span&gt; + logisticsPostalAddress.Address);
    
    setPrefix(&lt;span class=&quot;str&quot;&gt;&quot;Previous Addresses&quot;&lt;/span&gt;);
    
    &lt;span class=&quot;rem&quot;&gt;// This will loop through the inactive addresses in order&lt;/span&gt;
    while select validTimeState(utcMinVal, utcMaxVal) logisticsPostalAddressOld
        order by ValidTo desc
        where logisticsPostalAddressOld.Location        == logisticsPostalAddress.Location      &amp;amp;&amp;amp;
              logisticsPostalAddressOld.RecId           != logisticsPostalAddress.RecId
    {
        info(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;%1 [%2-%3]&quot;&lt;/span&gt;,
                    logisticsPostalAddressOld.Address,
                    logisticsPostalAddressOld.ValidFrom,
                    logisticsPostalAddressOld.ValidTo));
    }
}&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1vnaPCbhs8MC5nBwqOSfYQ4V0Dv1aRuTHgGX8aiq_P7Su6XPR3XV5A4VswKKj9X5ON4cWkYB3Mh7UHAt9V8REACv0Z4kCcTRdAvYEEG1MBsgS-OCctDqN8DxwWvXwsAMNv0IGqZoZ8uq1/s1600/2017-08-16_11-56-42.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;211&quot; data-original-width=&quot;607&quot; height=&quot;222&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1vnaPCbhs8MC5nBwqOSfYQ4V0Dv1aRuTHgGX8aiq_P7Su6XPR3XV5A4VswKKj9X5ON4cWkYB3Mh7UHAt9V8REACv0Z4kCcTRdAvYEEG1MBsgS-OCctDqN8DxwWvXwsAMNv0IGqZoZ8uq1/s640/2017-08-16_11-56-42.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/4635688464037347106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2017/08/how-to-find-previously-used-addresses.html#comment-form' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/4635688464037347106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/4635688464037347106'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2017/08/how-to-find-previously-used-addresses.html' title='How to find previously used addresses or other older records in Valid Time State Tables for Date Effective Data in Microsoft Dynamics 365 or AX'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1vnaPCbhs8MC5nBwqOSfYQ4V0Dv1aRuTHgGX8aiq_P7Su6XPR3XV5A4VswKKj9X5ON4cWkYB3Mh7UHAt9V8REACv0Z4kCcTRdAvYEEG1MBsgS-OCctDqN8DxwWvXwsAMNv0IGqZoZ8uq1/s72-c/2017-08-16_11-56-42.png" height="72" width="72"/><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-248290743425667717</id><published>2017-05-26T12:08:00.000-07:00</published><updated>2017-05-26T12:13:57.282-07:00</updated><title type='text'>How to rename a D365 virtual machine, link it to LCS, and optionally join it to a domain - Dynamics 365 for Finance and Operations, Enterprise edition</title><content type='html'>Whenever I get a new D365 virtual machine, I need to rename it, link it to LCS, and join it to our domain. I kept forgetting what I did, so I wrote it down here to share.&lt;br /&gt;
&lt;br /&gt;
I rename it because there are multiple copies of the VM on the same network, and joining to a domain should be obvious all of the benefits there.&lt;br /&gt;
&lt;br /&gt;
So here are the steps that I perform to quickly do this, and if anyone has any other steps to add/modify, please let me know and I&#39;ll update the post. Follow carefully as each step is important.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Connect to the VM, provision yourself (as usual)&lt;/li&gt;
&lt;li&gt;Go to Control Panel&amp;gt;System and Security&amp;gt;Security, click &quot;Change Settings&quot;, and rename the machine to something unique.&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/3r2qPiE.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/3r2qPiE.jpg&quot; data-original-height=&quot;396&quot; data-original-width=&quot;800&quot; height=&quot;197&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Restart VM&lt;/li&gt;
&lt;li&gt;Open Reporting Services Configuration Manager and connect to &quot;localhost&quot; or whatever you named your machine, and change the Database server so that it connects&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/ndKnbKM.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/ndKnbKM.jpg&quot; data-original-height=&quot;516&quot; data-original-width=&quot;800&quot; height=&quot;257&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Open SQL Management Studio by doing &quot;&lt;b&gt;&lt;u style=&quot;background-color: yellow;&quot;&gt;Run As Administrator&lt;/u&gt;&lt;/b&gt;&quot;, as the Local Admins security group is added but not the local administrator user. &amp;nbsp;Connect to SQL.&lt;/li&gt;
&lt;li&gt;Run these commands to get the name SQL thinks it is and the name you&#39;ve used&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;select&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: magenta; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;@@SERVERNAME&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt; line-height: 107%;&quot;&gt;Select&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt; line-height: 107%;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: magenta; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt; line-height: 107%;&quot;&gt;serverproperty&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt; line-height: 107%;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: red; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt; line-height: 107%;&quot;&gt;&#39;ServerName&#39;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt; line-height: 107%;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/hYHHvar.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/hYHHvar.jpg&quot; data-original-height=&quot;253&quot; data-original-width=&quot;393&quot; height=&quot;257&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;
&lt;li&gt;Copy the old machine name and new machine name and replace it in these SQL commands and execute them&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;color: green; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;--Run
this with the updated names&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;color: maroon; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;sp_dropserver&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;&#39;MININT-S45GUTR&#39;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: green; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;--Old Name&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;GO&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;color: maroon; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;sp_addserver&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;&#39;D365QDEVMAIN&#39;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;LOCAL&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: green; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;--New Name&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;color: blue; font-family: &amp;quot;consolas&amp;quot;; font-size: 9.5pt;&quot;&gt;GO&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/6CUm3d4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/6CUm3d4.jpg&quot; data-original-height=&quot;175&quot; data-original-width=&quot;443&quot; height=&quot;157&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
Restart the machine&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
In SQL (run as admin), run the steps in &lt;b&gt;Step 6&lt;/b&gt;&amp;nbsp;again to verify both return the same new machine name result&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/KtbsthM.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/KtbsthM.jpg&quot; data-original-height=&quot;281&quot; data-original-width=&quot;415&quot; height=&quot;270&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) The following steps are the optional LCS/Domain steps. Create a project in LCS that your D365 for Operations (or whatever it&#39;s called at the time of reading this) VM will connect to.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Download the LCS diagnostic installer under the &quot;System Diagnostic&quot; tile&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/4G5NmI8.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/4G5NmI8.jpg&quot; data-original-height=&quot;417&quot; data-original-width=&quot;405&quot; height=&quot;320&quot; width=&quot;310&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Extract and run Setup. Choose &quot;Create a new certificate&quot; and enter whatever into the prefix. I usually just do the machine name.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) This creates a certificate in the same directory as the installer, upload the certificate back into LCS under the same tile, then continue with the installer after it has been uploaded.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/2u6RKmJ.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/2u6RKmJ.jpg&quot; data-original-height=&quot;441&quot; data-original-width=&quot;800&quot; height=&quot;352&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) For the account/password I put in MachineName\Administrator and the administrator password. If you choose to use the local admin, it&#39;s important that you type the newly created machine name you chose or it doesn&#39;t always work.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/DK0JW8m.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/DK0JW8m.jpg&quot; data-original-height=&quot;399&quot; data-original-width=&quot;517&quot; height=&quot;246&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) There should now be a new icon on your desktop to launch the LCS diagnostic utility. Run this.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Put in the environment name and server name with your newly chosen name and put &quot;AxDB&quot; for the database name. Then click the buttons at the bottom of the tool in sequence.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/G9rFyq4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/G9rFyq4.jpg&quot; data-original-height=&quot;800&quot; data-original-width=&quot;605&quot; height=&quot;400&quot; width=&quot;301&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) When you get to step #3, your window may white-out and clear. Just choose the drop-down at the top under &quot;Environment Name&quot; and re-select your environment&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Click &quot;Generate Command&quot; to get a copy/paste command that you can set up a scheduled task for so that LCS gets regular data. Copy the command and close the window. Mine was:&lt;br /&gt;
&lt;br /&gt;
&quot;C:\Program Files\Microsoft Dynamics Lifecycle Services System Diagnostic Service\LCSDiagFXCollector.exe&quot; &quot;-Collect&quot; &quot;D365QDEVMAIN&quot; &quot;1&quot;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Open &quot;Task Scheduler&quot; and create a new task and choose &quot;Run whether user is logged on or not&quot; and I choose &quot;Run with highest privileges&quot;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/Gtt5kf6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/Gtt5kf6.jpg&quot; data-original-height=&quot;607&quot; data-original-width=&quot;800&quot; height=&quot;302&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Choose the Triggers tab and setup a daily trigger (or whatever you want)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Choose the &quot;Actions&quot; tab, click New, and paste the entire command in the program/script window and click ok. It will prompt you to automatically fix it so just click yes.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/GK0Sn1V.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/GK0Sn1V.jpg&quot; data-original-height=&quot;675&quot; data-original-width=&quot;739&quot; height=&quot;292&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Click OK to save the task and enter your user/password so that it can store it to run the task&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Go back to LCS and under the same &quot;System Diagnostic&quot; tile, click on the &quot;Environments&quot; tab and verify your new environment is there and data is uploaded&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://imgur.com/HDr4G2S.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://imgur.com/HDr4G2S.jpg&quot; data-original-height=&quot;211&quot; data-original-width=&quot;800&quot; height=&quot;105&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;line-height: normal; margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
(Optional) Finally join it to your domain and restart.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
And you are done!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/248290743425667717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2017/05/what-i-do-to-rename-d365-virtual.html#comment-form' title='41 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/248290743425667717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/248290743425667717'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2017/05/what-i-do-to-rename-d365-virtual.html' title='How to rename a D365 virtual machine, link it to LCS, and optionally join it to a domain - Dynamics 365 for Finance and Operations, Enterprise edition'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>41</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-9000516568564084220</id><published>2017-05-18T10:40:00.002-07:00</published><updated>2017-05-18T10:40:36.777-07:00</updated><title type='text'>How to programmatically add menu items to favorites menu via X++ in Dynamics AX</title><content type='html'>The favorites menu is a bit unusual in AX in the way you need to add to it. Most of the way it works appears to be Kernel level, but through some TreeNode usage you can add items to it.&lt;br /&gt;
&lt;br /&gt;
This will add the &quot;SalesTable&quot; menu item to your favorites.&lt;br /&gt;
&lt;br /&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; JobAddToFavorites(Args _args)
{
    TreeNode                treeNode;
    TreeNode                menuToAdd = TreeNode::findNode(&lt;span class=&quot;str&quot;&gt;@&quot;\Menu Items\Display\SalesTable&quot;&lt;/span&gt;);
    TreeNodeIterator        iterator;
    UserMenuList            userMenu;
    Menu                    menuNode;


    treeNode = infolog.userNode();
    iterator = treeNode.AOTiterator();
    treeNode = iterator.next();
    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (treeNode)
    {
        userMenu = treeNode;

        &lt;span class=&quot;rem&quot;&gt;// find &#39;My Favorites&#39; user menu; &lt;/span&gt;
        treeNode = userMenu.AOTfindChild(&lt;span class=&quot;str&quot;&gt;&quot;@SYS95713&quot;&lt;/span&gt;);

        &lt;span class=&quot;rem&quot;&gt;// Note menuNode is a different object than userMenu&lt;/span&gt;
        menuNode = treeNode;

        menuNode.addMenuitem(menuToAdd);
    }    
}&lt;/pre&gt;
&lt;br /&gt;
Another table to take note of is SysPersonalization if you&#39;re looking at doing this for multiple users. I haven&#39;t dug into this deeply, but this code snippet should get you started with what you may want to do.</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/9000516568564084220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2017/05/how-to-programmatically-add-menu-items.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/9000516568564084220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/9000516568564084220'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2017/05/how-to-programmatically-add-menu-items.html' title='How to programmatically add menu items to favorites menu via X++ in Dynamics AX'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-7787180072931299296</id><published>2017-05-05T12:30:00.002-07:00</published><updated>2017-05-05T12:39:17.448-07:00</updated><title type='text'>How to remove the default filter controls on a ListPane in AX 2012</title><content type='html'>When you create a ListPage, the kernel automatically adds a FormFilterPaneControl with some filtering options. Many think this can&#39;t be removed or hidden, but it can!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4t2B0nml7an9SPrZqNvg2ccjiVO_MHG1sX1gqiGjDlz76pgu2gQvTH-HOcPs1FqoaNPNagL9woz_jYfmpgY67XIxaA2H14rhVaKR6kGvvjqwlMqTINcAqS1VN6fNo-YluCtFxyqW8DxLP/s1600/2017-05-05_12-24-06.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;96&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4t2B0nml7an9SPrZqNvg2ccjiVO_MHG1sX1gqiGjDlz76pgu2gQvTH-HOcPs1FqoaNPNagL9woz_jYfmpgY67XIxaA2H14rhVaKR6kGvvjqwlMqTINcAqS1VN6fNo-YluCtFxyqW8DxLP/s640/2017-05-05_12-24-06.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
It is added during the run method&#39;s super() call by the kernel, so using this code on the ListPage you can remove it. &amp;nbsp;The caveat is if you are using the ListPage FormTemplate, it&#39;s not possible because you&#39;re not able to override the run method.&lt;br /&gt;
&lt;br /&gt;
The last closing comment I&#39;ll add is I don&#39;t know if the kernel expects the control to be there later on and if this can cause any issues or not. I just was curious if I could get it to go away.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;br /&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; run()
{
    &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt;                 i;
    FormControl         formControl;

    super();
    
    &lt;span class=&quot;kwrd&quot;&gt;for&lt;/span&gt; (i=1; i&amp;lt;=element.design().controlCount(); i++)
    {
        formControl = element.design().controlNum(i);

        &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (formControl &lt;span class=&quot;kwrd&quot;&gt;is&lt;/span&gt; FormFilterPaneControl)
        {
            element.design().removeControl(formControl.id());
        }
    }
}&lt;/pre&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;
&lt;/pre&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;
&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/7787180072931299296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2017/05/how-to-remove-default-filter-controls.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/7787180072931299296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/7787180072931299296'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2017/05/how-to-remove-default-filter-controls.html' title='How to remove the default filter controls on a ListPane in AX 2012'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4t2B0nml7an9SPrZqNvg2ccjiVO_MHG1sX1gqiGjDlz76pgu2gQvTH-HOcPs1FqoaNPNagL9woz_jYfmpgY67XIxaA2H14rhVaKR6kGvvjqwlMqTINcAqS1VN6fNo-YluCtFxyqW8DxLP/s72-c/2017-05-05_12-24-06.png" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-3949942030972008663</id><published>2017-04-17T10:42:00.000-07:00</published><updated>2017-04-17T10:43:41.185-07:00</updated><title type='text'>Address Validation in Dynamics AX - QuAAX</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
I wanted to talk about a new product for address validation and discovery in AX called QuAAX (Quality Addressing for AX), powered by Experian Data Quality. It&#39;s more than a simple &quot;is this address valid or not&quot; type of program and allows for address discovery, quick entry, and some fuzzy operations. &amp;nbsp;It also works internationally with 200+ countries supported.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;Disclaimer&lt;/span&gt;&lt;/b&gt;: I worked on this product.&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://axmentor.com/solutions/products/quality-addressing-for-ax/&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;128&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj880SKHWKIZa4ZhJr7JnkG4g6E4ydrZIMRLk5U3yA1wNt3g6HWAmQBtNLz2IAw9E6C36aFUqI6utBkEyjlr1tm-4Bz_4b7ABuKIgdvEhgE5kyiIkRxIkSurRltKTCKdldjZD_4ZghapMT5/s320/QuAAX_blk_org_ExperianAdd.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Addresses in AX can be a headache. &amp;nbsp;Between data migrations from years of different systems, order imports from external sources, and user entry error you can end up with a mess of postal address records that you have varying degrees of confidence in. This is where QuAAX can help solve many of those issues.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoniTeWY6MrDwLrGSztRIeZMj593ROyglNgUBR9ZYrLBGib2L1AfBa4TrT8PCieWC5KSyLm-zAqcizlYWv-HUyml6qb6K2oyrhU0uNCYskNLLOEj956t3c1hw9Evhr3CQnOxnDfNDXThSs/s1600/QuAAXDemo.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoniTeWY6MrDwLrGSztRIeZMj593ROyglNgUBR9ZYrLBGib2L1AfBa4TrT8PCieWC5KSyLm-zAqcizlYWv-HUyml6qb6K2oyrhU0uNCYskNLLOEj956t3c1hw9Evhr3CQnOxnDfNDXThSs/s1600/QuAAXDemo.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The code is almost entirely X++ and lives in AX, which makes desired customization easy and provides transparency. It&#39;s designed to be an easy install via model file with a few overlayered objects to merge.&lt;br /&gt;
&lt;br /&gt;
It is powered by Experian Data Quality web services, so for the configuration you simply put in your Auth Token and set a few minor settings. This means you don&#39;t need to update any on-premise software. It also back-fills related tables, so no need to create new zip-codes and it can automatically complete zip+4 codes.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCsiWmdrEiH1MkJGezwzIvzyu_lVh6P41NB9XMs8TMnZqW_MOmYw06hPeQJNSRFj9vCKG8Ymw1q3hGfI_13RMtkL1TtAAoGP4dLkqd1jzvq8QLNPNGrs6Hl_qeU4hIf9UcVcEqZ_Iuvdu7/s1600/Config.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;177&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCsiWmdrEiH1MkJGezwzIvzyu_lVh6P41NB9XMs8TMnZqW_MOmYw06hPeQJNSRFj9vCKG8Ymw1q3hGfI_13RMtkL1TtAAoGP4dLkqd1jzvq8QLNPNGrs6Hl_qeU4hIf9UcVcEqZ_Iuvdu7/s320/Config.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
There is a new indicator on the address records throughout the system that visually indicates the status of the address and shortcut buttons to verify addresses.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha9R2gtFULdgVz-o1G4psVU7UzCstGzINSMryajSf7ewx_BsQ7sqWDgXloMbyMu53UbFaBSRZik09fPPdWkrZfT14V0RASexhk5LzwPSgkW_2kcA9l1KjgM4nCXqK9aohyphenhyphenzaLzmOef-gKr/s1600/GoodBadOverriddenUnknown.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;229&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha9R2gtFULdgVz-o1G4psVU7UzCstGzINSMryajSf7ewx_BsQ7sqWDgXloMbyMu53UbFaBSRZik09fPPdWkrZfT14V0RASexhk5LzwPSgkW_2kcA9l1KjgM4nCXqK9aohyphenhyphenzaLzmOef-gKr/s320/GoodBadOverriddenUnknown.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
It will automatically create suggestions for validated addresses that are more well formatted.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkSDgS08YQEoHKGD-3XBgLm5N8-qTe-_YI1IUnQ-_uYIrakuXImAj8OYslnuSkzEbmtBGT_gWlzxjgozSfYL5k_qPJXmJBFq3tPqe8E8W4_GuLajpqq92VcpN0MsUOO5du1vOxiJZkNsdy/s1600/UseSuggested.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;289&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkSDgS08YQEoHKGD-3XBgLm5N8-qTe-_YI1IUnQ-_uYIrakuXImAj8OYslnuSkzEbmtBGT_gWlzxjgozSfYL5k_qPJXmJBFq3tPqe8E8W4_GuLajpqq92VcpN0MsUOO5du1vOxiJZkNsdy/s640/UseSuggested.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
When you have an address that is close to correct, it will automatically jump into the edit view with the parts it was able to verify and ask for user input. An example is this address (401 B St, San Diego, CA 92101) where I forgot to enter the suite #. It prompts me to enter it and provides acceptable ranges of input.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiewz1teTEPEqzIgPdhqnkfy0kP1fh7Nr4DF-LErVNGkpw1mWywR2tp3j_2AoJzETFjs8MLwkn1JfJHvBYhr1Bj7Nekhp7lgVo7GFU_ByfKgKv-DJ2Mya_nRrEH6ZB8gUcWYp7Qc1lEMkU0/s1600/MissingSteDemo.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiewz1teTEPEqzIgPdhqnkfy0kP1fh7Nr4DF-LErVNGkpw1mWywR2tp3j_2AoJzETFjs8MLwkn1JfJHvBYhr1Bj7Nekhp7lgVo7GFU_ByfKgKv-DJ2Mya_nRrEH6ZB8gUcWYp7Qc1lEMkU0/s640/MissingSteDemo.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
There is a fancy engine used for keying in new addresses that lets you very quickly enter data and also suggests inputs as you type.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrAg2F1FqBbBOzh7LSX3DWJPj7aD3WCOML_Qvs0vVBk1q_GkdupCLW8Ky54wqhUlbSkaXE9KJ15w8KH1a_3cv7mtJVh9Shmtb2yGUK8E0nMLghszyjDvn4_K019MwIoOqJtvabQaknwrVI/s1600/TypedownDemo.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;396&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrAg2F1FqBbBOzh7LSX3DWJPj7aD3WCOML_Qvs0vVBk1q_GkdupCLW8Ky54wqhUlbSkaXE9KJ15w8KH1a_3cv7mtJVh9Shmtb2yGUK8E0nMLghszyjDvn4_K019MwIoOqJtvabQaknwrVI/s640/TypedownDemo.gif&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
It also has a bulk processing engine and simple API, so you can perform cleanup on your legacy data or perform validation calls on new addresses input from external sources.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCiTZPefsyE8u6b39FCsmIHbxKIz7cwuyA3k0uL4ktaKPqgI23z2hf2cCkJviTY1Nk3snSCf7oUB9W71ZqTSB35FMcIOKDxLfGXOByEKSFU0qOtmTxF1KqvJfgWyuQ-wn-0GYo5vbqTAy7/s1600/AddressQueue.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCiTZPefsyE8u6b39FCsmIHbxKIz7cwuyA3k0uL4ktaKPqgI23z2hf2cCkJviTY1Nk3snSCf7oUB9W71ZqTSB35FMcIOKDxLfGXOByEKSFU0qOtmTxF1KqvJfgWyuQ-wn-0GYo5vbqTAy7/s400/AddressQueue.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Some final comments. Right now it&#39;s supported for AX 2012 and it&#39;s coming soon to Dynamics 365 for Operations. &amp;nbsp;There are plenty more features I wasn&#39;t able to cover in this post such as lat/long, address type indicator (residential vs commercial), and more.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;More information can be found here:&amp;nbsp;&lt;a href=&quot;http://axmentor.com/solutions/products/quality-addressing-for-ax/&quot;&gt;http://axmentor.com/solutions/products/quality-addressing-for-ax/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
As always, happy DAX&#39;ing!&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/3949942030972008663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2017/04/address-validation-in-dynamics-ax-quaax.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/3949942030972008663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/3949942030972008663'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2017/04/address-validation-in-dynamics-ax-quaax.html' title='Address Validation in Dynamics AX - QuAAX'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj880SKHWKIZa4ZhJr7JnkG4g6E4ydrZIMRLk5U3yA1wNt3g6HWAmQBtNLz2IAw9E6C36aFUqI6utBkEyjlr1tm-4Bz_4b7ABuKIgdvEhgE5kyiIkRxIkSurRltKTCKdldjZD_4ZghapMT5/s72-c/QuAAX_blk_org_ExperianAdd.png" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-4015073285766656238</id><published>2017-03-14T09:57:00.000-07:00</published><updated>2017-03-14T09:58:32.499-07:00</updated><title type='text'>New features (CDS Integrations) and some clarity on Common Data Services (CDS) and how it will work in the Dynamics 365 Sphere of products</title><content type='html'>For the last year how the Common Data Services (CDS) will actually work and play in the Dynamics 365 sphere of products has been a fairly gray area. It has been often promised that &quot;&lt;i&gt;it just works&quot;&lt;/i&gt;, without providing any details to what is going on behind the scenes. Hopefully I&#39;ll be able to provide some grain of clarity on that.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The following is still under development by Microsoft and hasn&#39;t been officially announced, but it&#39;s what I&#39;ve gathered from speaking with the various product members.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;i&gt;How does the Common Data Model get filled by the CDS? -&amp;nbsp;&lt;/i&gt;&lt;span style=&quot;color: red;&quot;&gt;Microsoft is building 1st class integrations&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;Is it flow? -&amp;nbsp;&lt;/i&gt;&lt;span style=&quot;color: red;&quot;&gt;No&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;b&gt;New configuration section - &quot;Integrations&quot;:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6_qSi8LKLPWJfkf6ilh6xVPfkdhu7ZsoDaW8NNJufmy_-sHCcRX0elg_IfhYH_TS0bmoxYNr9eggnuQKQhDnGFN66KA60NgqjiJegEhJU7q8s7Q7Gf0jEorra2aI_cHDNt3FlGjpzdAH0/s1600/2017-03-14_8-59-48.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;341&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6_qSi8LKLPWJfkf6ilh6xVPfkdhu7ZsoDaW8NNJufmy_-sHCcRX0elg_IfhYH_TS0bmoxYNr9eggnuQKQhDnGFN66KA60NgqjiJegEhJU7q8s7Q7Gf0jEorra2aI_cHDNt3FlGjpzdAH0/s400/2017-03-14_8-59-48.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
So this doesn&#39;t yet exist yet, but there is supposed to come a new section in the PowerApps Admin Center where you can configure your environment integrations with the Common Data Service. It&#39;s also important to note that it lives in the PowerApps Admin Center for now only because they haven&#39;t come up with a better place, even though it doesn&#39;t seem to make total sense to me.&lt;br /&gt;
&lt;br /&gt;
So things like:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Dynamics 365 for Sales (CRM) to&lt;/li&gt;
&lt;li&gt;Common Data Services to&lt;/li&gt;
&lt;li&gt;Dynamics 365 for Operations (AX)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx_cIYC3D4ZdLRXMLFtfyHDSFPEs9lXvo0eaNPQhikuthyphenhyphenyPcqb2YS5eNnRKa6qdkwVWdz-AQKCFP-xkHUg2wVCr3kp5769UmCi_TuPPWKQoViky2XFhBSVxZkJzBZ4HNhBdRdbaWrjIxZ/s1600/20170313_140117.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx_cIYC3D4ZdLRXMLFtfyHDSFPEs9lXvo0eaNPQhikuthyphenhyphenyPcqb2YS5eNnRKa6qdkwVWdz-AQKCFP-xkHUg2wVCr3kp5769UmCi_TuPPWKQoViky2XFhBSVxZkJzBZ4HNhBdRdbaWrjIxZ/s640/20170313_140117.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsIPCvIkU0XLSjX1d7XMcpZX38MOUyw22s61VAxQleICbZ7RJlIEYOpNsg5OLNIDtgpGuW9U0HgEKI8A6a9mimJLeAKTtKiWNg2S4SHbQZdPCubC6iY49hxZsctIc4cLuK81KsP414DMt1/s1600/20170313_140213.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsIPCvIkU0XLSjX1d7XMcpZX38MOUyw22s61VAxQleICbZ7RJlIEYOpNsg5OLNIDtgpGuW9U0HgEKI8A6a9mimJLeAKTtKiWNg2S4SHbQZdPCubC6iY49hxZsctIc4cLuK81KsP414DMt1/s640/20170313_140213.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This order is important because &quot;&lt;i&gt;you have to crawl before you can walk&quot; &lt;/i&gt;and Microsoft&#39;s first goal is to go from Sales =&amp;gt; CDS =&amp;gt; Operations. Eventually, they&#39;ll go both ways.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Flow Templates:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
If you&#39;re like me and tried to figure it out on your own, you may have stumbled upon some pre-configured&amp;nbsp;&lt;b&gt;Flow Templates &lt;/b&gt;that might fit the need:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGmfC-Yhc2OikTfUPOtTIVtzKio0BgtMuLCryXX7oo7_DEK7KEIebwCHlWRIvarag34TYk4g5F7SNwn0kGpqx_f2eOanIez32-zDrvCS33iWa60ySMT9XnhSMHIjr1sTzwOZJJTC3UoMjV/s1600/CRM+Flow+AX.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGmfC-Yhc2OikTfUPOtTIVtzKio0BgtMuLCryXX7oo7_DEK7KEIebwCHlWRIvarag34TYk4g5F7SNwn0kGpqx_f2eOanIez32-zDrvCS33iWa60ySMT9XnhSMHIjr1sTzwOZJJTC3UoMjV/s320/CRM+Flow+AX.png&quot; width=&quot;317&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;i&gt;How are flow templates different than integrations?&lt;/i&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;div&gt;
&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Integrations to the Common Data Service will be more robust and &quot;first class&quot; integrations by Microsoft for bulk data moving and syncing, while Flow Templates are for purpose built, row-by-row needs.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;i&gt;What technologies do integrations use under the hood?&lt;/i&gt;&lt;/b&gt;&lt;/blockquote&gt;
The integrations use a combination of Data Import Export Framework (DIXF), OData, and &lt;b&gt;M-Engine&lt;/b&gt;&amp;nbsp;which sits under Power Query. &amp;nbsp;These allow the integration to push bulk amounts of data&amp;nbsp;between the systems on an unspecified syncing schedule.&lt;br /&gt;
&lt;br /&gt;
This is an exciting time as these technologies are bleeding edge and new things are expected to release very soon! As always, happy DAX&#39;ing! Or D365&#39;ing?</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/4015073285766656238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2017/03/new-features-and-some-clarity-on-common.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/4015073285766656238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/4015073285766656238'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2017/03/new-features-and-some-clarity-on-common.html' title='New features (CDS Integrations) and some clarity on Common Data Services (CDS) and how it will work in the Dynamics 365 Sphere of products'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6_qSi8LKLPWJfkf6ilh6xVPfkdhu7ZsoDaW8NNJufmy_-sHCcRX0elg_IfhYH_TS0bmoxYNr9eggnuQKQhDnGFN66KA60NgqjiJegEhJU7q8s7Q7Gf0jEorra2aI_cHDNt3FlGjpzdAH0/s72-c/2017-03-14_8-59-48.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-8733301054448054598</id><published>2017-02-15T11:40:00.000-07:00</published><updated>2017-02-15T12:00:15.205-07:00</updated><title type='text'>Unlimited private agents for Visual Studio Team Services!</title><content type='html'>&lt;div class=&quot;tr_bq&quot;&gt;
In January Microsoft announced via e-mail &lt;b&gt;&lt;span style=&quot;background-color: yellow;&quot;&gt;good&lt;/span&gt;&amp;nbsp;&lt;/b&gt;changes to Build &amp;amp; Release Private Agents. They introduced the concept of &quot;Private Pipelines&quot; in Visual Studio Team Services.&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA4kRclFivyC_UflAJzEHNgFaC85hV5N8W9L3tV4a3ttVvsBqofmemNQ-ZrnZxhm4J-nI1L_TKUdDOHU-p2qW42SLqdZpBYId9rtH3xrPMcANp1HzNzbS11n33y9oQgevwj-2C3eHEInrA/s1600/AgentsImage.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA4kRclFivyC_UflAJzEHNgFaC85hV5N8W9L3tV4a3ttVvsBqofmemNQ-ZrnZxhm4J-nI1L_TKUdDOHU-p2qW42SLqdZpBYId9rtH3xrPMcANp1HzNzbS11n33y9oQgevwj-2C3eHEInrA/s640/AgentsImage.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;u&gt;What are Agents?&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
An agent is basically a task-runner that you can pass build activities to, such as PowerShell scripts, executables, etc. The agent can either be &lt;a href=&quot;https://www.visualstudio.com/en-us/docs/build/concepts/agents/hosted&quot; target=&quot;_blank&quot;&gt;Hosted&lt;/a&gt; (in the cloud on Azure) or &lt;a href=&quot;https://www.visualstudio.com/en-us/docs/build/actions/agents/v2-windows&quot; target=&quot;_blank&quot;&gt;on-premise&lt;/a&gt; (installed on your private servers).&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
When you run a build/release process from VSTS, it sends your tasks to an Agent to do your work.&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;u&gt;What&#39;s new?&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
The concept of a &quot;pipeline&quot; is introduced, which is essentially the number of concurrent agents running tasks at the same time. &amp;nbsp;Previously, you were allowed one on-premise agent (for free) and if you wanted more agents on different servers you had to buy additional ones ($15/ea).&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
Now, you can have unlimited on-premise agents! You are given one &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms.build-release-private-pipelines&quot; target=&quot;_blank&quot;&gt;private&lt;/a&gt;&amp;nbsp;and &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms.build-release-hosted-pipelines&quot; target=&quot;_blank&quot;&gt;hosted&lt;/a&gt;&amp;nbsp;pipeline free with your VSTS account. So this means you can still only run operations on one agent at a time unless you buy additional pipelines.&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
&lt;b&gt;&lt;u&gt;Why is this a good thing?&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
If you have Dev/Test/Prod systems, you may want to place an agent on each machine where each has certain privileges and setup your build processes to communicate with each agent. And you may have no need for many concurrent build/release operations, but you want to have your agents (task runners) on different machines. This is VERY convenient. &amp;nbsp;Previously, the work around was to just figure out ways to have your agent run on a single machine and execute operations remotely to the other machines, which you can imagine is a hassle.&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;tr_bq&quot;&gt;
Here is the full contents of the email:&lt;/div&gt;
&lt;blockquote&gt;
&lt;i&gt;Starting later this month and running through the end of February, we will be gradually deploying a change to how we count Build &amp;amp; Release Private Pipelines (previously called Private Agents) in Visual Studio Team Services. &amp;nbsp;It does not change your bill. &lt;br /&gt;&lt;br /&gt;Up to this point, you have needed a Private Pipeline for each separate private build agent or private release agent that you configure in your Team Services account.&lt;/i&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;i&gt;Going forward, you can configure as many private agents as needed in your Team Services account without incurring extra charges. &amp;nbsp;You&#39;ll only need as many Private Pipelines as the number of concurrent builds you want to run or releases you want to deploy using your own machines. With this new way of counting Private Pipelines you may be able to purchase fewer Private Pipelines than you do today.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;i&gt;Learn more about the impact of this change on your builds and releases. &lt;br /&gt;If you have any questions, please contact us through the Visual Studio Developer Community (http://developercommunity.visualstudio.com) or via customer support (https://www.visualstudio.com/team-services/support/).&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/8733301054448054598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2017/02/unlimited-private-agents-for-visual.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/8733301054448054598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/8733301054448054598'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2017/02/unlimited-private-agents-for-visual.html' title='Unlimited private agents for Visual Studio Team Services!'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA4kRclFivyC_UflAJzEHNgFaC85hV5N8W9L3tV4a3ttVvsBqofmemNQ-ZrnZxhm4J-nI1L_TKUdDOHU-p2qW42SLqdZpBYId9rtH3xrPMcANp1HzNzbS11n33y9oQgevwj-2C3eHEInrA/s72-c/AgentsImage.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-4625393250560348252</id><published>2016-11-22T14:00:00.002-07:00</published><updated>2016-11-22T15:39:35.232-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AX7"/><category scheme="http://www.blogger.com/atom/ns#" term="D365"/><category scheme="http://www.blogger.com/atom/ns#" term="d3fo"/><category scheme="http://www.blogger.com/atom/ns#" term="Facebook"/><category scheme="http://www.blogger.com/atom/ns#" term="React"/><category scheme="http://www.blogger.com/atom/ns#" term="React with Addons"/><title type='text'>Dynamics 365 for Operations (AX7) leverages Facebook libraries</title><content type='html'>So a little known thing about Microsoft Dynamics 365 for Operations (AX7) is that the user interface appears to be built on &lt;a href=&quot;https://facebook.github.io/react/&quot; target=&quot;_blank&quot;&gt;Facebook&#39;s React JavaScript libraries&lt;/a&gt;, specifically React with Addons.&lt;br /&gt;
&lt;br /&gt;
Hearing Facebook and D365 in the same sentence initially makes me wince a little, but it makes perfect sense. Facebook is in the business of user interface on the web, so why would Microsoft reinvent the wheel for user interface when the engineers at Facebook are leading the way and devoting more resources towards it?&lt;br /&gt;
&lt;br /&gt;
You can see the React JS files in various locations, such as&amp;nbsp;C:\AOSService\webroot\Scripts\ext\react*.js on a demo VM.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/TRVFCUJ.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://i.imgur.com/TRVFCUJ.png&quot; height=&quot;221&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#39;ve tried to create/debug a D3fo custom control using Chrome/FF developer tools and stepped into the JavaScript, you&#39;ll eventually see it in the min versions of the React libraries.&lt;br /&gt;
&lt;br /&gt;
As of writing this, the current version embedded in the Nov 1611 VM is 15.1.0 while the available is v15.3.2.&lt;br /&gt;
&lt;br /&gt;
So if you&#39;re experiencing bugs with some controls, there may be a fix on the horizon.</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/4625393250560348252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2016/11/dynamics-365-for-operations-ax7_22.html#comment-form' title='258 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/4625393250560348252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/4625393250560348252'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2016/11/dynamics-365-for-operations-ax7_22.html' title='Dynamics 365 for Operations (AX7) leverages Facebook libraries'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>258</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-6862486145029915618</id><published>2016-11-22T14:00:00.000-07:00</published><updated>2016-11-22T14:00:47.034-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AX7"/><category scheme="http://www.blogger.com/atom/ns#" term="D365"/><category scheme="http://www.blogger.com/atom/ns#" term="d3fo"/><category scheme="http://www.blogger.com/atom/ns#" term="Facebook"/><category scheme="http://www.blogger.com/atom/ns#" term="React"/><category scheme="http://www.blogger.com/atom/ns#" term="React with Addons"/><title type='text'>Dynamics 365 for Operations (AX7) leverages Facebook libraries</title><content type='html'>So a little known think about Microsoft Dynamics 365 for Operations (AX7) is that the user interface appears to be built on &lt;a href=&quot;https://facebook.github.io/react/&quot; target=&quot;_blank&quot;&gt;Facebook&#39;s React JavaScript libraries&lt;/a&gt;, specifically React with Addons.&lt;br /&gt;
&lt;br /&gt;
Hearing Facebook and D365 in the same sentence initially makes me wince a little, but it makes perfect sense. Facebook is in the business of user interface on the web, so why would Microsoft reinvent the wheel for user interface when the engineers at Facebook are leading the way and devoting more resources towards it?&lt;br /&gt;
&lt;br /&gt;
You can see the React JS files in various locations, such as&amp;nbsp;C:\AOSService\webroot\Scripts\ext\react*.js on a demo VM.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/TRVFCUJ.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://i.imgur.com/TRVFCUJ.png&quot; height=&quot;221&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#39;ve tried to create/debug a D3fo custom control using Chrome/FF developer tools and stepped into the JavaScript, you&#39;ll eventually see it in the min versions of the React libraries.&lt;br /&gt;
&lt;br /&gt;
As of writing this, the current version embedded in the Nov 1611 VM is 15.1.0 while the available is v15.3.2.&lt;br /&gt;
&lt;br /&gt;
So if you&#39;re experiencing bugs with some controls, there may be a fix on the horizon.</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/6862486145029915618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2016/11/dynamics-365-for-operations-ax7.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/6862486145029915618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/6862486145029915618'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2016/11/dynamics-365-for-operations-ax7.html' title='Dynamics 365 for Operations (AX7) leverages Facebook libraries'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-6726277928766318397</id><published>2016-05-04T13:32:00.000-07:00</published><updated>2016-05-04T13:44:11.742-07:00</updated><title type='text'>The better way to detect when multiple records are selected</title><content type='html'>There are some instances when you want to know when multiple records are marked on a form. An example would be if you wanted a button to be enabled &lt;b&gt;only&lt;/b&gt; when more than 1 record was selected.&lt;br /&gt;
&lt;br /&gt;
You can make a button disabled when more than 1 record is selected, but not the other way around.&lt;br /&gt;
&lt;br /&gt;
As far as I can tell, the way the grid functions is it stores an &lt;i&gt;Array&lt;/i&gt; object of the cursor positions of the marked records. Below are the two ways I&#39;ve seen to solve this problem. Method #2 is more common, but Method #1 seems more efficient to me as you&#39;re only interacting with the &lt;i&gt;Array&lt;/i&gt;&amp;nbsp;and not traversing the datasource&#39;s table buffer.&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;br /&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;    FormDataSource  fds = salesTable.dataSource();

    &lt;span class=&quot;rem&quot;&gt;// Method 1&lt;/span&gt;
    &lt;span class=&quot;rem&quot;&gt;// The grid stores an array of marked records, and this&lt;/span&gt;
    &lt;span class=&quot;rem&quot;&gt;// will return only the index, which is all that is needed&lt;/span&gt;
    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (fds.recordsMarked().lastIndex() &amp;gt; 1)
        info(&lt;span class=&quot;str&quot;&gt;&quot;Multiple records selected&quot;&lt;/span&gt;);
    &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
        info(&lt;span class=&quot;str&quot;&gt;&quot;1 or 0 records selected&quot;&lt;/span&gt;);
    
    &lt;span class=&quot;rem&quot;&gt;// Method 2&lt;/span&gt;
    &lt;span class=&quot;rem&quot;&gt;// This will traverse the datasources buffer&lt;/span&gt;
    fds.getFirst(&lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);    
    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (fds.getNext())
        info(&lt;span class=&quot;str&quot;&gt;&quot;Multiple records selected&quot;&lt;/span&gt;);
    &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
        info(&lt;span class=&quot;str&quot;&gt;&quot;1 or 0 records selected&quot;&lt;/span&gt;);

    &lt;span class=&quot;rem&quot;&gt;// Enabling/Disabling button in one line&lt;/span&gt;
    myButton.enabled(SalesTable_ds.recordsMarked().lastIndex() &amp;gt; 1);&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;u&gt;And how to enable/disable a button in one line&lt;/u&gt;:
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;    &lt;span class=&quot;rem&quot;&gt;// Enabling/Disabling button in one line&lt;/span&gt;
    myButton.enabled(SalesTable_ds.recordsMarked().lastIndex() &amp;gt; 1);&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/6726277928766318397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2016/05/the-better-way-to-detect-when-multiple.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/6726277928766318397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/6726277928766318397'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2016/05/the-better-way-to-detect-when-multiple.html' title='The better way to detect when multiple records are selected'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-1265392581524661537</id><published>2015-12-03T13:09:00.003-07:00</published><updated>2015-12-03T13:09:43.022-07:00</updated><title type='text'>Some notes on Dynamics AX 2012 and the registry</title><content type='html'>&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AOS60$01]&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Windows service configurations&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dynamics Server&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;AOS Server(s) configurations&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;HKEY_CURRENT_USER\Software\Microsoft\Dynamics\&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;When a user opens the client config, this registry key is created and it stores their configurations which take priority over HKLM&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dynamics&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;These are the client config settings for the machine that are used when HKCU settings aren&#39;t present.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/1265392581524661537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2015/12/some-notes-on-dynamics-ax-2012-and.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/1265392581524661537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/1265392581524661537'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2015/12/some-notes-on-dynamics-ax-2012-and.html' title='Some notes on Dynamics AX 2012 and the registry'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-621084773352100317</id><published>2015-11-10T14:12:00.001-07:00</published><updated>2015-11-10T14:12:26.442-07:00</updated><title type='text'>CacheDataMethod (AX2012 feature) property vs CacheAddMethod</title><content type='html'>A someone little known feature of AX 2012 is a new property called &quot;CacheDataMethod&quot;.&lt;br /&gt;
&lt;br /&gt;
Previously, when you wanted to improve performance by caching your display/edit methods, you would place a line of code like this after the super() in the datasource&#39;s init() method:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;.cacheAddMethod(tableMethodStr(CustTable, MyDisplayMethod));&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
In AX 2012, you can just change the &quot;CacheDataMethod&quot; property on the object without adding code. &amp;nbsp;I prefer this method where possible mainly because it keeps everything packaged together and I don&#39;t have to intermingle my code with base code.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4vApSMcJ143WzKMCZ7G7kctNL794g71clOWWSSGhNef93rUhEUMHS6S6eCgmJzl-CrWRCEYcAgO6Caq2ayVuRyK6GAo0c4d7rd_3RbHoE3zO5OqXDKiISmjviyvmvv7TuwMlh94sWUjrs/s1600/11-10-2015+2-05-09+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4vApSMcJ143WzKMCZ7G7kctNL794g71clOWWSSGhNef93rUhEUMHS6S6eCgmJzl-CrWRCEYcAgO6Caq2ayVuRyK6GAo0c4d7rd_3RbHoE3zO5OqXDKiISmjviyvmvv7TuwMlh94sWUjrs/s640/11-10-2015+2-05-09+PM.png&quot; width=&quot;296&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/621084773352100317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2015/11/cachedatamethod-ax2012-feature-property.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/621084773352100317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/621084773352100317'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2015/11/cachedatamethod-ax2012-feature-property.html' title='CacheDataMethod (AX2012 feature) property vs CacheAddMethod'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4vApSMcJ143WzKMCZ7G7kctNL794g71clOWWSSGhNef93rUhEUMHS6S6eCgmJzl-CrWRCEYcAgO6Caq2ayVuRyK6GAo0c4d7rd_3RbHoE3zO5OqXDKiISmjviyvmvv7TuwMlh94sWUjrs/s72-c/11-10-2015+2-05-09+PM.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-7243511663620512185</id><published>2015-11-09T14:09:00.000-07:00</published><updated>2015-11-09T19:02:55.666-07:00</updated><title type='text'>The better way to pass containers between objects/forms using the Args() class, and not by converting to a string</title><content type='html'>If you need to pass a container between objects/forms using the Args class, don&#39;t convert it to a string and then back, use &lt;b&gt;parmObject() and ContainerClass()&lt;/b&gt;! &amp;nbsp;I see many suggestions about converting it to a string, which can have much more unpredictable results and is not as versatile.&lt;br /&gt;
&lt;br /&gt;
You wrap your container in the class &lt;b&gt;ContainerClass()&lt;/b&gt;&amp;nbsp;and then unwrap it at the other end.&lt;br /&gt;
&lt;br /&gt;
Make your call like this:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;args.parmObject(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ContainerClass([&lt;span class=&quot;str&quot;&gt;&quot;Real container&quot;&lt;/span&gt;, 1234, &lt;span class=&quot;str&quot;&gt;&quot;Not con2str container&quot;&lt;/span&gt;]));&lt;/pre&gt;
&lt;/blockquote&gt;
And retrieve it like this:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;containerClass = element.args().parmObject() &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; ContainerClass;
myContainer = containerClass.value();&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
To test this, create a form (Form1) and overwrite the init method and put in this code:&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; init()
{
    ContainerClass      containerClass;
    container           conValue;
    
    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!(element.args() &amp;amp;&amp;amp; element.args().parmObject() &amp;amp;&amp;amp; element.args().parmObject() &lt;span class=&quot;kwrd&quot;&gt;is&lt;/span&gt; ContainerClass))
        &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; error(&lt;span class=&quot;str&quot;&gt;&quot;@SYS22539&quot;&lt;/span&gt;);
    
    super();
    
    containerClass = element.args().parmObject() &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; ContainerClass;
    conValue = containerClass.value();
    
    info(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;The container contains &#39;%1&#39;&quot;&lt;/span&gt;, con2Str(conValue)));
}&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
Then create a Job and put in this code:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; JobForm1(Args _args)
{
    Args        args;
    FormRun     formRun;
    
    args = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Args();
    args.name(formStr(Form1));
    args.parmObject(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; ContainerClass([&lt;span class=&quot;str&quot;&gt;&#39;Real containers&#39;&lt;/span&gt;, 1234, &lt;span class=&quot;str&quot;&gt;&#39;Not con2str containers&#39;&lt;/span&gt;]));
    
    formRun = classFactory.formRunClass(args);
    formRun.init();
    formRun.run();
    formRun.wait();
}&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
And then run the job!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipzLfWF3Gi66zcpa4Pr1072u4pS3Nb_NScIroXzHvd7A6Z7rH1zvcYHNnNfcAUe_UrYV5W8-SfGjBjRRY8NRzEdVpbH0q_27r0S_PJvVhyphenhyphenweVvsNNj_gXLolJVhZrJjp1IBcQTq8gB8Q7F/s1600/11-9-2015+2-03-41+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipzLfWF3Gi66zcpa4Pr1072u4pS3Nb_NScIroXzHvd7A6Z7rH1zvcYHNnNfcAUe_UrYV5W8-SfGjBjRRY8NRzEdVpbH0q_27r0S_PJvVhyphenhyphenweVvsNNj_gXLolJVhZrJjp1IBcQTq8gB8Q7F/s320/11-9-2015+2-03-41+PM.png&quot; width=&quot;274&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/7243511663620512185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2015/11/the-better-way-to-pass-containers.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/7243511663620512185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/7243511663620512185'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2015/11/the-better-way-to-pass-containers.html' title='The better way to pass containers between objects/forms using the Args() class, and not by converting to a string'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipzLfWF3Gi66zcpa4Pr1072u4pS3Nb_NScIroXzHvd7A6Z7rH1zvcYHNnNfcAUe_UrYV5W8-SfGjBjRRY8NRzEdVpbH0q_27r0S_PJvVhyphenhyphenweVvsNNj_gXLolJVhZrJjp1IBcQTq8gB8Q7F/s72-c/11-9-2015+2-03-41+PM.png" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-394035751069254630</id><published>2015-10-28T12:25:00.000-07:00</published><updated>2015-10-28T12:25:01.295-07:00</updated><title type='text'>How to create a self-elevating PowerShell script that will run as administrator every time</title><content type='html'>Often there are various build processes or other automated tasks that run via PowerShell and need to be run as administrator. &amp;nbsp;If you forget to run it as administrator, it won&#39;t work, and you don&#39;t always know.&lt;br /&gt;
&lt;br /&gt;
I came across a great blog post by &lt;a href=&quot;https://social.msdn.microsoft.com/profile/benjamin%20armstrong/&quot; target=&quot;_blank&quot;&gt;Ben Armstrong&lt;/a&gt; that I have to share, where he&#39;s created a block of code you just prefix to the beginning of your PowerShell script that will re-launch it as administrator if it is not. &amp;nbsp;Check his post out here:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blogs.msdn.com/b/virtual_pc_guy/archive/2010/09/23/a-self-elevating-powershell-script.aspx&quot;&gt;http://blogs.msdn.com/b/virtual_pc_guy/archive/2010/09/23/a-self-elevating-powershell-script.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Here&#39;s a screenshot of the PowerShell code in case his blog goes down:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv2LsJ_CN7SFfQnFYlugxIpXMDfrgx3CQoGlESlhtiLaEoH8ZxTr5Q-bvVtudIZqEoT5uIkmc2ljC_LbRFhkclR7f-VzTFgCgt1gjdQRN0Xbdz3Y6w-65QCD4AvObViiKPsHMv8VQft3p8/s1600/SelfElevatingPowershell.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;552&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv2LsJ_CN7SFfQnFYlugxIpXMDfrgx3CQoGlESlhtiLaEoH8ZxTr5Q-bvVtudIZqEoT5uIkmc2ljC_LbRFhkclR7f-VzTFgCgt1gjdQRN0Xbdz3Y6w-65QCD4AvObViiKPsHMv8VQft3p8/s640/SelfElevatingPowershell.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/394035751069254630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2015/10/how-to-create-self-elevating-powershell.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/394035751069254630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/394035751069254630'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2015/10/how-to-create-self-elevating-powershell.html' title='How to create a self-elevating PowerShell script that will run as administrator every time'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv2LsJ_CN7SFfQnFYlugxIpXMDfrgx3CQoGlESlhtiLaEoH8ZxTr5Q-bvVtudIZqEoT5uIkmc2ljC_LbRFhkclR7f-VzTFgCgt1gjdQRN0Xbdz3Y6w-65QCD4AvObViiKPsHMv8VQft3p8/s72-c/SelfElevatingPowershell.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-8461589960168656734</id><published>2015-10-13T13:30:00.001-07:00</published><updated>2015-10-14T10:41:02.936-07:00</updated><title type='text'>Without any customization, how to incrementally compile the CIL from the command line</title><content type='html'>With Dynamics AX 2012, you can start an incremental CIL compile from the command line (or Power Shell) without any customization. &amp;nbsp;This is useful if you have any automated processes that import XPOs frequently and you don&#39;t want to constantly build the full CIL.&lt;br /&gt;
&lt;br /&gt;
Create an XML file with this data:&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;br /&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;xml&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;1.0&quot;&lt;/span&gt; ?&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;AxaptaAutoRun&lt;/span&gt;  
    &lt;span class=&quot;attr&quot;&gt;exitWhenDone&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;true&quot;&lt;/span&gt;  
    &lt;span class=&quot;attr&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;6.2&quot;&lt;/span&gt;  
    &lt;span class=&quot;attr&quot;&gt;logFile&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;C:\AxaptaAutorun.log&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt; 
 &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;CompileIL&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;incremental&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;AxaptaAutoRun&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
Then save it in a place that is accessible from the AOS service account. &amp;nbsp;I saved it as &quot;&lt;b&gt;C:\IncrementalCIL.xml&lt;/b&gt;&quot; on the AOS machine.&lt;br /&gt;
&lt;br /&gt;
Then run this command, subbing in for your environment:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace; font-size: large;&quot;&gt;&quot;C:\Program Files (x86)\Microsoft Dynamics AX\60\Client\Bin\Ax32.exe&quot; \\MyNetworkShare\AOS.axc -startupcmd=autorun_C:\IncrementalCIL.xml&lt;/span&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
Some notes about the XML. &amp;nbsp;The &lt;i style=&quot;font-weight: bold;&quot;&gt;version&lt;/i&gt;&amp;nbsp;attribute must not be greater than your system&#39;s build, which can be found from calling &lt;b&gt;&lt;i&gt;xInfo::releaseVersion()&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
There are a TON more &lt;i style=&quot;font-weight: bold;&quot;&gt;autorun&lt;/i&gt;&amp;nbsp;features available, and you can use the following links or just dig into&amp;nbsp;&lt;b&gt;&lt;i&gt;\Classes\SysAutoRun&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
More information can be found at:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/sysautorun.aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/sysautorun.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/aa569641.aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/aa569641.aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/8461589960168656734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2015/10/without-any-customization-how-to.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/8461589960168656734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/8461589960168656734'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2015/10/without-any-customization-how-to.html' title='Without any customization, how to incrementally compile the CIL from the command line'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-2088710435235672634</id><published>2015-09-10T14:55:00.002-07:00</published><updated>2015-10-28T10:18:56.173-07:00</updated><title type='text'>How to export all private or shared projects with or without project definitions from a specified layer</title><content type='html'>I often have to switch development machines, and when I do, I lose all of my private or shared projects. &amp;nbsp;This is a good way to backup your projects and/or their definitions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;
&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; AKExportProjects(Args _args)
{
    #AotExport
    TreeNodeIterator        tni;
    ProjectNode             projectNode;
    &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt;                     exportFlag;
    Dialog                  dialog = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Dialog();
    DialogField             folderName;
    DialogField             projectDefinitionOnly;
    DialogField             exportFromLayer;
    DialogField             projectType;
    UtilEntryLevel          layer;

    dialog.addText(&lt;span class=&quot;str&quot;&gt;&quot;This will export all projects (shared or private) that exist in a selected model.&quot;&lt;/span&gt;);
    projectType             = dialog.addFieldValue(enumStr(ProjectSharedPrivate), ProjectSharedPrivate::ProjPrivate);
    projectDefinitionOnly   = dialog.addField(extendedTypeStr(NoYesId), &lt;span class=&quot;str&quot;&gt;&#39;Project Definition Only&#39;&lt;/span&gt;);
    folderName              = dialog.addField(extendedTypeStr(FilePath));
    exportFromLayer         = dialog.addField(enumStr(UtilEntryLevel), &lt;span class=&quot;str&quot;&gt;&#39;Projects from layer&#39;&lt;/span&gt;);

    dialog.run();

    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (dialog.closedOk())
    {
        &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (!folderName.value())
            &lt;span class=&quot;kwrd&quot;&gt;throw&lt;/span&gt; error(&lt;span class=&quot;str&quot;&gt;&quot;Missing folder&quot;&lt;/span&gt;);

        exportFlag = #export;
        &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (projectDefinitionOnly.value())
            exportFlag += #expProjectOnly;

        layer = exportFromLayer.value();
        
        &lt;span class=&quot;kwrd&quot;&gt;switch&lt;/span&gt; (projectType.value())
        {
            &lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; ProjectSharedPrivate::ProjPrivate:
                tni = SysTreeNode::getPrivateProject().AOTiterator();
                &lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;

            &lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; ProjectSharedPrivate::ProjShared:
                tni = SysTreeNode::getSharedProject().AOTiterator();
                &lt;span class=&quot;kwrd&quot;&gt;break&lt;/span&gt;;

        }
        
        projectNode = tni.next() &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; ProjectNode;
        
        while (projectNode)
        {
            &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (projectNode.AOTLayer() == layer)
                projectNode.treeNodeExport(folderName.value() + &lt;span class=&quot;str&quot;&gt;&#39;\\&#39; + projectNode.name() + &#39;&lt;/span&gt;.xpo&#39;, exportFlag);

            projectNode = tni.next() &lt;span class=&quot;kwrd&quot;&gt;as&lt;/span&gt; ProjectNode;
        }
    }
    &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
        warning(&lt;span class=&quot;str&quot;&gt;&quot;No action taken...&quot;&lt;/span&gt;);
}&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/2088710435235672634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2015/09/how-to-export-all-private-or-shared.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2088710435235672634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2088710435235672634'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2015/09/how-to-export-all-private-or-shared.html' title='How to export all private or shared projects with or without project definitions from a specified layer'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-2293681400466349168</id><published>2015-08-03T12:22:00.001-07:00</published><updated>2015-08-04T12:06:10.719-07:00</updated><title type='text'>How to check if a Base Enum has a valid value</title><content type='html'>Base enums can use integer assignment to be set, but you can set it 0 to any positive valid integer up to 255 inclusive, and that does not mean it&#39;s a valid enum.&lt;br /&gt;
&lt;br /&gt;
Take for example the base enum &quot;&lt;b&gt;ABC&lt;/b&gt;&quot; (\Data Dictionary\Base Enums\ABC). &amp;nbsp;You can assign ABC=555, and it will store an integer value of 255 with no issue.&lt;br /&gt;
&lt;br /&gt;
To check if an enum value is valid, you can use this method:&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;
&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; boolean checkABCEnum(ABC _abc)
{
    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DictEnum(enumNum(ABC)).value2Symbol(_abc));
}&lt;/pre&gt;
&lt;br /&gt;
Here is a sample job that will demonstrate how this can be an issue:&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;
&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; CheckIfEnumIsValid(Args _args)
{
    &lt;span class=&quot;rem&quot;&gt;// Possible enum values 0, 1, 2, 3&lt;/span&gt;
    ABC         abcValid, abcInvalid;
        
    &lt;span class=&quot;rem&quot;&gt;// Valid enum&lt;/span&gt;
    abcValid = ABC::C;
    info(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;%1, %2&quot;&lt;/span&gt;, enum2int(abcValid), abcValid));
    
    &lt;span class=&quot;rem&quot;&gt;// Invalid enum, but integer assignment works and is stored&lt;/span&gt;
    abcInvalid = 555;
    info(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;%1, %2&quot;&lt;/span&gt;, enum2int(abcInvalid), abcInvalid));
    
    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DictEnum(enumNum(ABC)).value2Symbol(abcValid))
        info(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;Enum with type %1 and integer value %2 (%3) is valid&quot;&lt;/span&gt;, typeOf(abcValid), enum2int(abcValid), abcValid));
    &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
        error(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;Enum with type %1 and value %2 is invalid&quot;&lt;/span&gt;, typeOf(abcValid), enum2int(abcValid)));
    
    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DictEnum(enumNum(ABC)).value2Symbol(abcInvalid))
        info(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;Enum with type %1 and integer value %2 (%3) is valid&quot;&lt;/span&gt;, typeOf(abcInvalid), enum2int(abcInvalid), abcInvalid));
    &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt;
        error(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;Enum with type %1 and value %2 is invalid&quot;&lt;/span&gt;, typeOf(abcInvalid), enum2int(abcInvalid)));
    
    &lt;span class=&quot;rem&quot;&gt;/*&lt;/span&gt;
&lt;span class=&quot;rem&quot;&gt;        Output:&lt;/span&gt;
&lt;span class=&quot;rem&quot;&gt;        3, C&lt;/span&gt;
&lt;span class=&quot;rem&quot;&gt;        4, &lt;/span&gt;
&lt;span class=&quot;rem&quot;&gt;        Enum with type Enum and integer value 3 (C) is valid&lt;/span&gt;
&lt;span class=&quot;rem&quot;&gt;        Enum with type Enum and value 4 is invalid&lt;/span&gt;
&lt;span class=&quot;rem&quot;&gt;    */&lt;/span&gt;
}&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/2293681400466349168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2015/08/how-to-check-if-base-enum-has-valid.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2293681400466349168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2293681400466349168'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2015/08/how-to-check-if-base-enum-has-valid.html' title='How to check if a Base Enum has a valid value'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-2573606238149600523</id><published>2015-06-03T13:40:00.000-07:00</published><updated>2015-06-03T15:06:17.965-07:00</updated><title type='text'>How to export/import your MorphX VCS settings and history</title><content type='html'>When using MorphX for version control, sometimes you need to restore a backup of a database, and you don&#39;t want to lose all of your check in/out history. &amp;nbsp;I wrote this job to export and import your MorphX VCS settings.&lt;br /&gt;
&lt;br /&gt;
Use at your own risk, but it&#39;s worked fine for me.&lt;br /&gt;
&lt;br /&gt;
Enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;br /&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; AKBackupMorphXVCData(Args _args)
{
    SysDataExport           sysDataExport;
    SysDataImport           sysDataImport;
    
    Dialog                  dialog = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Dialog();
    FormBuildRadioControl   fbImportExport;
    FormRadioControl        radioResults;
    
    dialog.addText(&lt;span class=&quot;str&quot;&gt;&quot;Warning, if you choose Import, this will replace your VCS data and is not reversible!&quot;&lt;/span&gt;);
    
    &lt;span class=&quot;rem&quot;&gt;// Add the radio button, name it anything&lt;/span&gt;
    fbImportExport = dialog.formBuildDesign().addControl(FormControlType::RadioButton, &lt;span class=&quot;str&quot;&gt;&#39;RadioButton1&#39;&lt;/span&gt;);
    fbImportExport.caption(&lt;span class=&quot;str&quot;&gt;&quot;Choose Import/Export&quot;&lt;/span&gt;);
    fbImportExport.items(2); 

    fbImportExport.item(1);
    fbImportExport.text(&lt;span class=&quot;str&quot;&gt;&quot;Export&quot;&lt;/span&gt;);
    
    fbImportExport.item(2);
    fbImportExport.text(&lt;span class=&quot;str&quot;&gt;&quot;Import&quot;&lt;/span&gt;);

    dialog.doInit();
    dialog.formRun().design().moveControl(fbImportExport.id());
    dialog.run();

    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (dialog.closedOk())
    {
        radioResults = dialog.formRun().control(fbImportExport.id());
        
        &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (radioResults.selection() == 0) &lt;span class=&quot;rem&quot;&gt;// Export&lt;/span&gt;
        {
                sysDataExport = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SysDataExport();
                sysDataExport.parmDoNotBypassDefIO(&lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);
                sysDataExport.parmServerAccess(&lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);
                sysDataExport.addTmpExpImpTable(tableNum(SysVersionControlMorphXItemTable), &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;);
                sysDataExport.addTmpExpImpTable(tableNum(SysVersionControlMorphXLockTable), &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;);
                sysDataExport.addTmpExpImpTable(tableNum(SysVersionControlMorphXRevisionTable), &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;);
                sysDataExport.addTmpExpImpTable(tableNum(SysVersionControlParameters), &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;);
                sysDataExport.addTmpExpImpTable(tableNum(SysVersionControlSynchronizeLog), &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;);

                &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (sysDataExport.prompt())
                {   
                    sysDataExport.parmFiletype(FileType::Binary);
                    sysDataExport.run();
                }
        }
        &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (radioResults.selection() == 1) &lt;span class=&quot;rem&quot;&gt;// Import&lt;/span&gt;
        {
            sysDataImport = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SysDataImport();

            &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (sysDataImport.prompt())
            {
                sysDataImport.parmLoadAll(&lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);
                sysDataImport.parmInclTablesNotPerComp(&lt;span class=&quot;kwrd&quot;&gt;true&lt;/span&gt;);
                sysDataImport.parmFiletype(FileType::Binary);
                sysDataImport.run();

                versioncontrol.init();
            }
        }
        
        info(&lt;span class=&quot;str&quot;&gt;&quot;Done!&quot;&lt;/span&gt;);
    }
}&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/2573606238149600523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2015/06/how-to-exportimport-your-morphx-vcs.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2573606238149600523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/2573606238149600523'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2015/06/how-to-exportimport-your-morphx-vcs.html' title='How to export/import your MorphX VCS settings and history'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3546795444588179926.post-7929264176576238597</id><published>2015-06-03T13:27:00.000-07:00</published><updated>2015-06-03T13:27:26.517-07:00</updated><title type='text'>Dynamic dialog controls at runtime</title><content type='html'>This is a job that demonstrates how to dynamically add controls (specifically radio button) to a dialog at runtime and also change their position and access their values.&lt;br /&gt;
&lt;br /&gt;
You can use this style in custom advanced UI builders.&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: Consolas, &quot;Courier New&quot;, Courier, Monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #a31515; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}

.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; AKDynamicDialogExample(Args _args)
{
    Dialog                  dialog = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Dialog();
    FormBuildRadioControl   fbRadioControl;
    FormRadioControl        radioControl;
    
    &lt;span class=&quot;rem&quot;&gt;// Add the radio button, name it anything&lt;/span&gt;
    fbRadioControl = dialog.formBuildDesign().addControl(FormControlType::RadioButton, &lt;span class=&quot;str&quot;&gt;&#39;RadioButton1&#39;&lt;/span&gt;);

    &lt;span class=&quot;rem&quot;&gt;// Set radio basic properties&lt;/span&gt;
    fbRadioControl.caption(&lt;span class=&quot;str&quot;&gt;&quot;Test Radio Buttons&quot;&lt;/span&gt;);
    fbRadioControl.items(2); &lt;span class=&quot;rem&quot;&gt;// This is needed&lt;/span&gt;

    fbRadioControl.item(1); &lt;span class=&quot;rem&quot;&gt;// Switch to first item&lt;/span&gt;
    fbRadioControl.text(&lt;span class=&quot;str&quot;&gt;&quot;Item 1&quot;&lt;/span&gt;); &lt;span class=&quot;rem&quot;&gt;// Set first item&#39;s text&lt;/span&gt;
    
    fbRadioControl.item(2); &lt;span class=&quot;rem&quot;&gt;// Switch to second item&lt;/span&gt;
    fbRadioControl.text(&lt;span class=&quot;str&quot;&gt;&quot;Item 2&quot;&lt;/span&gt;); &lt;span class=&quot;rem&quot;&gt;// Set second item&#39;s text&lt;/span&gt;

    &lt;span class=&quot;rem&quot;&gt;// This is needed to instantiate the FormRun&lt;/span&gt;
    dialog.doInit();

    &lt;span class=&quot;rem&quot;&gt;// Just passing one argument moves it UP.&lt;/span&gt;
    &lt;span class=&quot;rem&quot;&gt;// So this moves it UP above the &quot;OK/Cancel&quot; buttons created&lt;/span&gt;
    dialog.formRun().design().moveControl(fbRadioControl.id());

    dialog.run();

    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (dialog.closedOk())
    {
        &lt;span class=&quot;rem&quot;&gt;// You need to access it from the formRun() with the correct&lt;/span&gt;
        &lt;span class=&quot;rem&quot;&gt;// form control&lt;/span&gt;
        radioControl = dialog.formRun().control(fbRadioControl.id());
        info(strFmt(&lt;span class=&quot;str&quot;&gt;&quot;%1&quot;&lt;/span&gt;, radioControl.selection()));
    }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.alexondax.com/feeds/7929264176576238597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.alexondax.com/2015/06/dynamic-dialog-controls-at-runtime.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/7929264176576238597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3546795444588179926/posts/default/7929264176576238597'/><link rel='alternate' type='text/html' href='http://www.alexondax.com/2015/06/dynamic-dialog-controls-at-runtime.html' title='Dynamic dialog controls at runtime'/><author><name>Alex Kwitny (Kwitwell.com)</name><uri>http://www.blogger.com/profile/12458072273859749789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbgyjbCPokEPukZAvC5cm_Uqr15UXAUC6kq8scGBLAPJAmARIdhNpo9So5D8hjSqjJkAdZ7EJQ1i3uMMnmdjoAKc6KdWfBVqt6MLaNeLuEiv86Eumr9HPG6AGmouuD33A/s113/Me.JPG'/></author><thr:total>1</thr:total></entry></feed>