Code highlighting

Showing posts with label Microsoft Dynamics AX. Show all posts
Showing posts with label Microsoft Dynamics AX. Show all posts

Thursday, March 30, 2017

Development tutorial: Platform improvements for handling X++ exceptions the right way

A while back I wrote about a pattern we discovered in X++ code which could lead to serious data consistency issues. You can read it again and look at an example mfp wrote up here:
http://kashperuk.blogspot.dk/2016/11/tutorial-link-handling-exceptions-right.html

With the release of Platform update 5 for Dynamics 365 for Operations we should now be better guarded against this kind of issue.

Let's look at the below example (needs to be run in USMF company):

class TryCatchAllException
{
    public static void main(Args _args)
    {
        setPrefix("try/catch example");

        try
        {
            ttsbegin;

            TryCatchAllException::doSomethingInTTS();

            ttscommit;
        }
        catch
        {
            info("Inside main catch block");
        }

        info(strfmt("Item name after main try/catch block: %1", InventTable::find("A0001").NameAlias));
    }

    private static void doSomethingInTTS()
    {
        try
        {
            info("Doing something");
   
            InventTable item = InventTable::find("A0001", true);
            item.NameAlias = "Another name";
            item.doUpdate();

            throw Exception::UpdateConflict;

            // Some additional code was supposed to be executed here
        }
        catch
        {
            info("Inside doSomething catch block");
        }
  
        info("After doSomething try/catch block");

    }

}

Before Platform Update 5 the result would be:


As you can see, we 
  • went into doSomething()
  • executed the update of NameAlias for the item, 
  • then an exception of type UpdateConflict was thrown
  • At this point the catch-all block caught this exception without aborting the transaction, meaning the item is still updated. We did not abort the transaction because we did not think about this case before
  • We exit the doSomething() and commit the transaction, even though we got an exception and did not want anything committed (because the second part of the code did not execute)
  • As a result, the NameAlias is still modified.

Now with Platform Update 5 the result will be:

That is, we

  • went into doSomething(),
  • executed the update of NameAlias for the item,
  • then an exception of type UpdateConflict was thrown
  • At this point the catch-all did not catch this type of exception, as we are inside a transaction scope, so the exception was unhandled in this scope, and went to the one above
  • Since we are by the outer scope outside the transaction, the catch-all block caught the exception,
  • and the NameAlias is unchanged


So, again, we will simply not handle the 2 special exception types (UpdateConflict and DuplicateKey) any longer in a catch-all block inside a transaction scope, you will either need to handle them explicitly or leave it up to the calling context to handle.

This will ensure we do not get into this erroneous code execution path where the transaction is not aborted, but we never handle the special exception types internally.

Hope this helps!

Thursday, November 24, 2016

Tutorial Link: Handling exceptions the right way in X++

Michael and I have been working the last couple of weeks to uncover some of the difficult to repro bugs in Warehouse management code, and one of the things we discovered is a pattern which can lead to very unpredictable behavior when used incorrectly.

I encourage all of you to read it and make sure all of your code is up to standard.

https://blogs.msdn.microsoft.com/mfp/2016/11/24/x-the-catch/


Thanks!

Friday, June 10, 2016

Tutorial: Moving inventory out of a location to complete a put away inbound operation

Introduction

As some of you have probably already read in this blog post, we have recently made some improvements for the inbound flow in Warehouse management, and I wanted to do a quick recording demoing an example which uses some of these capabilities.

For some additional information about the different types of movement flows currently supported please follow to another blog post we've recently published.

Another reason for publishing this particular scenario recording is that we are currently working on another improvement, this time focusing on adding more flexibility for inventory movement operations, where there are work reservations blocking the items in the location from being moved anywhere else. This is a known pain point for a number of customers, and if all goes well, we'll have it addressed in the Fall release of the new Dynamics AX.

The scenario recording is covering one such flow, except for the fact of existing work reservations - in my example there will be none.

I am trying out uploading this to Office Mix, as well as YouTube. Let me know if you like the Office Mix approach - I think it's pretty cool as it makes it possible to browse the recording to a specific point more easily.

