Исправление динамического возвращаемого текста вычисления PowerBI / DAX, ошибка говорит о том, что «таблица множественных значений предоставлена ​​... где ожидалось одно значение» - PullRequest
0 голосов
/ 17 июня 2019

Я создаю панель инструментов PowerBI для задержек с цепочками поставок.Было отличное видео, которое я видел от Microsoft, демонстрирующее карточку сообщений Dynamic на их приборной панели Destiny, показывающее игроков и их любимое оружие, https://youtu.be/uHP7YJH526c?t=2438... Я думал, что это будет отличная возможность для реализации, но показывает отставание с влиянием торговых представителей и ихСчета.По сути, я сделал копию и вставил его код, но изменил переменные, а также добавил «затронутый продукт».К сожалению, это не работает идеально (в некоторых случаях работает), но большую часть времени я получаю это:

Сообщение об ошибке: MdxScript (Model) (17, 125) Ошибка вычисления в мере 'SalesforceCC Backorder Report '[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, так что давайте Джону Смиту наперед».это максимальное значение, которое они получат, потому что у ДЖОНА СМИТА также может быть 20 заказов на ProductA из Account1.

1 Ответ

0 голосов
/ 17 июня 2019

Я подозреваю, что ошибка вызвана этой строкой в ​​блоке HASONEVALUE ('BOreport' [Название торгового представителя]):

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

Этот код имеет 3 элемента: selectedRepName, maxBackorderforSelectedRep и selectedProduct

maxBackorderforSelectedRep не может вызвать каких-либо проблем, потому что он всегда возвращает 1 значение.

selectedRepName может вызвать проблемы (возвращает несколько значений, если не выбрано ни одного конкретного представителя), но формула защищает от такого сценария, используя HASONEVALUE.

selectedProduct аналогично selectedRepName, поэтому может возвращать несколько значений, если не выбран конкретный представитель, и у вас нет защиты от такого сценария.Отсюда и ошибка.

Простой способ исправить это добавить аналогичную защиту:

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."

Это должноустранить ошибку.Однако я не могу гарантировать, что вы получите желаемое поведение - формула подразумевает, что вы должны выбрать определенный Rep AND определенный продукт, в противном случае он вернет сообщение по умолчанию.

...