FIFO Bestandsverfahren

FIFO Bestandsverfahren












Startseite » Ressourcen » Hier
Von Joannès Vermorel, Juli 2016

Das FIFO-Bestandsverfahren (first-in, first-out) sieht vor, dass die Ware, die zuerst gekauft wurde, auch als erstes verkauft wird. FIFO-Bestand kann auch als theoretische Methode des tatsächlichen Warenflusses betrachtet werden, der für finanzielle Zwecke oder für die Buchhaltung verwendet wird. Außerdem kann der FIFO-Bestand auch als eine Methode für die Lieferkette gesehen werden, die zur Minderung der abgelaufenen Ware oder der Obsoleszenz, die sich negativ auf den gelagerten Bestand auswirkt, beiträgt. FIFO-Bestandsanalysen bieten auch die Möglichkeit, das „Alter“ des Bestands zu berechnen, sowie Lagerhüter oder toten Bestand festzustellen. Auf dieser Seite wird dokumentiert, wie die FIFO-Analyse in der Praxis ausgeführt wird, sowie die theoretischen und praktischen Begrenzungen dieses Ansatzes.

Physisches FIFO

Aus der Sicht der Lieferkette, die sich auf den tatsächlichen Warenfluss konzentriert, wird die Lieferung als erstes der zuerst erhaltenen Waren positiv bewertet. Wird dieser Prozess übernommen, können Unternehmen oft die meisten Abschreibungen abgelaufener Ware vermeiden, solange es keinen Überbestand der Ware gibt. Somit kann auch geringfügige Obsoleszenz, die mit langen Lagerzeiträumen zusammenhängt (z.B. vergilbte Verpackungen), vermeiden.

Im Mode-Online-Handel können bis zu 50% aller versandten Produkte Rückgaben sein. In diesem Kontext gilt als bewährtes Verfahren, zuerst die bereits zurückgegebene Ware erneut zu versenden. Diese Regel stellt eine Erweiterung des FIFO-Verfahrens dar, bei der die Rückgaben passend berücksichtigt werden. Durch dieses Verfahren wird es auch einfacher, mit zweitrangigen Vertriebskanälen am Ende einer Produktkollektion zu arbeiten.

Viele Lagersysteme unterscheiden überhaupt nicht, welche Einheiten zuerst versandt werden und senden beliebige Bestandseinheiten, statt der ältesten. Doch dieses Verfahren zu analysieren geht über das Ziel dieses Dokuments hinaus.

FIFO-Analyse

Im Gegensatz zum physischen FIFO, nimmt die FIFO-Analyse eine theoretische Bestandsperspektive ein, indem sie davon ausgeht, dass die frühesten gekauften Einheiten im Bestand unabhängig vom tatsächlichen physischen Warenfluss gesendet werden. Die FIFO-Perspektive vereinfacht so deutlich die finanzielle Bestandsanalyse.

In der Praxis benötigt man für eine FIFO-Analysis nur:

  • die aktuelle Bestandshöhe
  • die Historie der Kaufaufträge mi Lieferzeiten

Auf Grundlage dieser Daten, kann die FIFO-Analyse Folgendes berechnen:

  • die Bestandsbewertung, wobei die verschiedenen Kaufpreise berücksichtigt werden
  • die erwartete Nettogewinnspanne, die von den Kaufpreisen abhängt
  • das Durchschnittsalter des Bestands (sowie Extreme)

Im nächsten Abschnitt veranschaulichen wir, wie dies aus praktischer Sicht berechnet werden kann.

Envision und FIFO-Analyse

Lokad verwendet eine Skriptsprache namens Envision, die für die quantitative Optimierung der Lieferkette entwickelt wurde. Envision bietet eine fifo()-Funktion, die genau für die FIFO-Analyse gedacht ist.

Intuitiv würde man in Anbetracht der aktuellen Bestandshöhe und der vergangenen Kaufaufträge erwarten, dass das fifo()-Verfahren eine auf eine oder andere Art eine detaillierte Zusammensetzung des Bestands liefert, die das Alter jeder verbleibenden Einheit im Bestand anzeigt. So geht hervor, dass jede Einheit einer, und ausschließlich einer, Bestellzeile zugeordnet wird. Diese Einsicht ist zwar etwas subtil, doch sie ergibt eine Methode, bei der für jede Bestellzeile berechnet wird, wie viele Einheiten in Bezug auf die aktuelle Bestandshöhe nicht verkauft sind.

Folglich ist es recht unkompliziert zu sehen, wie diese nicht verkauften Mengen verwendet werden können, um daraus die relevanten finanziellen KPIs abzuleiten. Sehen wir nun, wie die fifo()-Funktion die nicht verkauften Mengen berechnet, die jeder Bestellzeile zugeordnet werden:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
  "Quantity" as Qty

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
show table "Unsold" with
  Id
  PO.Date
  PO.Unsold
Das obere Skript beginnt mit dem Einlesen zweier Dateien: der Artikelliste und der Liste der Bestellungen, wie sie aus dem Beispiel-Dataset erhalten werden. Dann wird in Zeile 5 der Aufruf der fifo()-Funktion ausgeführt. Diese Funktion nimmt drei Argumente an:

  • die aktuelle Bestandshöhe
  • das Datum der Bestellung, gewöhnlich das Lieferdatum
  • die der Bestellung zugeordnete Menge

Auf Zeile 6, zeigt die show table-Anweisung die Ergebnisse der Berechnung an.

