Getestet mit JTL-Wawi bis 1.11.*

JTL-Wawi: Lagerbestand zu jedem Zeitpunkt ermitteln – auf Datum und Uhrzeit genau, je Warenlager

Wie hoch war der Bestand am 31.12. um 23:59 Uhr? Per SQL aus dem Lagerjournal der JTL-Wawi – auf die Sekunde genau, je Lager.

Steuerberater, Inventur oder Jahresabschluss fragen oft dasselbe: Wie hoch war der Bestand an einem bestimmten Tag – und zu welcher Uhrzeit? Die JTL-Wawi zeigt in der Oberfläche den aktuellen Bestand – einen Blick in die Vergangenheit gibt es dort nicht.

Die gute Nachricht: Die Wawi protokolliert jede Lagerbewegung mit Zeitstempel. Daraus lässt sich der Bestand zu jedem beliebigen Zeitpunkt zurückrechnen – nicht nur für einen Tag, sondern auf Datum und Uhrzeit genau, etwa für den Stand vor oder nach dem Inventurlauf oder direkt vor einer Umlagerung.

Das Prinzip

JTL führt zwei Bewegungstabellen: Eingänge (dbo.tWarenLagerEingang) und Ausgänge (dbo.tWarenLagerAusgang). Beide enthalten Artikel, Lagerplatz, Menge und Erstellungszeitpunkt. Der Bestand zum Zeitpunkt T ist damit:

Bestand(T) = Summe aller Eingänge bis T − Summe aller Ausgänge bis T

Über den Lagerplatz (dbo.tWarenLagerPlatz) kommen wir an das Warenlager – so entsteht eine Liste je Artikel und Warenlager.

Die Abfrage

Die Abfrage liest nur und ändert keine Daten. Sie läuft in SQL Server Management Studio (Datenbank eazybusiness) – oder ohne Zusatzwerkzeug als eigener Export in der JTL-Ameise (siehe unten).

DECLARE @Stichtag datetime = '2026-12-31T23:59:59';   -- Datum + Uhrzeit im ISO-Format

;WITH Bewegungen AS (
    SELECT e.kArtikel, wp.kWarenLager, e.fAnzahl AS Menge
      FROM dbo.tWarenLagerEingang e
      JOIN dbo.tWarenLagerPlatz wp ON wp.kWarenLagerPlatz = e.kWarenLagerPlatz
     WHERE e.dErstellt <= @Stichtag
    UNION ALL
    SELECT x.kArtikel, wp.kWarenLager, -x.fAnzahl
      FROM dbo.tWarenLagerAusgang x
      JOIN dbo.tWarenLagerPlatz wp ON wp.kWarenLagerPlatz = x.kWarenLagerPlatz
     WHERE x.dErstellt <= @Stichtag
)
SELECT
    a.cArtNr  AS Artikelnummer,
    b.cName   AS Artikelname,
    wl.cName  AS Warenlager,
    CAST(SUM(m.Menge) AS DECIMAL(18,2)) AS Bestand
FROM Bewegungen m
JOIN dbo.tArtikel   a  ON a.kArtikel     = m.kArtikel
JOIN dbo.tWarenLager wl ON wl.kWarenLager = m.kWarenLager
LEFT JOIN dbo.tArtikelBeschreibung b
       ON b.kArtikel = a.kArtikel AND b.kPlattform = 1
      AND b.kSprache = (SELECT TOP 1 kSprache FROM DbeS.vSprache WHERE nWawiStandard = 1)
WHERE a.cAktiv = 'Y'
  AND (a.kStueckliste = 0 OR a.kStueckliste IS NULL)
GROUP BY a.cArtNr, b.cName, wl.cName
HAVING SUM(m.Menge) <> 0
ORDER BY a.cArtNr, wl.cName;

Varianten

Nur ein bestimmtes Lager: Ergänzen Sie die HAVING-Zeile um den Lagernamen:

HAVING SUM(m.Menge) <> 0 AND wl.cName = 'Hauptlager'

Gesamtbestand ohne Aufteilung nach Lagern: Lassen Sie das Warenlager aus SELECT und GROUP BY weg – dann wird je Artikel über alle Lager summiert.

Auch inaktive Artikel: Entfernen Sie die Bedingung a.cAktiv = 'Y'. Für eine Inventur zum Stichtag ist das oft sinnvoll, weil ein Artikel damals noch aktiv gewesen sein kann.

Was Sie wissen sollten

Punkt Bedeutung
Datum im ISO-Format 'JJJJ-MM-TTThh:mm:ss' – sonst drohen Konvertierungsfehler je nach Spracheinstellung des Servers
Uhrzeit mitgeben 23:59:59 für „Stand am Ende des Tages“, 00:00:00 für „Stand am Morgen“
Vaterartikel und Stücklisten erscheinen nicht – ihr Bestand ergibt sich aus Kindartikeln bzw. Komponenten
Ergebnis prüfen Mit heutigem Datum ausgeführt, muss die Summe je Artikel dem aktuellen Bestand in der Wawi entsprechen

Der letzte Punkt ist der wichtigste Test: Führen Sie die Abfrage einmal mit dem aktuellen Zeitpunkt aus und vergleichen Sie einige Artikel mit dem Bestand in der Wawi. Stimmt das überein, stimmt auch der Blick in die Vergangenheit.

