How to handle safety stock in Dynamics AX
Another thing I’ve run across during my time leading sessions for the AXUG and consulting on Dynamics AX master planning questions is some confusion over how to handle safety stock. In particular, I’ve heard from a number of customers that they are using coverage groups set to a coverage code of Min/max to make the system keep a minimum inventory level. While this will work, using a Min/max coverage code is not necessary to have AX recognize your required minimums. Coverage codes drive only how the planned supply is generated, not what demand is used to calculate net requirements. In order words, all of the coverage codes (with the exception of Manual, which causes MRP to not calculate for these item) use the values in the “Minimum” field of the “Item coverage” form to determine safety stock – the only difference caused by the coverage code is the size of the planned order that’s generated. Even though this is the case, I’ve seen a lot of misunderstanding over this fact. Lots of people assumed (and have been told by their consultants, in some cases) that, in order to include safety stock, a coverage code of Min/max must be used. Whenever I hear this, I respond with the paragraph above. Additionally, I’ve always heard that, without other thing changing, a Min/max coverage code performs more slowly than using something like Period or Requirement with minimum order sizes and order multiples. I read this somewhere a couple of years ago, but have never tested it personally. It had mentioned that AX had to do more calculations in order to make the appropriate sized order and ensure there was never too much inventory at the end of the day. I figure now’s as good a time as any to test this out myself and have at least some cursory proof that this is true. In order to make this as scientific as possible, I created an experiment where I created a brand new released product, tried to remove all extraneous variables, and then ran a series of master scheduling processes with a Min/max coverage code used and then also with a Requirement coverage code and default order settings set.
How I set it up
In my AX 2012 R3 CU9 VPC, I deleted as many of the demo production orders as possible to reduce the overall load on the scheduling process. I then changed the coverage code on all the existing released products to Manual. Finally, I deleted the ReqTrans table, deleted both the dynamic and static plans, deleted all demand forecast lines, and then created my data set. I created a product numbered MinMaxTest. To ensure I had a dataset that caused master scheduling to run more than a couple of seconds, I created a demand forecast entry of 37 pieces for each day until 11/6/2019. I then changed the coverage time fence and the forecast time fence in the coverage groups I’d be using to make sure all this demand was seen and planned for. Next, before analyzing the results, I ran a couple of master scheduling runs in order to get everything cached up and make sure I was minimizing possible differences between the different data sets. After I ran 3 or 4 dry runs, I looked at the session log in the plan to get the result of each run. In the Min/max dataset, I set the item to have a minimum of 50 pieces and a maximum of 250 pieces. This represented approximately a week of demand and should result in ~1 planned purchase order per week. In the Requirement dataset, I set the minimum to 50 pieces, set the purchase order multiple to 50 pieces, and set the minimum purchase quantity to 300 pieces. Again, this represented approximately a week of demand and accommodated for the larger purchase order on the weekend when the delivery window was closed.
Statistics from master planning runs
The above screenshot shows my results. Although there’s only around an 8% difference in run time, there’s about a 30% difference in the number of planned order. Now, I’m sure I could adjust some of the settings (either the maximum amount or the default order settings) to get things a bit closer, but I can certainly see where there might be some performance hit (in both run time and the increased number of orders) associated with Min/max coverage codes. Based on this limited dataset, it doesn’t seem that there’s a huge difference, though. Again, I tried to match up the setting as close as possible and remove as many differences as possible, but since I’m using different coverage codes, it’s impossible to match the settings up exactly. Also, this discussion is in no way trying to say there is no use for Min/max coverage codes – it is intended to remind people that it is not necessary to use this coverage code for master planning to see safety stock. There are a number of good reasons for using Min/max coverage codes (like space or regulatory requirements, for example); safety stock just isn’t one of them.