CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Days-on-Hand Berechnung (Lagerreichweite in Tagen)

Ein Kunde sprach: Wir rechnen die Lagerreichweite auf Excel, weil das in unserem BW unglaublich kompliziert ist. Geht das denn mit DeltaMaster einfacher und auch performant? Und ob! Mit ein wenig MDX wird diese Berechnung zum Kinderspiel. Der folgende Blogbeitrag beschreibt einen Ansatz, um die Lagerreichweite in Tagen für einen beliebigen Berichtsmonat zu berechnen. Viel Spaß beim Lesen und beim Testen.

Grundlagen

Die Lagerreichweite in Tagen berechnet sich auf Basis des Lagerbestandes im Berichtsmonat und den jeweiligen Bestellungen in den folgenden Monaten. Ausgehend vom aktuellen Lagerbestand werden schrittweise die über die Folgemonate kumulierten Bestellungen zum Abzug gebracht. Für jeden Monat, der noch vom Lagerbestand gedeckt wird, sei eine Reichweite von 30 Tagen angenommen. Wird der aktuelle Lagerbestand ab einem bestimmten Monat „X+1“ von den kumulierten Bestellungen überschritten, ist er verbraucht. Daraus kann gefolgert werden, dass zumindest zum Zeitpunkt „X“ die Bestellungen noch durch den Lagerbestand gedeckt sind. Der Monat „X+1“ wird dann nicht mehr komplett mit 30 Tagen, sondern nur noch anteilig bis zu einer gewissen Anzahl von Tagen vom Lagerbestand gedeckt. Die verbleibende Anzahl von Tagen berechnet sich aus dem Quotienten des noch verfügbaren Lagerbestandes im Monat „X“ geteilt durch die Anzahl Bestellungen im Monat „X+1“ multipliziert mit 30 Tagen. Die folgende Tabelle zeigt die Berechnungslogik an einem Beispiel:

2012-06-08_Crew_Beispiel

Schritt 1: Berechnung der Gesamtzahl an Tagen für volle Monate

In Schritt 1 legen wir einen Analysewert „Days full months“. Dieser Analysewert zählt, wie viele Monate komplett durch den Lagerbestand des aktuellen Berichtsmonats (view_Periode) gedeckt werden. Hierzu generieren wir per MDX die Menge der Monate vom Folgemonat bis zum Monat „X“ (auf Basis eines zukünftigen Intervalls mit determiniertem Endpunkt; hier 12 Monate) deren kumulierte Bestellungen den aktuellen Lagerbestand nicht überschreiten. Nachdem diese Menge (SET) bestimmt ist, zählen wir deren Elemente (.COUNT) und multiplizieren diese mit 30 Tagen.

[Measures].[Days full months] =

{generate
({<view_Periode>.lead(1):<view_periode>.lead(12)},
iif((<view_Periode>, [Measures].[Stock]) >
SUM({<view_Periode>.lead(1):[Periode].[Periode].CurrentMember},[Measures].[Orders]), {[Periode].[Periode].CurrentMember}, NULL
)
)
}.count * 30
Schritt 2: Verbleibender Lagerbestand im Monat „X+1“

Im nächsten Schritt legen wir einen Analysewert „Stock remaining“ an. Dieser berechnet, wie viel Lagerbestand im Monat “X+1” noch verfügbar ist. Hierzu ziehen wir vom aktuellen Lagerbestand die kumulierte Bestellmenge der in Schritt 1 ermittelten Monate ab.

[Measures].[Stock remaining] =

(<view_Periode>, [Measures].[Stock])
-
SUM(
{generate
({<view_Periode>.lead(1):<view_periode>.lead(12)},
iif((<view_Periode>, [Measures].[Stock]) >
SUM({<view_Periode>.lead(1):[Periode].[Periode].CurrentMember}, [Measures].[Orders]), {[Periode].[Periode].CurrentMember}, NULL
)
)
}, [Measures].[Orders])
Schritt 3: Berechnung der verbleibenden Tage im Monat „X+1“

Im dritten Schritt legen wir einen weiteren Analysewert „Days remaining“ an. Zur Berechnung der verbleibenden Tage im Monat „X+1“ benötigen wir den in Schritt 2 berechneten Analysewert „Stock remaining“ und die Bestellmenge des Monats „X+1“. Um diesen Monat zu identifizieren greifen wir wieder auf altbekanntes MDX aus unserem Schritt 1 zurück: die Abfrage zur Ermittlung der Menge mit vollen Monaten. Da wir wissen, dass der letzte Member dieser Menge (TAIL{…}.item(0)) der Monat „X“ ist, müssen wir lediglich dessen Nachfolger (.lead(1)) bestimmen. Die Berechnung des Quotienten und dessen Multiplikation mit 30 Tagen ist dann noch ein Kinderspiel.

[Measures].[Days remaining] =

[Measures].[Stock remaining] /

(Tail(

{generate
({<view_Periode>.lead(1):<view_periode>.lead(12)},
iif((<view_Periode>, [Measures].[Stock]) >
SUM({<view_Periode>.lead(1):[Periode].[Periode].CurrentMember}, [Measures].[Orders]), {[Periode].[Periode].CurrentMember}, NULL
)
)
}
).item(0).lead(1), [Measures].[Orders]) *30
Schritt 4: Ermittlung der DOH

Wer es bis hierhin geschafft hat, der ist nur noch ein winziges Stück von der Berechnung der Days-on-Hand entfernt. Im vierten Schritt müssen dann nur noch die beiden Komponenten bzw. Analysewerte „Days full months“ und „Days remaining“ addiert werden. Auch hier legen wir einen weiteren Analysewert „Days on Hand“ an, in dem die Analysewerte aus Schritt 1 und 3 addiert werden.

[Measures].[Days on Hand] =

[Measures].[Days full months]+
[Measures].[Days remaining]

2012-06-08_Crew_Cockpit
Zusammenfassung

Die schrittweise Ermittlung der Days on Hand dient zur Strukturierung und Verdeutlichung der Herangehensweise. Selbstverständlich lassen sich die einzelnen Schritte auch in der Berechnung eines einzigen Analysewertes „Days on Hand“ zusammenfassen.