none
Analysis Services: Lagerstände im Würfel aus Bewegungen errechnen

    Question

  • Hallo zusammen,

    wir verwenden SQL-Server Enterprise 2008R2 Analysis Services und ein externer Programmierer erstellt OLAP-Würfel für uns. Allerdings habe ich für die Lagerstände keine zufriedenstellende Lösung, was mich ein wenig wundert. Ich möchte daher Fragen, wie meine Idee umgesetzt werden kann:

    1) Daten

    Die Zeitdimension hat Tage (/Monate/Quartale/Halbjahre/Jahre).

    Der Würfel enthält an Measures Verkaufszahlen und Lagerstände.

    An Facts kann ich monatliche Inventuren (=Lagerstände zum Monatsletzten) für alle Artikel aus unserem ERP-System bieten.

    An Facts habe ich auch alle einzelnen Lagerbewegungen für jeden Tag des Monats. Für jeden Tag gibt es auch Verkaufszahlen.

    2) Das soll der Bericht zeigen

    In meinen Berichten möchte ich den Mai 2011 auswählen (also ein Monat) und die Verkaufszahlen des Monats und den Lagerstand des letzten Tages im Mai sehen.

    Im Bericht möchte ich einen einzelnen Tag, z. B. den 10. Mai 2011 anzeigen und die Verkäufe des Tages und den Lagerstand des Tages sehen.

    Im Bericht wähle ich das Jahr 2011 und möchte alle Verkäufe des Jahres und den Lagerstand vom 31.12.2011 sehen.

    3) Wie muss der Würfel aufgebaut sein?

    Im Würfel müssten nun die Verkaufszahlen als "normale" Measures definiert werden. Das ist ja kein Problem.

    Im Würfel müssten die Measures für die Lagerstände als "semiadditive" Measures definiert werden. Wenn ich einen Tag auswähle müssen alle Bewegungen des Monats bis zu dem Tag addiert werden (also Anfangsbestand + Bewegungen bis zum gewählten Tag). Wenn ich ein Monat auswähle, müssen alle Bewegungen (Anfangsbestand+Bewegungen) addiert werden. Wenn ich ein Quartal/Halbjahr/Jahr wähle, darf nichts addiert werden, sondern nur die letzte Monatssumme des Zeitraums angezeigt werden (abgefragt wird Quartal3, tats. angezeigt wird aber die Summe vom September).

    Wie geht das (oder ein Teil davon) mit semiadditiven Measures? Welche Alternativen gibt es?

    Wenn es so nicht geht, bleibt mir ja fast nichts anderes, als täglich eine Inventur künstlich abzuspeichern. Bei den Abfragen wird dann immer nur der letzte Tag des gewählten Zeitraums angezeigt. Bei tausenden Artikeln kommt da aber eine Menge zusammen.

    Gefühlsmässig kann das nichts Neues oder Aussergewöhnliches sein.

    lg

    arno

     

     

    Wednesday, January 25, 2012 10:36 AM

Answers

  • Hallo Arno,

    zunächst einmal zur Klärung "Semiadditive Measures", das ist so ein wager Begriff.
    Es gibt zum einen semiaddtive Aggregatfunktionen ein Average und DistinctCount. Bei denen ist es so, das die Summe von Teilergebnissen aus Slices nicht immer der Gesamtsumme ohne Slice entspricht.
    Dann gibt es noch ein semiadditves Verhalten von Measures.

    Beides ist aber für Deine Anforderung nicht relevant.
    Der einzige Unterschied zwischen Verkaufszahlen und Lagerbestand ist nur, das bei Verkaufszahlen der Berichtszeitraum Von-Bis beachtet werden muss (Umsatz) und bei Lagerbestand nur der Berichtszeitraum -Bis (Saldo).
    Oder um es buchhalterisch auszudrücken, es verhält sich wie Erfolgskonten, wo nur der aktuelle Umsatz betrachte wird, und Bilanzkonten, wo der laufende Saldo wichtig ist; nur das man beim Lager keinen Saldenvortrag hat.

    Nun hängt es davon ab, wie das Berichtswesen aussieht und welchen Einfluß Du auf die MDX Abfragen nehmen kannst.
    Kannst Du vollen Einfluß nehmen, reicht eine Zeitdimension aus und Du musst den Filter nur so anpassen, das bei den Lagerbewegungen immer nur auf Bis gefiltert wird.

    Andernfalls wäre es günstig, die Zeitdimension ein zweites mal für Lager in den Cube hinzuzufügen, dann müsste für den Bericht die Zeit zweimal angegeben werden.

     


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Wednesday, January 25, 2012 5:23 PM
  • Hallo Arno,

    wenn Du mit täglichen Lagerbeständen arbeiten würdest, verbaust Du Dir jegliche Felxibilität, z.B. eine Auswertung über einen bestimmten Zeitraum und Du könntest auch keine kumulierte Lagerbewegungen darstellen, z.B. um zu analysisieren, welcher Artikel den höchsten Umschlag in einem Zeitraum hat.

    Du kannst das alles problemlos mit den Lagerbewegungen abbilden. Deiner letzten Frage nach vermute ich mal, das Du MDX Statements erstellen kannst und somit in der Hinsicht flexibel bist. Da kannst Du auch mit einer Datumsdimension arbeiten.

    Hier ein Beispiel für einen (alte) AdventureWorks Cube. Für den Umsatz wird Von-Bis verwendet, für Lager nur der Bis Wert; als Von Wert wird einfach ein leerer Member angegeben.

    WITH 
        MEMBER [Measures].Umsatz AS
            SUM( ([Date].[Date].&[124] : [Date].[Date].&[153] ), [Measures].[Internet Order Quantity] )
        MEMBER [Measures].Lager AS 
            SUM( ([Date].[Date].&[]    : [Date].[Date].&[153] ), [Measures].[Internet Order Quantity] )
    SELECT 
        {[Measures].Umsatz
        ,[Measures].Lager} ON 0
    FROM [Adventure Works]
    


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Thursday, January 26, 2012 4:34 PM