Bestandsbewertung

Die Bestandsbewertung lässt sich mit folgendem Skript einfach berechnen:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
  "Quantity" as Qty

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
StockValue = sum(PO.Unsold * PO.NetAmount / PO.Qty)

show table "Total stock value" with
  sum(StockValue)
Das obere Skript multipliziert die nicht verkaufte Menge PO.Unsold mit den Einheitskaufpreis, der als PO.NetAmount / PO.Q berechnet wird.

Durchschnittlicher Kaufpreis

Der durchschnittliche Kaufpreis kann durch das FIFO-Verfahren berechnet werden. Das untere Skript bietet eine Variante des oberen Skripts, die diesen Zweck angepasst ist:
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
  "Quantity" as Qty

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
StockValue = sum(PO.Unsold * PO.NetAmount / PO.Qty)
PP = StockValue /. sum(PO.Unsold)

where PP > 0 // Artikel ohne Bestellung filtern
  show table "Purchase prices" with
    Id
    Name
    PP
Der Vektor PP enthält die Kaufpreise aller Artikel. Da wir als Divisionsoperator /. nutzen - der null zurückgibt, wenn der Nenner null ist - werden alle Artikel, bei denen kein Kaufpreis berechnet werden kann, auf Zeile 8 aufgrund der fehlenden Zuordnung zu einer Bestellung, gefiltert.

Alter des Bestands

Das Alter des Bestands lässt sich auch äußerst einfach berechnen, doch hierzu bedarf es einer zusätzlichen Komponente: das Datum, das die Gegenwart darstellt. tatsächlich können manche Bestandsdaten einige Tage alt sein und das aktuelle Kalenderdatum kann u.U. nicht das richtige Datum, um die Analyse auszuführen, sein. Im unteren Beispiel geben wir eine Variable namens `today` ein, die in der Praxis noch weiter angepasst werden kann.
read "/sample/Lokad_Items.tsv"
read "/sample/Lokad_PurchaseOrders.tsv" as PO with
  "Quantity" as Qty

// zuletzt in Daten beobachtet
today := max(PO.Date) + 1

PO.Unsold = fifo(StockOnHand, PO.Date, PO.Qty)
PO.Age = (today - PO.Date) // Alter in Tagen
Age = sum(PO.Unsold * PO.Age) /. sum(PO.Unsold)

show table "Stock age" with
  Id
  Name
  Age
  order by Age desc
Das obere Skript zeigt die Liste aller vorrätiger Artikel nach Bestandsalter, wobei die ältesten Artikel in der Tabelle an erster Stelle stehen. Diese Berechnung wird in Zeile 8-10 ausgeführt, wobei das Durchschnittsalter jeder Kaufbestellung in Bezug auf die nicht verkauften Mengen ermittelt wird.

Grenzen der FIFO-Analyse

Die Aussagekraft der FIFO-Analyse geht auf die grundlegenden Annahmen bezüglich des Bestandsflusses zurück. Doch, wenn die Daten oder der tatsächliche Warenfluss von diesen Annahmen abweichen, leiden oft die Ergebnisse. In diesem Abschnitt bieten wir einen Überblick über die gewöhnlichsten Probleme, die bei der FIFO-Analyse auftreten.

Gekürzte Kaufhistorie

Obwohl es nicht immer nötig ist, die gesamte Kaufhistorie vom Anfang an zu haben, kommt es bei FIFO-Analysen vor, dass sich die ältesten Einheiten schon seit vor der Zeit der Historie im Bestand befinden. Auch wenn es in manchen Branchen nicht ungewöhnlich ist, Historien von über 10 Jahren zu besitzen, wie etwa in Luft- und Raumfahrt, kann es äußerst komplex sein, 10 Jahre Kaufhistorie aus den Unternehmenssystemen abzurufen.

Die Wiedergabe von Fehlbeständen kann gefährlich sein

Wenn sowohl die Einkaufshistorie, sowie die Absatzhistorie verfügbar sind, ist der Gedanke verlockend, die gesamte Historie von Fehlbeständen durch die Wiedergabe aller Käufe und Verkäufe in chronologischer Reihenfolge, erneut zu berechnen. Theoretisch könnten alle Bestandshöhen zu jeglicher Zeit durch eine solche Simulation erneut berechnet und alle Zeiträume, in denen die Bestandshöhe bei null lag, als Fehlbestand hervorgehoben werden.

Leider zeigt unsere Erfahrung bei Lokad, dass dieser Ansatz selten funktioniert. In diesem Fall, stellt die kleinste Ungereimtheit, wie etwa eine einzige Einheit, die nicht berücksichtigt wurde, die gesamte Analyse auf den Kopf. Denn Fehlbestände sind fast nie auf null, sondern entsprechen viel mehr, kleinen (positiven oder negativen) Mengen, die nicht benutzt werden können, um Fehlbestände positiv zu erkennen.

Serienbestand (serial inventory)

Wenn alle Einheiten eine einzige Seriennummer besitzen und wenn alle Warenbewegungen nach dieser Seriennummer bezeichnet werden sollte die FIFO-Analyse gewöhnlich nur als sehr grobe Schätzung verstanden werden. Denn bei Bestand, der es wert ist, physisch nach Seriennummer (S/N) verfolgt zu werden, ist es auf jeden Fall sinnvoll auch die zusätzlichen Details, die durch diese Seriennummer erhalten werden, bei der Analyse zu nutzen.