Demo





YouTube video:
https://www.youtube.com/watch?v=P7W2Th43-Fo

Question for you

As you can see from the above video, the approach John took is to cancel out of the Put, complete the movement, and then continue the Put.
An alternative could be to complete the put, even though physically the goods are not yet placed into the location, and then create the movement, but in this case we are for a period of time out of sync with the app.

Please leave a comment if the above approach is not a good match for your company, and explain what approach you use instead and why.

Thanks!

Monday, May 16, 2016

Announcement: Links to Technical Conference session recordings available on Learning Portal

As I mentioned in one of my previous posts (http://kashperuk.blogspot.dk/2016/02/announcement-technical-conference-2016.html), I presented a number of things at the recent Tech Conference around the new version of Microsoft Dynamics AX.

If you are interested in learning about AX "7" and have missed the Tech Conf, you can watch recordings and view session content online now.


All of the recordings from Tech Conf 2016 are available on Learning Portal


More specifically, if you are interested in one of the sessions I advertised earlier, here are direct links:
(Copy/pasting my original session descriptions below)



Good content in all of these and detailed descriptions throughout, so take a look and let me know what you think.

Thanks!






Saturday, February 20, 2016

Announcement: Technical Conference 2016 - See you there

Hi all

I am flying out to attend Technical Conference 2016 tomorrow morning. The conference is held in Seattle this year, and if you have not yet signed up, well, it's probably already too late :)
I hear there are at least 1300 participants coming this year, and we have a wide variety of sessions planned.
If you want to stop by and say hi, I'll be presenting a few things this year, and you can find the schedule online:

  • An instructor led lab on building workspaces, a new concept in the latest version of Dynamics AX. This comes in two parts, 1 hour long each, and as a result you will have built a fully functional workspace with Tiles, Lists and Charts.
  • An instructor led lab on integrating with the OData endpoint exposed by Dynamics AX with the help of the Data Entities. This is the future of many integration scenarios for AX, so don't miss your chance to learn how it's done.
  • A breakout session talking about a highly discussed topic of what kind of skillset is required for AX developers with the move to the latest AX version. 
  • A breakout session talking about Warehouse management functionality in AX, more specifically, installing, configuring and using the Warehouse Mobile Devices Portal with the cloud release of Dynamics AX.
  • A round table discussion on inbound and outbound ASN. We'd like to collect your feedback on the ASN solution in the release as of right now, and understand the use cases / tools you rely on for using ASN in your current implementations

See you all there!

Friday, February 05, 2016

Tips: Configuring Warehouse Mobile Devices Portal after installation on CTP7 and CTP8 builds of the latest Dynamics AX release

Introduction

Over the last couple of months we have had a number of customers go live on the latest version of Microsoft Dynamics AX, and some of them have decided to use the Advanced Warehousing solution including the Warehouse Mobile Devices Portal (WMDP) that is shipped together with AX.

In my last post I provided links for how to install and use the portal:
http://kashperuk.blogspot.dk/2016/01/tutorial-warehouse-mobile-devices.html

Here I would like to focus on a few aspects we've learnt based on interaction with the Go-Live customers, that will hopefully help some of you to avoid the same problems.

Tip 1

In CTP7 and CTP8 (in case you don't know what CTP stands for, read wiki) WMDP was not strongly signed. That means that on your environment after installation, you could receive an error like below (In Event Log):

Exception information: 
    Exception type: ConfigurationErrorsException 
    Exception message: Could not load file or assembly 'Microsoft.Dynamics.AX.Whs.Web, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. Strong name signature could not be verified.  The assembly may have been tampered with, or it was delay signed but not fully signed with the correct private key. (Exception from HRESULT: 0x80131045)

In the final (RTW) release of Microsoft Dynamics AX the assembly is strongly signed.

But if you are on CTP7 or CTP8, you can refer to one of the below solutions:

Solution 1

One thing you can do to resolve this is sign the assembly, using the strong name tool in a command like the following:

C:\Program Files (x86)\Warehouse Mobile Devices Portal\DEFAULT\bin> sn -Vr .\Microsoft.Dynamics.AX.Whs.Web.dll

This is the preferred approach.
For test environments, you could also just go with Solution 2

Solution 2

You can also just disable strong name verification on the machine you are testing out the portal on, by modifying the registry with commands below (for x86 and x64):

reg DELETE HKLM\Software\Microsoft\StrongName\Verification /f
reg ADD HKLM\Software\Microsoft\StrongName\Verification\*,* /f
reg DELETE HKLM\Software\Wow6432Node\Microsoft\StrongName\Verification /f
reg ADD HKLM\Software\Wow6432Node\Microsoft\StrongName\Verification\*,* /f 

Or, if you want to limit the scope of allowed non-signed assemblies, you can restrict it to just the WMDP dll in the above ADD commands like below:

reg ADD HKLM\SOFTWARE\Microsoft\StrongName\Verification\Microsoft.Dynamics.AX.Whs.Web,31bf3856ad364e35

reg ADD HKLM\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\Microsoft.Dynamics.AX.Whs.Web,31bf3856ad364e35 

If you want to learn a bit more (or get a ready PowerShell function for the above), refer to this blog post.

Tip 2

WMDP is an ASP.NET MVC based web site and has a number of important configuration options in its web.config file. You can read more about the configuration options on MSDN.
One particular setting is important to note, since it is believed that it has an "incorrect" value by default after installation in AX 2012 CU8 build.

The setting is customErrors, and you can read all about it on MSDN

In production environments, this setting should always be set to "On", as WMDP X++ code in some cases throws unhandled exceptions, which result in a complete meltdown of the web site, if not redirected correctly to a user-friendly error page. 
The "Off" setting can be used on test environments when debugging the site, as it will provide call stack information for what happened. 

Hope this helps!

And let me know if you have additional tips to add here about WMDP, I will gladly add them here

Thursday, January 28, 2016

Tutorial: Warehouse Mobile Devices Portal for the latest version of Microsoft Dynamics AX

A lot of people have been trying to use the Warehouse Mobile Devices Portal (WMDP in short) on the latest version of AX (on various CTP builds we've released), and have been having a lot of trouble with that.

We've finally published the wiki article on installing the portal on a clean environment, that contains step by step instructions on how to download the installer, and how to configure it after installation to connect to the AOS. It's available here:
https://ax.help.dynamics.com/en/wiki/warehouse-mobile-devices-portal-for-microsoft-dynamics-ax/


Also, for those who just want to quickly execute some warehouse work and are used to the WMDP emulator form - that one is still available, and can be accessed very easily through the following link

https://usncax1aos.cloud.onebox.dynamics.com/?mi=action:WHSWorkExecute&cmp=usmf

(where you need to replace usncax1aos.cloud.onebox.dynamics.com with the URL of your AX)


Hope this helps!

And let us know if you have feedback on the installation instructions wiki page through whatever way you prefer.

Thanks!

Thursday, January 07, 2016

Learn more about the new release of Microsoft Dynamics AX

There's a public Wiki for latest release of Microsoft Dynamics AX

Please check it out, it has some content already, and more will be added over time as we near the public release.

The idea is that community members will also be able to add content there.

https://ax.help.dynamics.com/en/

Tuesday, January 05, 2016

Tutorial: Locations with open work exceptions in the new release of Microsoft Dynamics AX

Background

Microsoft Dynamics AX or, for that matter, any ERP system relies heavily on the information entered by the users. But, as we all know, in real life the data in the system frequently gets out of sync with the actual state of things.
In the Warehouse management module, when work is created, it is based on the on hand information (what we have and where we have it) as reported in the system. When work is executed, however, a real person, namely a warehouse worker, goes (or drives out) to the specified warehouse location to pick up the goods. But what if the item is not actually there? These kinds of discrepancies in AX 2012 are reported as work exceptions. Depending on your system configuration, the warehouse worker can create a work exception of one of the following types:
  • Override the location and search or directly input a new location, if the worker has knowledge of where else to find this item
  • Register a ‘short pick’, simply picking less than instructed, and rely on AX to handle the remaining pick requirements. You can read about this type of work exception in my previous blog post at http://kashperuk.blogspot.com/2015/07/tutorial-short-pick-goods-on-mobile.html
As a result of these worker actions a work exception would be recorded in the Work exception log. Now, that’s good, but no follow up would happen on these exceptions unless somebody explicitly went in and investigated the log, looking for patterns and possible ways to re-route or cancel the work one entry at a time.

Solution

With the release of new Dynamics AX we decided to do something about that. Relying only on that same information already recorded by the system (a few minor enhancements were done, where we now capture even more info) we have built a form for the Warehouse planner, where he can get an overview of any on-hand discrepancies in warehouse locations and take appropriate action on any exceptional situations right away, potentially avoiding delays in delivery of goods.

In this post I would like to walk you through the capabilities of this advanced form, which we called “Locations with open work exceptions”. Here is what it looks:


Locations with open work exceptions

The form’s primary purpose is to show the locations with problems, so the warehouse planner can do something about them, whether it is re-count, re-route, cancel work, etc. We show locations, where one or more work exceptions have been recorded and the state of the work exception is Open. A work exception is only relevant, if it has not yet been investigated, therefore we only show locations with Open work exceptions, also giving the warehouse planner the ability to mark the work exceptions as ‘investigated’ or ‘resolved’ by closing them.

The focus of this form is to streamline the outbound waves, so we only show work exceptions recorded during Transfer order and Sales order picking, limiting it even further to only the initial picks in the warehouse. So we do not, for example, display purchase order receipts, or exceptions recorded at the baydoor where the worker had to override the location as the lane was already full.

It’s a pretty large form with A LOT of data being shown. Let us walk through it from the warehouse planner’s standpoint, touching upon all of the supported scenarios. Once you get familiar with the different sections in the form, it actually gets pretty easy to navigate it.

Section 1. Understand the urgency

The warehouse planner needs to get an overview of the locations, where open short pick or location override work exceptions are currently logged. He needs to understand the urgency of following up on the exception to ensure the on-hand information is accurate for each of these locations. In order to do so the warehouse planner needs to understand the following:

  • When is the first work order line scheduled to be loaded (The scheduled load shipping date and time)? This is the date and time, when the load containing one of the pending work lines needs to be shipped, which drives how fast you need to ensure sufficient on-hand is available for picking on that location.
  • What is the location Id and which warehouse zone is this location in? For example, we might want to just ignore exceptions in certain zones of the warehouse, relying instead on periodic replenishment jobs.
  • What is the number of open work order lines for this location? That is, what other workers are going to come to pick something from this location in the near future. If there are none, it might mean that the urgency for follow-up on this location is much lower.
  • What is the date and time stamp of the last work exception logged for this location? That is, how recent is the report, maybe it has long since been resolved through other means like periodic (min/max) replenishment.
  • When was this location last counted? If it was counted recently, the work exception might not be relevant any longer. For example, if the date of the last count was after when the last work exception had been reported.
  • How many work exceptions were logged for this location and of which type? This could allow the warehouse planner to determine (depending on the business flows in the company) if there are any shipments that will be short, or if users were able to find on-hand somewhere else through overriding the location, in which case it might not be as urgent to follow up on this.
    • He can also drill down and look at the details of all the open work exceptions for this location, e.g., to see which orders are impacted.

The information described above is available in the grid on the left side and in the topmost fast tab, as shown in the screenshots below. 

You can use the built-in Quick Filter above the grid, as well as the Filter pane to narrow down the list to show only those locations that need an urgent follow-up. 

The Open work exceptions button will open the existing Work exceptions log form pre-filtered to the warehouse location currently selected.



Section 1. Navigation grid



Section 1. Location and Exception details
Section 1. Location and Exception details


The warehouse planner also has the ability to close all the work exceptions for the selected location. This way he can, for example, filter out all the ones that he’s not interested in, and update them to Closed one by one, using the Close work exceptions button above the navigation grid. Multi-selecting records in this grid is, sadly, not available.

Depending on the information presented the warehouse planner might decide that a re-count of the on-hand is in order, as a mitigation step for the work exception. He can create cycle counting work by location or by product, if he thought this would actually take care of the work exception reported. He could then close the exception and move on to the next location with problems.

Section 2. Understand which products have problems


OK, now that the warehouse planner has filtered out the relevant work exceptions, he can start to investigate them one location at a time. 
Each location can have one or more products stored on it. The warehouse planner can in the grid under Released products with exceptions see the list of all the products (the definition of course includes the product dimensions for each of them), as well as the inventory status and tracking dimensions for each product. He can then for each product review additional information to understand what can be done or if anything should be done at all.

Section 2. Released products with exceptions
Section 2. Released products with exceptions

Section 3. Understand immediate product demand

The above section also shows the quantity totals for the selected product on this location, allowing Wayne to quickly estimate the overall product demand and quickly judge if he can actually do something about the shortage:
  • Quantity of this product available on this location, as registered in the system. This might be useful if it was just a worker mistake, and counting could confirm or deny the correctness of the recorded on-hand quantity in the system, for example.
  • Quantity of this product needed on this location, as based on all open work order picking lines.
  • Quantity of this product incoming to this location, e.g. purchase order put away work lines, that could satisfy the pending demand for the product.
  • Quantity of this product available in other locations on the warehouse, that we could use to satisfy the demand directly or replenish the stock in this location.
The warehouse planner can then for the selected product and related inventory dimensions see all pending pick work lines, allowing him a quick overview of potential work exceptions in the near future if nothing is done. Two important pieces of information here, apart from the quantity required, are the Scheduled load shipping date and time, to judge necessary quantity availability, as well as the Blocked wave flag. If the work line is still blocked, it means we have a bit more time before the quantity must be available. 
Wayne can navigate to see the Work details for the selected line, if the information displayed in the grid is not sufficient for making the decision. He can also cancel one or more of the shown work lines using the Cancel work line button. He could choose to cancel the pending picks if, for example, there is in fact no quantity available to pick from / replenish from, meaning we won’t be able to complete this pick anyway, so there is no point in sending a worker over there and just getting a new short pick work exception created.


Section 3. Work order lines for selected product
Section 3. Work order lines for selected product

Section 4. Understand product availability at the warehouse

The warehouse planner needs to understand if he can make an emergency replenishment of the selected product to the selected location, thus satisfying the pending picks from there. The On-hand inventory for selected product fast tab allows him to do that by providing an overview of on-hand inventory available for the selected product (including all above inventory dimensions) at other locations at the same warehouse. 

Section 4. On-hand inventory for selected product

He can then select one of the locations with available on-hand and Create inventory movement work manually scheduling a move of inventory with all the relevant information pre-filled to move the goods to the location that is short. Note that only the on-hand that can actually be moved from the location is shown, meaning on-hand reserved for some other work, for example, is excluded.

Note, that a flag Has open work exceptions is displayed in the grid, which shows if there currently exists an open work exception for that location. The warehouse planner would potentially avoid trying to replenish from such locations, as the inventory on-hand registered in the system for that location seems to be wrong too, so the replenishment might fail, causing even more problems.

Conclusion

As you hopefully can see, this is a new awesome decision center for the Warehouse planner when it comes to handling exceptional situations in the picking flow. It is a very control-heavy form, but hopefully the above description helped clarify the intention behind all of the data shown.

Please let me know if you have questions or suggestions on how to improve the user experience / extend the flow here.

P.S. You can also view this blog post in Word if you want by following this link

Friday, October 28, 2011

Tutorial: AX 2012 - Invalid field access or Accessing unretrieved fields

Read the post all the way until the end - there's an ask for you guys there!

As many of you have already seen in the new AX 2012 release, there are a lot more tables present in the application, because we went through an exercise of normalizing the data model.
Another feature that was added at the same time was the Table Inheritance, allowing to sub-class tables and add additional fields reusing some of the behaviors of the base table.

All of it is great! The only problem with it is that it comes at a price - we now need to retrieve a lot more data and do a lot more joins between tables. So we tried to mitigate that by using field lists where possible and adding AdHoc query support, which basically eliminates unneccessary joins between tables from the hierarchy, if fields from these tables are not selected.

We have also implemented a number of things that allow us to clearly see if the field was selected in the user interface, the APIs needed for doing the same, as well as special handling for invalid field access.

This tutorial contains a form, which showcases the different aspects of data access in cases described above.
You can download the project with the tutorial from my SkyDrive.

On the first tab, we have the standard "On hand" view, which in the data model is a join between InventSum and InventDim, with group by clauses on selected fields, in this case, ItemId from InventSum and InventLocationId from InventDim, and aggregation on the AvailPhysical column.
As you can see from the screenshot below, the rest of the InventDim fields are shown as Unretrieved. So, naturally, accessing one of them from code, for example, should not be a legal operation.
To verify that statement, there are 2 buttons on the form, the Incorrect and the Correct was of accessing the field. Clicking on the first one simply tries to read the value out of the InventSiteId field, while the second one uses the API method TableBuffer.isFieldDataRetrieved() to first verify if the field can actually be accessed.

Note, that in the below example, both buttons will work, as in, there won't be any errors shown to the user. When accessing the field, even though it is not retrieved to the client, the value will be treated as the default value for that type, that is, an empty string.

In order to verify that we do not access fields in an invalid way like above, we have introduced a parameter, that will throw an exception if a field that was not retrieved is being accessed.

In order to enable this validation, you need to update the below shown parameter in the Server configuration form (Located under System administration \ Setup \ System). After changing the value (note, that it is per AOS) you need to restart the AOS for the changes to take effect.


Now, if you try to use the first button (under Incorrect) from above, you will get a stack trace, notifying you that the specified field was not retrieved.



We suggest that when testing your modifications in the application, you always have that flag enabled, so as to avoid unpleasant and hard-to-find bugs later on in the production environment.


On the second tab of the Tutorial form, the same type of information is presented, only this time the output is actually based on a new table inheritance structure I created.


The base table, GenericBall, contains 2 characteristics of any ball. SoccerBall is extending it and adding an additional characteristic (for the sake of the example, let's assume Brand is only relevant to soccer balls). This is basically a very simple table inheritance structure.

In the form, however, I am only selecting to view the Brand field from SoccerBall, not selecting the other 2 fields from the base table. As expected, they show up as Unretrieved in the user interface.
However, there is one difference in how Scsc tables are handled - and that is, they will always throw an exception when you try to access one of the unretrieved fields.
The two buttons above the grid demonstrate that. Try it out, enabling/disabling the server configuration parameter shown above.


That's pretty much all there's to it. Let me know if you have any questions.

Now, I have one thing to ask you all too.
We in the AX Test team have done our best to find invalid field access problems before the release, but if you find one using the approach above, please log it either through the standard Microsoft channels (partner/ MsConnect/ etc.), or as a comment directly under this blog post.

Thank you!

Saturday, May 07, 2011

Tutorial: Table Relation properties in AX 2012

As many of you already know, Microsoft has put in a lot of effort into normalizing the tables in AX 2012 and consolidating all the data modeling tools in one place - the table itself. As part of this effort, a number of new properties have been introduced on Tables, and in this post I would like to cover some of them, namely the properties on Table Relations.

The new properties you will find on a Table Relation in AX 2012 are:
  • Cardinality
  • RelatedTableCardinality
  • RelationshipType
  • Role
  • RelatedTableRole
  • UseDefaultRoleNames
  • CreateNavigationPropertyMethods
  • NavigationPropertyMethodNameOverride

Hua Chu from the AX team has written a Guideline document, explaining how these properties should be set for Relations you add to Tables in AX. Note that in AX 2012 most of the above information is not actually used at runtime. This is something that will happen in future releases.
I have modified the document so that it contains the information relevant for partners and customers extending the standard application and have uploaded it to my OneDrive.

The document requires certain knowledge of Entity Relationship Modeling (ERM) and UML notation.

Disclaimer:
This document is intended as a guideline only, and should not be used as a Step-by-Step instruction.
Changes to any of the described functionality might still happen before AX 2012 RTM.


Your feedback and questions are, as always, welcome.

Monday, April 11, 2011

Microsoft Dynamics AX 2012 Beta now available for download - please share your feedback

As some might have noticed, I was quiet for quite some time now. I won't go into much detail as to why. What I want to say is that I along with a number of dedicated people have been hard at work on the release of a solution for Process Manufacturing and Distribution industry, which is also available in Beta through the below links.

Those of you working in this industry, I would be grateful for your feedback on our work so far, as well as any bug reports or design change requests for the RTM version or future releases.
Any other feedback, especially on the development tools and environment, is also welcome, of course.


Virtual Machine: 

https://mbs.microsoft.com/customersource/downloads/servicepacks/AX2012DemoToolsMaterials


Installable bits (ISO & IS IExpress pkgs):

https://mbs.microsoft.com/partnersource/support/selfsupport/productreleases/AX2012Beta

MSDN Dev Center:



TechNet Library:

Wednesday, July 07, 2010

Advertisement: MDCC is looking for talent!

Hello, all.

Microsoft Development Center in Copenhagen has a number of open positions for Software Development Engineers in Test (SDETs), to work in the team responsible for shipping the latest version of the Microsoft Dynamics AX product.

Below is a detailed description of one of the currently open positions (SDET II role). Salary level and title are based on your education, number of years of experience, etc., nothing new here. Dynamics AX background is, of course, a plus (I assume this applies to all my readers).
The Microsoft Dynamics AX product group has an open position for a Software Development Engineer in Test (SDET) within our supply chain management teams. The position provides unique opportunities for professionals with a diverse background of business acumen and software engineering to work on one of the fastest growing Enterprise Resource Planning (ERP) products in the market.

Responsibilities:
Write and review technical requirements and design documents
Plan, design, and write code for automated tests of features within the supply chain management features of Dynamics AX
Create and use test tools and processes to both increase effectiveness in the daily work and assure quality of the product
Collaborate with other engineers to ensure all feature areas achieve the desired high level of innovation and quality our customers demand.

Requirements:
We are looking for engineers with a strong background in object oriented development. Experience with business applications or ERP solutions are pluses.

Software development experience, particularly within C#, C++ or similar object oriented programming languages
Strong technical and analytical skills
Excellent problem solving and design skills
Ability to work independently - and in teams
An excellent command of written and spoken English
Experience with Microsoft Dynamics AX or ERP products is a plus
Experience with X++ (a Dynamics AX language) is a plus
Software testing experience with an organized and structured approach is also a plus

We are also looking for less experienced people for the IAESTE student program, so all you excellent Computer Science students, interested in developing business applications and working for one of the world's leading software companies, welcome!

If you are interested in applying for the positions, please e-mail me your up-to-date CV at ivan.kashperuk(@nospam)hotmail.com

An additional request I would like to make is to leave a comment here, if you are invited to an interview, describing how it went, how you were treated, and what your impression was of the entire process, the MDCC campus, the interviewers, etc. This will help us make improvements in our hiring process, so I am really waiting for your comments. Note that anonymous comments are allowed.

Some additional information about MDCC:
Microsoft Development Center Copenhagen (MDCC) was created in 2002 following the acquisition of the Danish company Navision. Today, it has grown to be Microsoft’s biggest development center in Europe and a spearhead in the European IT industry. MDCC is Microsoft’s Center of Excellence for Supply Chain Management and drives the development of several of the Microsoft Dynamics ERP (Enterprise Resource Planning) products. Our products enable companies throughout the world to optimize the planning of their resources – and increase their revenues.

Today, the development center gathers around 650 people from more than 40 different countries. Every third employee is a non-Dane and that makes MDCC to one of the most international companies in Denmark. MDCC has been widely awarded for its unique work culture and is a coveted career booster for top talents from all over the world.