修复了PowerBI / DAX计算的动态返回文本,错误提示“提供了多个值的表...在预期单个值的地方”

时间:2019-06-16 23:29:50

标签: powerbi dax

我正在为供应链缺货创建PowerBI仪表板。我从Microsoft观看了一段很棒的视频,在他们的Destiny仪表板上演示了动态消息卡,其中显示了玩家和他们喜欢的武器https://youtu.be/uHP7YJH526c?t=2438 ...我认为这是一个很酷的功能,但可以显示受销售代表影响的补货和他们的帐户。我基本上是复制和粘贴他的代码,但是修改了变量并添加了“受影响的产品”。不幸的是,它不能很好地工作(某些情况下可以工作),但是大部分时间我都知道:

  

错误消息:MdxScript(Model)(17,125)测量中的错误   “ Salesforce CC补货报告” [BackorderIQ]:多个表格   在期望使用单个值的地方提供了值。

我发现这与以下事实有关:如果我选择了一个销售代表,则他们可能有多个待补产品,因此我尝试了maxBackorderForProduct变量(COUNT,COUNTA,COUNTX,COUNTAX,MAX, MAXX,MAXA)……到目前为止,MAXX不太可能破坏它,所以我现在正在使用它。

BackorderIQ =
VAR selectedRepName =
    FIRSTNONBLANK ( 'BOreport'[Sales Rep Name], TRUE )
VAR selectedActName =
    FIRSTNONBLANK ( 'BOreport'[Account Name], TRUE )
VAR selectedProduct =
    FIRSTNONBLANK ( 'BOreport'[Product ID], FALSE () )
VAR maxBackorderforSelectedAct =
    MAXX (
        SUMMARIZECOLUMNS (
            'BOreport'[Sales Rep Name],
            "Orders", SUM ( 'BOreport'[Back Order Qty] )
        ),
        [Orders]
    )
VAR maxBackorderforSelectedRep =
    MAXX (
        SUMMARIZECOLUMNS (
            'BOreport'[Account Name],
            "Orders", SUM ( 'BOreport'[Back Order Qty] )
        ),
        [Orders]
    )
VAR maxBackorderForProduct =
    MAXX (
        SUMMARIZECOLUMNS (
            'BOreport'[Product ID],
            "Orders", SUM ( 'BOreport'[Back Order Qty] )
        ),
        [Orders]
    )
RETURN
    IF (
        HASONEVALUE ( 'BOreport'[Sales Rep Name] ),
        selectedRepName & " has " & maxBackorderforSelectedRep & " backorders of " & selectedProduct & " at "
            & LOOKUPVALUE (
                'BOreport'[Account Name],
                'BOreport'[Back Order Qty], MAX ( 'BOreport'[Back Order Qty] )
            ),
        IF (
            HASONEVALUE ( 'BOreport'[Account Name] ),
            selectedActName & "'s has " & maxBackorderforSelectedAct & " backorders of " & selectedProduct & ", so give "
                & LOOKUPVALUE (
                    'BOreport'[Sales Rep Name],
                    'BOreport'[Back Order Qty], MAX ( 'BOreport'[Back Order Qty] )
                ) & " a heads up.",
            "Select a Product below, OR an Account or Sales Rep to the right."
        )
    )

我希望我能得到一张卡片,上面写着“ ACCOUNT2有50个ProductB缺货订单,所以请让JOHN SMITH提前注意。”这是他们可以获得的最大值,因为JOHN SMITH可能还有Account1的20个ProductA缺货订单。

1 个答案:

答案 0 :(得分:0)

我怀疑错误是由HASONEVALUE('BOreport'[Sales Rep Name])块中的这一行引起的:

selectedRepName & " has " & maxBackorderforSelectedRep & " backorders of " & selectedProduct & " at "

此代码包含3个元素: selectedRepName,maxBackorderforSelectedRep和selectedProduct

maxBackorderforSelectedRep不会引起任何麻烦,因为它始终返回1值。

selectedRepName可能会引起麻烦(如果未选择特定的Rep,它将返回多个值),但是该公式可防止使用HASONEVALUE的这种情况。

selectedProduct与selectedRepName相似,因此,如果未选择特定的rep,则它可能返回多个值,并且您没有针对这种情况的保护措施。因此,错误。

一种简单的解决方法是添加类似的保护措施:

IF (
        HASONEVALUE ( 'BOreport'[Sales Rep Name] ) && 
        HASONEVALUE ( 'BOreport'[Product ID]),
        selectedRepName & " has " & maxBackorderforSelectedRep & " backorders of " & selectedProduct & " at "
            & LOOKUPVALUE (
                'BOreport'[Account Name],
                'BOreport'[Back Order Qty], MAX ( 'BOreport'[Back Order Qty] )
            ),

同样的逻辑也应适用于第二个块:

  IF (
        HASONEVALUE ( 'BOreport'[Account Name] ) &&
        HASONEVALUE ( 'BOreport'[Product ID]),
        selectedActName & "'s has " & maxBackorderforSelectedAct & " backorders of " & selectedProduct & ", so give "
            & LOOKUPVALUE (
                'BOreport'[Sales Rep Name],
                'BOreport'[Back Order Qty], MAX ( 'BOreport'[Back Order Qty] )
            ) & " a heads up."

那应该消除错误。但是,我不能保证您会获得所需的行为-该公式表示您必须选择特定的代表 AND 特定的产品,否则它将返回默认消息。