Microsoft Dynamics Lifecycle Services are designed to manage and optimize customer implementations – powered by Azure. The customer creates project workspaces for implementation, upgrade and maintenance activities, and will invite implementation experts from partner organizations and Microsoft into these workspaces for the execution of related activities. Partners will be able to create projects for learning and presales purposes. This enables partners to build out expertise around Lifecycle Services, and demonstrate this in sales cycles.
Take it for a test drive @ https://lifecycleservices.dynamics.com.
Business process modeler
CODE & UPGRADE ANALYSIS
License sizing estimator
Update 4th of August 2014: Clarification of the AX runtime behavior when non-developers hit an assert statement.
“In computer programming, an assertion is a predicate (a true–false statement) placed in a program to indicate that the developer thinks that the predicate is always true at that place.”
What would you rather have: A piece of source code with or without assertions? I’d definitely prefer source code with assertions – it makes the code easier to read, debug and troubleshoot.
My recommendation is to use assertions in X++ when all of the following are true:
Assertions and error handling are two different things.
In a nutshell, it should be possible to write unit test for error handling – but not for assertions.
Assert statements takes time to write and read – and if the condition they are asserting is obviously always true, then the assertion is pure clutter – and we are better off without it.
A failing assertion is an indication of a problem with the implementation. Something within the component – regardless of input from the outside world – is broken and needs fixing. Typically, I’d use assertions for input validation in private methods, and exceptions in public methods. Conversely, you don’t want consumers of your component to be hit by assertions – regardless of how they use your component.
Assert statements in X++ are a little special, as the X++ compiler always includes assert statements. In other languages (like C#) you can have multiple compiler targets – and typically the release build would not include the assert statements. In AX when a non-developer is hitting an assert statement, then the runtime will suppress eventual errors. I.e. in a production system assert statements have no functional impact.
Given assert statements in X++ are always evaluated, and thus degrades performance, they should be used with a bit of caution. If the condition can be verified with minimal overhead – for example that a variable has a certain value – then there is no problem. However; if the assertion requires execution of complex logic, RPC or SQL calls then it should be avoided, due to the performance impact. In cases where the performance impact is significant, but you don’t want to compromise on assertions, the assertions can be wrapped inside a call to Debug::debugMode().
“without any method calls” is just a guiding principles. Sometimes it makes sense to factor the condition into a Boolean method – for reuse or for clarity – here I would not object.
Here is an example of good use of assertion in X++:
private void markDetailRecordAsEdited( RecId _journalControlDetailId, RecId _draftConstraintTreeId)
Debug::assert(_journalControlDetailId != 0);
Debug::assert(_draftConstraintTreeId != 0);
if (! modifiedDetailRecords.exists(_journalControlDetailId))
modifiedDetailRecords.insert( _journalControlDetailId, _draftConstraintTreeId);
Here is another example where Debug::debugMode() is used:
private void render()
Debug::assert(this.hierarchyCount() > 0);
Debug::assert(segments != null);
Debug::assert(totalSegmentCount > 0);
I once saw a t-shirt with this print on the front: “If debugging is the process of removing bugs, then programming must be the process of putting them in”. I wish the back had read: “Programming with assertions is one way to keep bugs out.”
Read more here.
There is a coding pattern that has been proliferating the X++ code base for years. It is not an X++ best practices – nor is it object oriented; yet it is used quite heavily (unfortunately). Consider a simple class hierarchy with an abstract base class and 3 derived classes. A typical implementation of a factory would be a static method on the base class, like this: (Please ignore the type of the parameter – it could be anything, I choose str for simplicity)
Now; the problems with this approach are many.
The coupling between the 4 classes spells trouble. If you try to modularize an application written like this, you will quickly realize that the pattern above is bad. You cannot have references from lower-level models (aka. assemblies/modules) to higher-level models. Yet; having a single factory method is valuable and a good practice.
SysExtension Framework to the rescue.
Consider you decorate the subclasses with an attribute, like depicted here:
Then you can rewrite the factory method to this:
The extension framework returns an instance of the right subclass automatically. It uses the attribute to determine which subclass instance to create. Quite simple – extraordinary powerful!
A few words of caution: There is a small performance impact on cold systems when using the SysExtension framework. In most cases you will not notice it; however – for performance critical paths, you should measure the impact of this change before going for it.
To learn more about the SysExtension framework see here.
The next keynote was by Vadim Korepin – who among other things gave Navicon’s expectations to future AX versions.
Vadim is also my host for the conference, and he has been the main translator of the Russian version of Inside Dynamics AX 2012. He has done a great job, and I’m sure he will be tired tonight.
During lunch there was a book signing session. The excitement around the book truly amazed me – I stopped counting how many hands I’ve shaken and how many dedications I’ve written.
Tonight I’m having a tradition Russian/Ukrainian dinner with developers from the Russian community.
I’ve been invited to speak at the Navicon AX Fair in Moscow on June 7th 2013. I’m looking forward to my first visit to Russia – and meeting customers and partners, who are as excited about AX 2012 as I am.
If you are in the neighborhood and want to join the Fair, make sure to sign-up here.
Microsoft will be co-locating the current two offices in Hellerup and Vedbæk (MDCC) to Lyngby. According to plan the new facilities should be ready for operation in 2015. The new domicile will be near DTU (Danish Technical University) and the shopping mall, restaurants, cinemas and sports facilities in Lyngby.
It is the internationally recognized Henning Larsen Architects from Denmark who have designed the new domicile Henning Larsen Architects are known for creating the Copenhagen Opera House.
Oh yes, I’m looking forward to moving in.
I think the book is great for several reasons:
A big “Thank You!” to the team behind the book for increasing the AX community’s knowledge: Klaas Deforche, Kenny Saelen, Palle Agermark, José Antonio Estevan and Tom Van Dyck.
If you, like anyone else, want to get your hands on R2 – here are the links for customers and partners.
R2 is an incredible engineering achievement. Let me mention just one remarkable improvement: We have collapsed all GLS layers into the SYS layer. This means that for the first time you can have one instance supporting local requirements in 41 countries simultaneously. Learn more here. I’m proud to have been part of the team making it happen.
With any great product launch a lot of material is made available. That is also true for R2 – and yet something stands out. In collaboration with Microsoft Studios a number of short videos have been created. I think they are truly amazing – what do you think? Try out the links below.
Question What does it feel like to be in control, highly responsive, agile, connected and dynamic?
Answer Explore in the lives of a; CIO, CFO, HR Manager, Practice Manager, Retail Manager and a COO of Manufacturing.
For more information see http://www.microsoft.com/en-in/dynamics/erp-ax-2012-r2.aspx
Microsoft Dynamics AX 2012 R2 has successfully passed compatibility testing and has achieved the “Compatible with Windows 8” certification.
The Compatible with Windows 8 certification means that the product has passed Microsoft testing criteria for compatibility with Windows 8. The Microsoft Windows Compatibility and Certification program defines a set of compatibility test cases that must be completed successfully-covering areas of Compatibility & Resiliency, Adhere to Windows Security Best Practices, Support Windows Security Features, Adhere to System Restart Manager Messages and perform a Clean, Reversible Installation. The testing is performed using Microsoft’s automated Application Certification framework and tools.
Microsoft Dynamics AX 2012 R2 is now listed among the products that have been certified on the Microsoft Windows compatibility center site.