DAX: выделить инвентарь для открытия заказов - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь выделить инвентарные позиции для открытия заказов в DAX, PowerBi. Идея состоит в том, чтобы сначала выделить весь доступный инвентарь для самого старого заказа, а затем выделить оставшийся инвентарь для второго самого старого и т. Д. c. пока инвентарь не исчерпан. Инвентарь может быть исчерпан, даже если открытый заказ не полностью удовлетворен.

Пожалуйста, проверьте прикрепленное изображение в качестве примера для распределения ниже

Allocation Example

Я попытался добавить столбец в таблицу открытого заказа, используя функцию Calculate, но результаты были не совсем верны. Это не делало никаких распределений, оно просто подвело итог инвентаризации.

CALCULATE (
        [QOH],
        FILTER (
            ALL ( 'Open Orders'[Parent Name] ),
            'Open Orders'[Due Date] <= MAX ( ( 'Open Orders'[Due Date] ) )
        )
    )

1 Ответ

0 голосов
/ 06 апреля 2020

Сложная часть здесь - это вычисление того, что было заказано до даты в текущей строке, но вы можете сделать это, посмотрев сумму за предыдущие даты исполнения.

Это должно работать как вычисляемый столбец:

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 говорит об удалении всего контекста строки / фильтра из таблицы и Следующие аргументы определяют фильтрацию, которую я хочу, и эквивалентны REMOVEFILTERS функция внутри CALCULATE.

EARLIER функция часто сбивает с толку для людей, поскольку это не имеет ничего общего с датами, но относится к более раннему контексту строки, поэтому я могу ссылаться на значение в текущей строке таблицы при написании условия внутри 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 )
    )
...