Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Note
Community interest groups have now moved from Yammer to Microsoft Viva Engage. To join a Viva Engage community and take part in the latest discussions, fill out the Request access to Finance and Operations Viva Engage Community form and choose the community you want to join.
[This article is prerelease documentation and is subject to change.]
Warehouse managers often need different work pools, priorities, or bay door assignments depending on the carrier, shipping deadline, or type of items being picked. Without dynamic classification, each combination requires its own work template, which can lead to a large and complex configuration.
Important
- This is a production-ready preview feature.
- Production-ready previews are subject to supplemental terms of use.
Dynamic work classification lets you use Power Fx formulas to determine these work parameters at runtime instead of configuring them statically on each work template. A single work template combined with a classification rule can replace many static templates, making your configuration simpler to maintain and more adaptable to changing business requirements.
Dynamic work classification provides two main capabilities:
- Classification at work creation – When warehouse work is created, the system evaluates a Power Fx formula to override the work pool, work priority, location directive codes, and work classes on the generated work. The formula can look up values from the work header and associated records, including the load, shipment, wave, and transportation appointment.
- Reclassification after load changes – If a load changes after work has been created (for example, the carrier is reassigned), the system can reevaluate the formula and update the associated work. Work can also be reevaluated on a schedule if the formula depends on the current date or time.
To start using dynamic work classification, you must configure how loads trigger reclassification, create one or more classification rules that contain your Power Fx formulas, and associate each rule with the work templates that should use it.
Prerequisites
To use the feature described in this article, your system must meet the following requirements:
- You must be running Microsoft Dynamics 365 Supply Chain Management version 10.0.48 or later.
- The feature named (Production Ready Preview) Dynamic work classification must be turned on in feature management.
Configure work reclassification on load update
To control whether dynamic work classification rules can reclassify work when loads change, configure the Work classification on load update option. Work is only reclassified by rules that are explicitly set to Reclassify work on load update, so you can choose which rules should apply when a load changes. The system always classifies work at creation if a rule is associated with the work template, regardless of this setting.
To configure this setting, follow these steps:
- Go to Warehouse management > Setup > Warehouse management parameters.
- On the General tab, open the Work FastTab.
- Set the Work classification on load update field to one of the following values:
- Disabled – No action is performed when a load is updated.
- Synchronous – All work associated with an updated load is reclassified immediately after the load is updated.
Note
When using synchronous reclassification, the user might experience a brief wait during load updates while the system processes all associated work headers.
Create dynamic work classification rules
Classification rules define the Power Fx formulas that determine how work should be classified. Each rule specifies which fields to override and the logic for calculating the new values.
To create a rule, follow these steps:
Go to Warehouse management > Setup > Work > Dynamic work classification rules.
Select New to create a rule.
Make the following settings in the header of the new rule:
- Dynamic work classification rule – Enter a name for the rule.
- Description – Enter a short description for the rule.
- Rule scope – Specify when the rule's formulas run during work creation and which data they can reference. The scope determines whether classification is applied only at the work header level or also at the initial work line level. Choose one of the following values:
- Work – The formula runs once, after the work header is created. Use this scope when classification depends only on header-level properties such as the carrier or shipping time.
- Work and initial work lines – The formula runs twice. First, as the initial pick work line is selected, the system evaluates a separate initial work line formula and applies overrides to that line. Then, after all initial work lines are collected, the system runs the main formula against the work header. Use this scope when classification depends on item-level properties such as the pick zone.
On the Recalculation FastTab, make the following settings to control how and when the rule is reevaluated if a load changes after the initial work creation:
- Reclassification schedule ID – This setting is reserved for future use and has no effect in the current release.
- Reclassify work on load update – Set this option to Yes to run the classification again each time a load associated with the work header changes. This setting ensures that any updates to the load are reflected in the work classification. This setting only applies if the Work classification on load update parameter is set to allow reclassification (see the previous section).
On the Power Fx formula FastTab, enter a formula that returns a record with the fields you want to override. See the next sections for details on writing formulas.
If the Rule scope is set to Work and initial work lines, the page includes a Initial work line formula FastTab. This formula runs when the first work line is assigned to a new work record. See the next sections for details on writing formulas.
Tip
- Use the Copy button on the Action Pane to duplicate an existing rule as a starting point for a new one.
- Use the Preview button to test a rule against an existing work header and see the results without making changes.
- The Work reclassification schedules button is reserved for future use and has no effect in the current release.
Write work classification formulas
On the Power Fx formula FastTab of each classification rule, enter a formula that returns a record with one or more of the following fields.
The following table describes the fields that a work classification formula can return.
| Field | Type | Description |
|---|---|---|
WorkPoolId |
String | Overrides the work pool on the created work. |
DefaultWorkPriority |
Number | Overrides the priority on the created work. |
DirectiveCodeOverrides |
Record | A record where each field name is a location directive code to replace and the value is the new directive code. Applies to all pick/put pairs. |
WorkClassOverrides |
Record | A record where each field name is a work class to replace and the value is the new work class. Applies only to the second and subsequent pick/put pairs. To change the work class of the first pick/put pair, use the initial work line formula instead. |
The following example shows a formula that returns all four fields.
{
WorkPoolId: "PoolA",
DefaultWorkPriority: 100,
DirectiveCodeOverrides: {
BAYDOOR: "BAYDOOR-C1",
STAGING: "STAGING-C1"
},
WorkClassOverrides: {
'Standard Class': "Express Class"
}
}
Important
Returning Blank() for a field (or omitting it) preserves the original value from the work template. Returning an empty string ("") actively clears the value. For example, returning Blank() for WorkPoolId keeps whatever work pool was set on the work template, while returning "" removes the work pool entirely.
Available data objects for work formulas
The following table lists the objects that you can reference in a work classification formula.
| Object | Description |
|---|---|
workTable |
The work header that was generated. |
workTable.Load |
The load record associated with the work header. |
workTable.Shipment |
The shipment record associated with the work header. |
workTable.Wave |
The wave record associated with the work header. |
workTable.Appointment |
The first transportation management (TMS) appointment associated with the load. |
Write initial work line formulas
If you set the Rule scope to Work and initial work lines, enter an additional formula on the Initial work line formula FastTab. This formula runs as the first pick work line is assigned to a new work record and can override the following fields.
| Field | Type | Description |
|---|---|---|
WorkPoolId |
String | Overrides the work pool on the created work header. |
WorkClassId |
String | Overrides the work class of the initial pick/put work lines. |
Available data objects for initial work line formulas
The following table lists the objects that you can reference in an initial work line formula.
| Object | Description |
|---|---|
workLine |
The initial pick work line that was generated. |
workLine.InventTable |
The item master record for the item being picked. |
workLine.WHSInventTable |
The warehouse item settings for the item being picked. |
workLine.Load |
The load record associated with the work line. |
workLine.LoadLine |
The load line associated with the initial pick line. |
workLine.Shipment |
The shipment record associated with the work line. |
Associate rules with work templates
After creating a classification rule, associate it with the work template that should use it. During work creation, the system evaluates the rule's formula and applies the returned overrides to the generated work.
Go to Warehouse management > Setup > Work > Work templates, select a template, and set the Dynamic work classification rule field to the rule you want to use for that template.
Note
When you use dynamic work classification with a work template, make sure the template's grouping settings align with your formula logic. For example, if your formula classifies work based on zone, the work template should group work creation by zone so that each work header contains lines from only one zone.
Examples
The following examples illustrate common scenarios where dynamic work classification can simplify your configuration.
Example 1: Set work pool and priority by carrier
A warehouse uses three carriers that pick up shipments at different times during the day. The warehouse manager wants to route each carrier's work to a separate work pool and assign higher priority to the earliest pickup.
Without dynamic classification, this setup requires three work templates. Each template filters on a different carrier code, each with its own work pool and priority settings.
With dynamic classification, a single work template and one rule handle all three carriers.
Switch(workTable.Load.CarrierCode,
"Carrier1", {WorkPoolId: "Carrier1", DefaultWorkPriority: 100},
"Carrier2", {WorkPoolId: "Carrier2", DefaultWorkPriority: 50},
"Carrier3", {WorkPoolId: "Carrier3", DefaultWorkPriority: 10}
)
If you later reassign the load to a different carrier, the system can automatically reclassify the work when reclassification on load update is turned on.
Example 2: Direct put-away to carrier-specific bay doors
Building on example 1, the warehouse manager also wants outbound put lines directed to different bay doors depending on the carrier. With static configuration, each work template needs a different location directive code.
With dynamic classification, you can add directive code overrides to the same formula.
Switch(workTable.Load.CarrierCode,
"Carrier1", {
WorkPoolId: "Carrier1",
DefaultWorkPriority: 100,
DirectiveCodeOverrides: {BAYDOOR: "BAYDOOR-C1"}
},
"Carrier2", {
WorkPoolId: "Carrier2",
DefaultWorkPriority: 50,
DirectiveCodeOverrides: {BAYDOOR: "BAYDOOR-C2"}
},
"Carrier3", {
WorkPoolId: "Carrier3",
DefaultWorkPriority: 10,
DirectiveCodeOverrides: {BAYDOOR: "BAYDOOR-C3"}
}
)
Example 3: Prioritize work by shipping deadline
Instead of classifying by carrier, this example prioritizes work based on how close the load is to its scheduled shipping time. Loads with earlier deadlines receive higher priority, ensuring workers pick the most time-sensitive orders first.
The following formula converts the scheduled shipping time into a numeric priority. A shipment scheduled for 9:00 AM becomes priority 900, while a 3:00 PM shipment becomes priority 1500.
{
DefaultWorkPriority:
If(Not(IsBlank(workTable.Load.LoadSchedShipUTCDateTime)),
If(IsToday(workTable.Load.LoadSchedShipUTCDateTime),
Hour(workTable.Load.LoadSchedShipUTCDateTime) * 100
+ Minute(workTable.Load.LoadSchedShipUTCDateTime),
3000),
Blank())
}
The formula assigns a priority of 3000 to loads scheduled for a future day (beyond the maximum time-based priority of 2359) and returns Blank() for loads with no scheduled date, which preserves the work template's default priority.
An alternative approach calculates priority based on the number of minutes remaining until the shipping deadline.
{
DefaultWorkPriority:
If(Not(IsBlank(workTable.Load.LoadSchedShipUTCDateTime)),
If(IsToday(workTable.Load.LoadSchedShipUTCDateTime),
Max(0, DateDiff(Now(), workTable.Load.LoadSchedShipUTCDateTime,
TimeUnit.Minutes)),
24 * 60),
Blank())
}
Important
The time-remaining approach requires the reclassification batch job to run on a recurring schedule (for example, every hour) to keep priorities current. Depending on the number of open work headers, this requirement can add load to the system. The time-of-day approach (first formula) is more efficient because work only needs reclassification when the load's scheduled shipping time changes.
Example 4: Classify work by pick zone
This example assigns a different work class to the initial pick/put pair based on the zone where items are picked. For example, picks from a freezer zone can be restricted to workers with appropriate cold-weather gear.
To use this approach, set the Rule scope to Work and initial work lines and configure the work template to group work by zone. This configuration ensures each work header contains lines from only one zone.
The initial work line formula concatenates a prefix with the zone ID to create a zone-specific work class.
{
WorkClassId: Concatenate("S-", workLine.ZoneId)
}
Alternatively, you can set the work pool instead of the work class.
{
WorkPoolId: Concatenate("S-", workLine.ZoneId)
}