2016-01-02 4 views
1

Ma question est basée sur la mise en place d'une montée en puissance pour la planification des lignes de production.Utilisation de DAX pour la planification de la production

J'ai un WIP où une catégorie d'accélération est sélectionnée pour être utilisée pour chaque MSO (Master Sew Order). La rampe est basée sur des clôtures horaires (par exemple 1 à 6 heures, 6 à 12 heures, etc.). Sur le WIP, un MSO aura des unités (exemple 1 920 unités), divisées par la capacité par heure (80 pcs/h), pour donner le temps nécessaire 24 heures. Cela doit ensuite être calculé en fonction de la montée en charge, pour les heures 1-6, 6-12, 12-18 et 18-24 et multiplier par notre efficacité associée.

Par exemple:

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 

Comment savoir puissance BI pour diviser l'estimation de 24 heures originale en parties, il faut multiplier par l'efficacité respective, et le retour d'un nouveau résultat de 36 heures?

Merci beaucoup d'avance!

Kurt

Relationships

Répondre

2

Je ne sais pas comment faire cela dans DAX mais vous a tagué PowerQuery Voici donc une requête personnalisée qui calcule 36 en fonction de vos paramètres:

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 

Le les listes intérieures pour Efficiency sont de la forme temps-efficacité-fins,efficacité-valeur . Branchez l'infini pour que la dernière efficacité ne s'arrête jamais.

Dans un langage de programmation itératif normal, vous pouvez mettre à jour l'état avec une boucle for, mais en M, vous devez utiliser List.Accumulate et regrouper tous vos états en une seule valeur.

0

Dans votre modèle de données, vous pouvez avoir MSO dans une table contenant 2 champs, [Units] et [UnitsPerHour], et une autre table appelée EffTable qui peut stocker les efficacités éclatées par les clôtures d'heures. Créer 4 nouvelles colonnes calculées dans votre table MSO, une pour chaque clôture d'une heure, par exemple [1 à -6]:

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

Ce sont des champs qui détiennent combien d'unités vous produirez dans les 4 créneaux horaires. Créer un nouveau champ calculé pour le total, [RampUpUnits]:

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

Calculons Enfin, le temps total que:

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

Ce calcule le nombre d'heures requis pour les unités restantes et ajoute à 24 pour le temps de montée en puissance.