Bestandswert zum Stichtag

Für den Jahresabschluss braucht man meist nicht nur die Menge, sondern den Wert. Dafür lässt sich die Abfrage um den Einkaufspreis erweitern. Welcher Preis der richtige ist – aktueller Durchschnitts-EK, letzter EK oder EK zum Stichtag –, sollten Sie vorher mit Ihrem Steuerberater klären. Das ist keine Frage der Technik, sondern der Bewertungsmethode.

Ohne SQL Server Management Studio: als eigener Export in der JTL-Ameise

Wer nicht mit SQL Server Management Studio arbeiten möchte, legt die Abfrage einfach als eigenen Export in der JTL-Ameise an. Die Ameise führt das SQL aus und speichert das Ergebnis direkt als CSV – ideal, wenn der Bestand zum Stichtag regelmäßig gebraucht wird, etwa zum Monats- oder Jahresende.

Für die Ameise schreiben Sie den Zeitpunkt direkt in die Abfrage statt in eine Variable:

;WITH Bewegungen AS (
    SELECT e.kArtikel, wp.kWarenLager, e.fAnzahl AS Menge
      FROM dbo.tWarenLagerEingang e
      JOIN dbo.tWarenLagerPlatz wp ON wp.kWarenLagerPlatz = e.kWarenLagerPlatz
     WHERE e.dErstellt <= '2026-12-31T23:59:59'
    UNION ALL
    SELECT x.kArtikel, wp.kWarenLager, -x.fAnzahl
      FROM dbo.tWarenLagerAusgang x
      JOIN dbo.tWarenLagerPlatz wp ON wp.kWarenLagerPlatz = x.kWarenLagerPlatz
     WHERE x.dErstellt <= '2026-12-31T23:59:59'
)
SELECT a.cArtNr AS Artikelnummer, b.cName AS Artikelname, wl.cName AS Warenlager,
       CAST(SUM(m.Menge) AS DECIMAL(18,2)) AS Bestand
  FROM Bewegungen m
  JOIN dbo.tArtikel   a  ON a.kArtikel     = m.kArtikel
  JOIN dbo.tWarenLager wl ON wl.kWarenLager = m.kWarenLager
  LEFT JOIN dbo.tArtikelBeschreibung b
         ON b.kArtikel = a.kArtikel AND b.kPlattform = 1
        AND b.kSprache = (SELECT TOP 1 kSprache FROM DbeS.vSprache WHERE nWawiStandard = 1)
 WHERE a.cAktiv = 'Y' AND (a.kStueckliste = 0 OR a.kStueckliste IS NULL)
 GROUP BY a.cArtNr, b.cName, wl.cName
HAVING SUM(m.Menge) <> 0
 ORDER BY a.cArtNr, wl.cName;

Der Zeitpunkt steht hier zweimal in der Abfrage – einmal für die Eingänge, einmal für die Ausgänge. Ändern Sie immer beide Stellen, sonst stimmt der Bestand nicht.

Weitere Wege zum Export

In SQL Server Management Studio lässt sich das Ergebnis per Rechtsklick → Ergebnisse speichern unter als CSV sichern. Alternativ kann die Abfrage auch als eigene Übersicht direkt in der Wawi hinterlegt werden.

Sie brauchen den Bestand zu einem Stichtag, haben aber keinen Zugang zum SQL Server oder wollen sichergehen, dass die Zahlen stimmen? Wir übernehmen die Auswertung für Sie.

Lieber nicht selbst in die Datenbank?Wir übernehmen Abfrage und Auswertung für Sie.
Auswertung anfragen

Häufige Fragen

Kann JTL-Wawi den Lagerbestand zu einem vergangenen Datum anzeigen?

Nicht direkt in der Oberfläche. Die Wawi speichert aber jede Lagerbewegung mit Zeitstempel. Aus Eingängen minus Ausgängen bis zum gewünschten Zeitpunkt lässt sich der Bestand per SQL exakt berechnen.

Warum fehlen in der Auswertung manche Artikel?

Vaterartikel von Variationen und Stücklisten führen keinen eigenen Bestand über das Lagerjournal. Ihr Bestand ergibt sich aus den Kindartikeln bzw. Komponenten, die in der Liste enthalten sind.

Warum bekomme ich einen Fehler beim Datum?

Das Datum muss im ISO-Format JJJJ-MM-TTThh:mm:ss angegeben werden, zum Beispiel 2026-12-31T23:59:59. Andere Schreibweisen hängen von den Spracheinstellungen des SQL Servers ab und führen schnell zu Konvertierungsfehlern.

Geht das auch ohne SQL Server Management Studio?

Ja. Die Abfrage lässt sich als eigener Export in der JTL-Ameise anlegen. Die Ameise führt sie aus und speichert das Ergebnis als CSV-Datei.

Kann ich die Abfrage gefahrlos auf dem Produktivsystem ausführen?

Ja, die Abfrage liest nur und ändert nichts. Bei sehr großen Datenbanken sollte man sie trotzdem außerhalb der Hauptgeschäftszeiten laufen lassen.

Lassen Sie uns über Ihr JTL-Setup sprechen.

Kurz anrufen oder schreiben – im kostenlosen Erstgespräch klären wir, wo es hakt und was sinnvoll ist.