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