如何检索处于 "waiting to arrive" 模式的产品

How to retrieve products that are in "waiting to arrive" mode

我有 3 个 table(订单、订单行、库存)。它们的关系如下:
ORDERS.ID = ORDER-ROWS.ORDER-ID (1 to many)
ORDER-ROWS.EAN = STOCK.EAN(多对多)
为了摆脱多对多关系,我在 Order-Rows 中添加了一列。

Order_number = RELATED('orders'[order])

我想弄清楚的是如何获得完成订单所需的所有产品的列表。这涉及状态为 'backorder' 的所有订单。 这意味着我需要弄清楚哪些产品 尚未发送,或者哪些产品尚未发货然而。我希望我的示例 tables 图片可以使这个复杂的问题更容易理解。

最终在 PowerBi 中出现的 table 也可能对每个订单所需的每个产品都有一行。它并不特别需要有数量列。

编辑/更新 01-29-2021,18:09:
我在第一个示例图像中犯了一个错误;库存中没有产品栏-table。为了纠正这一点,我上传了第二张显示真实情况的图片。
这是正确的 TABLE 情况

使用精心设计的模型可以很容易地解决这个问题。

首先我们需要创建一个产品 table,然后我们可以使用 EAN 列创建产品与订单行和库存 table 之间的关系。

我们已经在 OrderID 列上建立了 Orders 和 OrdersRows 之间的关系,我们需要使用 Ordernumber 列在 Orders 和 Stock 之间添加关系。

我们要的模型是这个

为了示例的缘故,我使用此代码创建了产品 table,该代码仅采用库存 table 中存在的那些。真正的 Product table 应该包含所有可能出现在 Stock 和 OrderRows table.

中的产品

注意:从 Stock table 中删除 Product 列后,这个简单的代码不再有效。请参阅下面的新工作(和更长)版本

Product = ALL( Stock[EAN], Stock[Product] )

我们现在可以编写一个度量来检查当前选择中的订单是否处于“延期交货”状态,然后按订单中的每个产品计算已经发送的延期交货数量,最后计算与订单的差异数量。如果差异大于 0,则度量 returns 将在 table.

中显示一个非空白值
Quantity waiting for = 
IF(
    SELECTEDVALUE(Orders[Status]) = "Backorder",
    VAR SentOrBackorder = 
        CALCULATE(
            COUNTROWS( Stock ),
            Stock[Location] IN { "sent", "backorder" } 
        )
    VAR Missing = SUM(OrdersRows[Quantity]) - SentOrBackorder
    RETURN         
    IF (
        Missing > 0,
        Missing
    )
)

此度量可以在 table 中与 Orders[Order]Orders[Date]'Product'[Product]

一起使用

当然可以改进,比如:

  1. 订单和订单之间的关系也使用订单名称 OrdersRows.
  2. 删除未使用的 ID 列,这对 table 有很大影响 内存中的大小,因为它们包含唯一值,因此 需要在 Vertipaq 引擎中内置大词典。
  3. 更改度量以实现正确的聚合,计算总数。

编辑:由于规格随着从库存中删除产品列而改变 table,计算的产品的 DAX 代码 table 更改为更复杂的版本,处理产品存在于 Stock table 但不存在于 OrdersRows 中。缺少时使用 EAN 作为产品名称。

Product =
VAR OrderEAN =
    ALL ( OrdersRows[EAN] )
VAR StockEAN =
    ALL ( Stock[EAN] )
VAR StockOnlyEAN =
    EXCEPT (
        StockEAN,
        OrderEAN
    )
VAR OrderProduct =
    ALL (
        OrdersRows[EAN],
        OrdersRows[Product]
    )
VAR StockProduct =
    CALCULATETABLE (
        ADDCOLUMNS (
            VALUES ( Stock[EAN] ),
            "Product", Stock[EAN]
        ),
        StockOnlyEAN
    )
VAR Result =
    UNION (
        OrderProduct,
        StockProduct
    )
RETURN
    Result

在实际场景中,Product table 不应在 DAX 中实现,而应直接从数据源中读取。