DAX:将库存分配给未结订单
DAX : Allocate Inventory to Open Orders
我正在尝试分配库存项目以在 DAX、PowerBi 中打开订单。这个想法是首先将所有可用库存分配给最早的订单,然后将剩余库存分配给第二老的订单,依此类推,直到库存耗尽。即使未完成的订单未完全满足,库存也可能会耗尽。
请查看附件图片作为以下分配的示例
我尝试使用计算函数在未结订单 table 中添加一列,但结果根本不正确。它没有做任何分配,它只是总结库存。
CALCULATE (
[QOH],
FILTER (
ALL ( 'Open Orders'[Parent Name] ),
'Open Orders'[Due Date] <= MAX ( ( 'Open Orders'[Due Date] ) )
)
)
这里棘手的部分是计算当前行日期之前订购的商品,但您可以通过查看之前到期日期的总和来计算。
这应该作为计算列:
Inventory Allocation =
VAR TotalInventory =
LOOKUPVALUE ( Inventory[Qty On Hand], Inventory[Item], 'Open Orders'[Item] )
VAR AlreadyOrdered =
CALCULATE (
SUM ( 'Open Orders'[Qty Open] ),
ALL ( 'Open Orders' ),
Inventory[Item] = EARLIER ( 'Open Orders'[Item] ),
'Open Orders'[Due Date] < EARLIER ( 'Open Orders'[Due Date] )
)
RETURN
IF (
AlreadyOrdered > TotalInventory,
0,
MIN ( 'Open Orders'[Qty Open], TotalInventory - AlreadyOrdered )
)
编辑:
在 AlreadyOrdered
定义中,ALL
参数表示从 table 中删除所有 row/filter 上下文,以下参数指定我确实想要的过滤和相当于CALCULATE
.
里面的REMOVEFILTERS
funcion
EARLIER
function 经常让人感到困惑,因为它与日期无关,而是指较早的行上下文,因此我可以在 table 的当前行中引用值在 CALCULATE
中写入一个条件。您可以改用变量:
Inventory Allocation =
VAR TotalInventory =
LOOKUPVALUE ( Inventory[Qty On Hand], Inventory[Item], 'Open Orders'[Item] )
VAR CurrItem = 'Open Orders'[Item]
VAR CurrDate = 'Open Orders'[Due Date]
VAR AlreadyOrdered =
CALCULATE (
SUM ( 'Open Orders'[Qty Open] ),
REMOVEFILTERS ( 'Open Orders' ),
Inventory[Item] = CurrItem,
'Open Orders'[Due Date] < CurrDate
)
RETURN
IF (
AlreadyOrdered > TotalInventory,
0,
MIN ( 'Open Orders'[Qty Open], TotalInventory - AlreadyOrdered )
)
我正在尝试分配库存项目以在 DAX、PowerBi 中打开订单。这个想法是首先将所有可用库存分配给最早的订单,然后将剩余库存分配给第二老的订单,依此类推,直到库存耗尽。即使未完成的订单未完全满足,库存也可能会耗尽。
请查看附件图片作为以下分配的示例
我尝试使用计算函数在未结订单 table 中添加一列,但结果根本不正确。它没有做任何分配,它只是总结库存。
CALCULATE (
[QOH],
FILTER (
ALL ( 'Open Orders'[Parent Name] ),
'Open Orders'[Due Date] <= MAX ( ( 'Open Orders'[Due Date] ) )
)
)
这里棘手的部分是计算当前行日期之前订购的商品,但您可以通过查看之前到期日期的总和来计算。
这应该作为计算列:
Inventory Allocation =
VAR TotalInventory =
LOOKUPVALUE ( Inventory[Qty On Hand], Inventory[Item], 'Open Orders'[Item] )
VAR AlreadyOrdered =
CALCULATE (
SUM ( 'Open Orders'[Qty Open] ),
ALL ( 'Open Orders' ),
Inventory[Item] = EARLIER ( 'Open Orders'[Item] ),
'Open Orders'[Due Date] < EARLIER ( 'Open Orders'[Due Date] )
)
RETURN
IF (
AlreadyOrdered > TotalInventory,
0,
MIN ( 'Open Orders'[Qty Open], TotalInventory - AlreadyOrdered )
)
编辑:
在 AlreadyOrdered
定义中,ALL
参数表示从 table 中删除所有 row/filter 上下文,以下参数指定我确实想要的过滤和相当于CALCULATE
.
REMOVEFILTERS
funcion
EARLIER
function 经常让人感到困惑,因为它与日期无关,而是指较早的行上下文,因此我可以在 table 的当前行中引用值在 CALCULATE
中写入一个条件。您可以改用变量:
Inventory Allocation =
VAR TotalInventory =
LOOKUPVALUE ( Inventory[Qty On Hand], Inventory[Item], 'Open Orders'[Item] )
VAR CurrItem = 'Open Orders'[Item]
VAR CurrDate = 'Open Orders'[Due Date]
VAR AlreadyOrdered =
CALCULATE (
SUM ( 'Open Orders'[Qty Open] ),
REMOVEFILTERS ( 'Open Orders' ),
Inventory[Item] = CurrItem,
'Open Orders'[Due Date] < CurrDate
)
RETURN
IF (
AlreadyOrdered > TotalInventory,
0,
MIN ( 'Open Orders'[Qty Open], TotalInventory - AlreadyOrdered )
)