2016-01-02 3 views
1

Мой вопрос основан на построении рампы для планирования производственных линий.Использование DAX для планирования производства

У меня есть WIP, где категория разгона выбрана для использования для каждого MSO (Master Sew Order). Рампа основана на часовых заборах (например, 1-6 часов, 6-12 часов и т. Д.).

На WIP MSO будет иметь единицы (пример 1,920 единиц), разделенные на мощность в час (80 шт/час), чтобы дать время, необходимое 24 часа. Тогда это должно быть , рассчитанное на основе нарастания, в течение часов 1-6, 6-12, 12-18 и 18-24 и умножить нашу соответствующую эффективность.

Например:

Hours 1-6: 20% efficiency * 80 units = 16 units/hr (6 x 16 = 96 units produced) 

Hours 6-12: 40% efficiency * 80 units = 32 units/hr (192 units) 

Hours 12-18: 60% efficiency * 80 Units = 48 units/hr (288 units) 

Hours 18-24: 80% efficiency * 80 units = 64 units/hr (384 units) 

Hours 24+: 100% efficiency * 80 units = 80 units/hr ((1920-960)/80)= 12 hours remaining 

TOTAL TIME = 36 hours to produce 

Как бы власть BI знать, чтобы разделить оригинальный 24 часа оценку в части, умножить на соответствующую эффективность, и возвращать новый результат 36 часов?

Большое вам спасибо!

Kurt

Relationships

ответ

2

Я не знаю, как это сделать в DAX, но вы помечено PowerQuery так вот пользовательский запрос, который вычисляет 36 на основе ваших параметров:

let 
    MSO = 1920, 
    Capacity = 80, 
    Efficiency = { 
    {6, 0.2}, 
    {12, 0.4}, 
    {18, 0.6}, 
    {24, 0.8}, 
    {#infinity, 1.0} 
    }, 
    Accumulated = List.Accumulate(Efficiency, [ 
    Remaining = MSO, 
    RunningHours = 0 
    ], (state, current) => 
    let 
     until = current{0}, 
     eff = current{1}, 
     currentCapacity = eff * Capacity, 
     RemainingHours = state[Remaining]/currentCapacity, 
     CappedHours = List.Min({RemainingHours, until - state[RunningHours]}) 
    in [ 
     Remaining = state[Remaining] - currentCapacity * CappedHours, 
     RunningHours = state[RunningHours] + CappedHours 
    ]), 
    Result = if Accumulated[Remaining] = 0 
    then Accumulated[RunningHours] 
    else error "Not enough time to finish!" 
in 
    Result 

внутренние списки для Efficiency имеют вид время-эффективность-концы,эффективность-значение , Подключите бесконечность, чтобы последняя эффективность никогда не останавливалась.

В обычном итеративном языке программирования вы можете обновить состояние с помощью цикла for, но в M вам нужно использовать List.Accumulate и упаковать все ваше состояние в одно значение.

0

В вашей модели данных у вас может быть MSO в одной таблице, содержащей 2 поля, [Единицы] и [UnitsPerHour], а другая таблица называется EffTable, которая может сохранять эффективность, разломанную часовыми заборами. Создать 4 новые расчетные столбцы в таблице МСО, по одному для каждого часа забора, например, [1--6]:

= 
6 * LOOKUPVALUE (EffTable[Efficiency], EffTable[Hours], "1--6") 
    * [UnitsPerHour] 

Это поля, которые держат сколько единиц вы бы производить во временных интервалах 4. Создание нового вычисляемого поля для общего числа, [RampUpUnits]:

= 
[1--6Hours] + [6--12Hours] + [12--18Hours] + [18--24Hours] 

Наконец рассчитать общее время, как:

= 
24 
    + ([Units] - [RampUpUnits]) 
    /[UnitsPerHour] 

Это вычисляет количество часов, необходимых для остальных узлов и добавляет его к 24 для увеличения времени нарастания.

Смежные вопросы