Posted on behalf of Karina Normann Jakobsen.
Many industries require the shipper to provide documentation to the carrier and the customer about the packing structure of the items that are being shipped. It is also common to receive items packed in shippable cases and distribute them to customers without adding any value other than the labelling of the case.
However, in Microsoft Dynamics AX 2012 R3 there's no record of how a quantity of an on-hand inventory item has been packed. AX only records the inventory quantity in the unit of measure associated with the inventory item, and not in the unit that is used to pack an item.
AX does support the recording of inventory on-hand quantity in packing units like a case if a separate license plate is recorded for each case. However, such detailed record keeping of cases may be impractical for many companies.
This blog post explains how AX can support a case picking operation in companies where no record is kept of license plate information for the inventory on-hand of an item, by creating a container per case. It also explains how the packing structure for a shipment can be mimicked by the creation of a nested container structure for a shipment or load during wave release, and how a label can be printed per case with correct configuration of work break.
This blog post does not describe wave containerization and label printing in detail because this is already described in previously published blog posts. To understand the details behind the flow described in this blog post you should also read the following blog posts:
Contoso Juice distributes orange juice. The supplier of the orange juice packs the juice into shippable cases, which Contoso Juice receives and puts away directly.
Contoso Juice wishes to record the inventory on-hand quantity in eaches. They do not want to record a license plate ID for each case of juice.
Contoso Juice's power position in the supply chain is relatively weak. Their main customers are large retail chains and these retailers dictate that the order unit for juice is eaches, and they will not restrict themselves to order quantities which can be directly converted into full cases. This means that Contoso Juice sometimes needs to break a shippable case to support single piece picking.
Contoso Juice has a very strict division of zones in the warehouse. Separate zones are used for storage of cases and eaches. Different types of equipment are needed for picking in each of the zones and warehouse workers are assigned to work in one zone at the time.
Therefore, Contoso Juice wants the following rules applied:
Cases are picked from the case zone.
- The worker will pick one case at a time.
- A label will be printed per case.
- The worker puts on the label on each case.
Quantities that are less than a full case are picked from the broken case zone.
- Workers pick directly into a shippable container.
Contoso Juice has received a sales order for a quantity of 21 eaches of orange juice. They will deliver the shipment in 3 containers:
- 2 cases will be picked from the case zone, and each of these will have a label added during picking.
- 1 each will be picked from the broken case zone and put into a shippable container during picking.
All 3 containers will be finally placed on a pallet, and wrapped and shipped as 1 unit.
The steps carried out in AX
The sales clerk has registered the sales order in AX:
The sales order is confirmed with customer and released to the warehouse.
One load line is created, then one shipment, then one load, then one wave, and then the wave is released.
The expected packing structure of the entire shipment/load is represented as one container structure:
To print a label per picked case, 2 work orders are needed for the case picking zone:
To be able to assign the pick in the broken case zone to a worker assigned to work in that zone, one work order needs to be created for that zone:
The warehouse worker working in the case zone logs into the mobile device and starts the picking.
Warehouse worker action
Opens the menu item.
Scans the shipment ID and clicks OK.
Confirms picking of the first case and clicks OK.
Places the label printed for the first case and clicks OK.
Behind the scene, the label print instruction is performed.
Next instruction is presented to the user.
Confirms picking of the second case and clicks OK.
Places the label printed for the second case and clicks OK.
Behind the scene, the label print instruction is performed.
Next instruction is presented to the user.
There's no more work left for the case zone for that shipment, so he receives the instruction on where to put the item.
Now the 2 work orders for the case picking zone are closed:
This is also represented in the container structure for the load:
Every time a license plate label is printed a record is stored:
This makes it possible to reprint the labels.
In principle, the work order for the piece picking area will need to be performed as well, but it is not relevant for this example.
Behind the scene.
This steps described in this blog use the content of the Directive unit (DirectiveUOM) and Directive quantity (DirectiveQty) fields in the Temporary work transactions (WHSTmpWorkLine) table to create a container (WHSContainerTable) per quantity 1 of the Directive unit.
What determined the value in Directive unit and Directive quantity?
The Directive unit and Directive quantity are populated in the temporary work transactions after the wave method allocateWave has completed.
The sequence of the methods is fixed. AllocateWave is always completed before containerization is performed.
AllocateWave consults the location directives in order to analyse the demand quantity of an item from a load line so that it can determine the location(s) to pick the demand quantity from. Depending on where the current on-hand of the item is placed in the warehouse, the setup of the location directives and the setup of policies for handling of units for a released product, the outcome of the AllocateWave can be one or more temporary work lines (WHSTmpWorklines), or an error.
When evaluating if a location directive line is valid for a demand quantity of an item, and Restrict by unit is set for the line, AX attempts to convert the demand quantity into quantity in the unit that restricts the line. The unit can be converted successfully if the unit restricting the line is included in the Unit sequence group associated with the released product, and Unit conversion is found between the Inventory unit of the relased product, and the unit restricting the line.
If it is possible to convert this into a positive quantity having respected the decimal precision of the unit, the line is valid and location directive actions are consulted to find out where to locate the quantity from. If available on-hand is found, the locating succeeds.
With the input quantity of 21 eaches we had in the scenario, location line 2 would have failed if we had not allowed the location directive to split the demand quantity. Allowing the split, divided the temporary work transaction for the demand quantity into two lines. The line, where we have managed to locate 2 cases (line 1) and the one that still needs to be located (line 2).
Because the location directive line that succeeded for line 1 was restricted by a unit, this unit becomes the Directive unit for the Temporary work transactions, and the Directive quantity is in the Directive unit.
Line 2 still needs a pick location. The next line that was in the location directive was un-restricted by any units and available on-hand was found.
Therefore it also succeeds.
The location line that succeeded for work line 2 was not restricted by any units. Therefore the Directive unit for the Temporary work transactions and the Directive quantity is in Inventory unit of the item.
How could a container be created for a quantity of 1 Directive unit?
The wave method containerization is an optional method that you can add to the wave template. The value in the Wave step code field connects this method with one or more container build templates.
And here is the trick. If Pack by unit = true a container will be created for a quantity of 1 Directive unit. This logic, combined with restricting the template to Temporary work transaction with the correct Directive unit, ensured that a container was created for each of the cases.
An additional Container template was added.
The advanced containerization logic described here: http://blogs.msdn.com/b/dynamicsaxscm/archive/2014/07/26/introduction-to-containerization-automated-packing-process-in-microsoft-dynamics-ax-2012-r3.aspx caused the creation of container(s) for all "less than a full case item quantities" for the shipment.
Temporary work transactions were split again per container ID, and the container ID was recorded on the temporary work transaction.
Please note that the Zone ID from the location is also stored per line in the temporary work transactions.
Why was a label printed per container and why did we see 3 work orders in the scenario?
After wave method containerization was completed, the method createWork used the temporary work transitions to determine which work template to use.
The company wanted a different workflow for picking in the 2 different zones. Therefore Zone ID was added to the range in the advanced query:
This is the work template for Case zone:
Work type print was added to the work template, and then a Work line of type Print was used to print a license plate label. A work line of type Print is only carried out once per work order. To mimic the printing of a label per case, one work order had to be created per case.
To ensure a work order was created per case instead of just one big work order 2 additional tricks were needed:
- The Container ID was added to the sorting in the query. Any field from the temporary work transactions table that is used for sorting is inserted into the work break table.
- Group by container ID was set to True.
The same tricks were used for both work templates.
You can read more about work break (or grouping) in this blog:
This is the work template for piece picking zone, which in this example is floor.
The work classes of the templates are deliberately different to be able to direct work for a given zone to a user. You can read more about that specific detail in this blog: http://blogs.msdn.com/b/dynamicsaxscm/archive/2014/08/20/how-to-direct-work-for-a-specific-zone.aspx
Sorting and work break per container was also configured for this Work template.
The only difference to the configuration mentioned in the blog post above was the setup of the mobile device menu item. In the current scenario, the Directed by method was set to System group and Grouped by was set to Shipment ID. This was the reason why the work line pick for all the work orders for the shipment was pushed to the mobile device one line after another.
This simple example has showed how it's possible to support an operation where both piece picking and case picking are needed. It used advanced queries in AX in combination with new business logic that was released for the advanced warehouse management functionality in AX2012 R3.
There are still some known limitations in the scenario described above, so don't spent time searching for them.
- License plate labels are recorded when the Print workflow step is performed. Therefore it is not possible to print labels before that step is performed and you cannot print all the labels before the worker starts the work.
- A work line of type Pick will be created per container. Unless cluster picking functionality is used for picking it is not possible to group the pick of multiple work order lines for the same item on the same location into 1 work instruction on the mobile device.
- The outbound ASN delivered with Dynamics AX 2012 R3 does not contain the container information.
- It is not possible to add new containers or change the content of the item for a planned container to a different container ID.
- Containerization cannot be used together with the Pack station functionality.