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 )
    )