All replies

  • Hallo Arno,

    zunächst einmal zur Klärung "Semiadditive Measures", das ist so ein wager Begriff.
    Es gibt zum einen semiaddtive Aggregatfunktionen ein Average und DistinctCount. Bei denen ist es so, das die Summe von Teilergebnissen aus Slices nicht immer der Gesamtsumme ohne Slice entspricht.
    Dann gibt es noch ein semiadditves Verhalten von Measures.

    Beides ist aber für Deine Anforderung nicht relevant.
    Der einzige Unterschied zwischen Verkaufszahlen und Lagerbestand ist nur, das bei Verkaufszahlen der Berichtszeitraum Von-Bis beachtet werden muss (Umsatz) und bei Lagerbestand nur der Berichtszeitraum -Bis (Saldo).
    Oder um es buchhalterisch auszudrücken, es verhält sich wie Erfolgskonten, wo nur der aktuelle Umsatz betrachte wird, und Bilanzkonten, wo der laufende Saldo wichtig ist; nur das man beim Lager keinen Saldenvortrag hat.

    Nun hängt es davon ab, wie das Berichtswesen aussieht und welchen Einfluß Du auf die MDX Abfragen nehmen kannst.
    Kannst Du vollen Einfluß nehmen, reicht eine Zeitdimension aus und Du musst den Filter nur so anpassen, das bei den Lagerbewegungen immer nur auf Bis gefiltert wird.

    Andernfalls wäre es günstig, die Zeitdimension ein zweites mal für Lager in den Cube hinzuzufügen, dann müsste für den Bericht die Zeit zweimal angegeben werden.

     


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Wednesday, January 25, 2012 5:23 PM
  • Hallo Olaf,

    danke für deine Antwort!

    Allerdings bedeutet das nichts anderes, als dass Bewegungen nicht als Lagerstand dargestellt werden können. Ich muss also zwei Zeiträume aufrufen (einer für den "Umsatz", einer vom 1.1.1900 bis zum Ende des Umsatzzeitraums für den Lagerstand aus allen Zu- und Abbuchungen) oder ich stelle tägliche Lagerstände bereit (tägliche Inventur) und zeige im Bericht nur den letzten Lagerstand des Umsatzzeitraums an.

    >Du musst den Filter nur so anpassen, das bei den Lagerbewegungen

    >immer nur auf Bis gefiltert wird

    Kannst du mir erläutern, wie das geht? (Einstellungen, Beispiel mit MDX...)

    lg

    arno

     

    Thursday, January 26, 2012 1:23 PM
  • Hallo Arno,

    wenn Du mit täglichen Lagerbeständen arbeiten würdest, verbaust Du Dir jegliche Felxibilität, z.B. eine Auswertung über einen bestimmten Zeitraum und Du könntest auch keine kumulierte Lagerbewegungen darstellen, z.B. um zu analysisieren, welcher Artikel den höchsten Umschlag in einem Zeitraum hat.

    Du kannst das alles problemlos mit den Lagerbewegungen abbilden. Deiner letzten Frage nach vermute ich mal, das Du MDX Statements erstellen kannst und somit in der Hinsicht flexibel bist. Da kannst Du auch mit einer Datumsdimension arbeiten.

    Hier ein Beispiel für einen (alte) AdventureWorks Cube. Für den Umsatz wird Von-Bis verwendet, für Lager nur der Bis Wert; als Von Wert wird einfach ein leerer Member angegeben.

    WITH 
        MEMBER [Measures].Umsatz AS
            SUM( ([Date].[Date].&[124] : [Date].[Date].&[153] ), [Measures].[Internet Order Quantity] )
        MEMBER [Measures].Lager AS 
            SUM( ([Date].[Date].&[]    : [Date].[Date].&[153] ), [Measures].[Internet Order Quantity] )
    SELECT 
        {[Measures].Umsatz
        ,[Measures].Lager} ON 0
    FROM [Adventure Works]
    


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Thursday, January 26, 2012 4:34 PM
  • Danke Olaf für die Erklärung und das Beispiel, so kann ich die gewünschten Werte ermitteln.

    Als vorstandstauglicher DAU hätte ich mir natürlich vorgestellt, dass ich einen Zeitraum wähle und dennoch den letzten Lagerstand und den Umsatz des Zeitraums bekomme. So muss ich in den Reports immer herumdoktern, ich kann mir nur aussuchen, ob ich es mit den Bewegungen oder den Ständen leichter oder schwerer mache :)

    lg

    arno

     

    Monday, January 30, 2012 2:13 PM
  • Hallo cavallino,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Monday, February 13, 2012 10:13 AM
  • sorry, ja, das Theme ist erledigt!

    danke

    arno

    Monday, February 13, 2012 10:15 AM
  • Hallo Arno!

    Wie hast Du es gelöst? Ich habe das gleiche Problem....

    Gruß

    Joachim Streit


    MfG Joachim Streit

    Tuesday, February 14, 2012 1:52 PM
  • da ich "saubere" Lagerdaten habe, importiere ich alle Lagerbewegungen. Die erste Lagerbewegung ist allerdings ein Inventurstand aus 2008, sonst muss ich zurück ins 19. Jahrhundert... ;)

    In den Abfragen erhalte ich immer die Bewegungen des gewählten Zeitraums, für Inventurwerte muss ich die Summe vom 31.12.2008 (oder "nix", wie oben von Olaf gezeigt) bis zum gewünschten Datum abfragen (dabei dürfte das Monat und dessen last member reichen, hoffe ich zumindest).

    Ob es eine Art benutzerdefinierte Funktion in MDX gibt, die aus einem gewählten Monat eine Summe über den Zeitraum vom 31.12.2008 bis zum letzten Member des Monats machen kann, weiss ich noch nicht, wer weiss...

    Wenn alle Stricke reissen, muss halt mein xlCubed ran, von dem ich sehr angetan bin.

    lg

    arno

    Tuesday, February 14, 2012 2:09 PM
  • Ob es eine Art benutzerdefinierte Funktion in MDX gibt, die aus einem gewählten Monat eine Summe über den Zeitraum vom 31.12.2008 bis zum letzten Member des Monats machen kann, weiss ich noch nicht, wer weiss...

    Hallo Arno,

    es ist eine häufige Anforderung, zu den Werten für den Berichtszeitraum z.B. auch die Werte aus dem Vorjahr für den gleichen Zeitbereich zu erhalten, um die Steigerung auszuwerten; und was häufig gewünscht wird, geht häufig auch.

    Wenn Du eine Zeitdimension hast, die auch als solche definiert wurde und evtl auch adequate Hierachien hat, kannst Du die diversen Navigationsfunktionen nutzen.

    Z.B. mit der YTD = Year To Date Funktion kannst Du die laufende Jahressumme bis zu einem bestimmten Datum ermitteln; also z.B. neben dem aktuellem Monatsumsatz noch den gesamten Jahresumsatz. Mit ParallelPeriod kannst Du den Vormonat/-Jahr ermitteln, mit LastPeriods die letzten x Monate/-Jahre,die Descendants Funktion ist auch sehr mächtig, usw.

    Es gibt also umfangreiche (Navigations-) Funktionen, mit denen man so ziemlich alles lösen kann.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Tuesday, February 14, 2012 4:59 PM
  • >so ziemlich alles lösen

    Hallo Olaf,

    wer braucht schon alles :)  , wenn doch die Summe vom nullten Tag weg reicht (nicht vom ersten eines Jahres, Monats). Wie sieht denn ein Beispiel aus, für "Summe vom nullten Tag bis zur gewählten Periode"?

    Wie wäre es mit Select lastperiods(9999999, [Irgendein Zeitpunkt])?

    lg

    arno

    Tuesday, February 14, 2012 5:27 PM