Gelöst Stichtagsbezogene Lagerbewertung [WAWI-37044, WAWI-37043, WAWI-33817, WAWI-32600, WAWI-8316]

overfl0w23

Sehr aktives Mitglied
19. Oktober 2020
131
73
Celle
Hier ein Beispiel:
Screenshot_1.png
SQL-Server: IPADRESSE,PORT\INSTANZ
Datenbank: eazybusiness
SQL Benutzername: (Hier reicht ein Nutzer mit Lesezugriff)
Passwort: Passwort vom Benutzer darüber.


LG
 
  • Gefällt mir
Reaktionen: MoS.pnx

Kissenoutlet24.de

Gut bekanntes Mitglied
2. April 2012
167
9
Sonneberg
Moin Zusammen, ich habe ein wenig Zeit gehabt und eine komplett neue Version gebaut. Wie immer dennoch Beta und ich übernehme keine Gewähr für irgendwas.
Über Feedback oder eine kleine Spende würde ich mich freuen.


Den Anhang 117352 betrachten

Download nach wie vor unter: https://schadeit.de/stockscope/

LG
Hallo,
wir haben gerade mal das Tool getestet,
es scheint ein Bestandsproblem zu geben.
Bei manchen Artikeln, kommt es uns vor als würde das Tool 1 und 7 verwechseln.
Also aktueller Bestand 11 in der WaWi und im Tool Bestand 77, ein weiterer Artikel Bestand 100 in der WaWi im Tool 700.
 

Kissenoutlet24.de

Gut bekanntes Mitglied
2. April 2012
167
9
Sonneberg
Ich habe jetzt nochmal etwas an der ersten Abfrage geändert und dies als v0.3b hochgeladen.
Die SQL Abfrage sieht nun so aus:

-- Deklarieren der Parameter für den Stichtag und das Lager
DECLARE @Stichtag AS DATE = @date;
DECLARE @warenlager INT = @warehouse;

-- Hauptabfrage zur Berechnung der Lagerbewertung
SELECT
tArtikel.cArtNr AS Artikelnummer,
MAX(tArtikelBeschreibung.cName) AS Artikelname,
tWarenLager.cName AS Lager,

-- Berechnung des Bestands zum Stichtag
SUM(
ISNULL(tWarenLagerEingang.fAnzahl, 0.0) -- Summe der Wareneingänge bis zum Stichtag
- ISNULL(Warenausgang.fAnzahl, 0.0) -- Abzüglich der Warenausgänge bis zum Stichtag
) AS Bestand,

-- Berechnung des Gesamt-EK-Werts zum Stichtag
SUM(
(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) -- Summe der Wareneingänge
- ISNULL(Warenausgang.fAnzahl, 0.0)) -- Abzüglich der Warenausgänge
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0) -- Multipliziert mit dem Einzel-EK-Preis
) AS EKGesamt,

-- Ermittlung des letzten Lieferdatums
MAX(tWarenLagerEingang.dGeliefertAm) AS LetztesLieferdatum,

-- Bestimmung der Abwertungsstufe basierend auf dem letzten Lieferdatum
CASE
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) THEN 'dieses Jahr 100%'
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) - 1 THEN 'Letztes Jahr 90%'
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) - 2 THEN 'Vorletztes Jahr 80%'
ELSE 'älter als vor 2 Jahren 50%'
END AS Abwertung,

-- Berechnung des wertberichtigten EK-Werts basierend auf der Abwertung
COALESCE(
CASE
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag)
THEN SUM((ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
- ISNULL(Warenausgang.fAnzahl, 0.0))
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0))
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) - 1
THEN SUM((ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
- ISNULL(Warenausgang.fAnzahl, 0.0))
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0) * 0.9)
WHEN YEAR(MAX(tWarenLagerEingang.dGeliefertAm)) = YEAR(@Stichtag) - 2
THEN SUM((ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
- ISNULL(Warenausgang.fAnzahl, 0.0))
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0) * 0.8)
ELSE SUM((ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
- ISNULL(Warenausgang.fAnzahl, 0.0))
* ISNULL(tWarenLagerEingang.fEKEinzel, 0.0) * 0.5)
END
, 0.0) AS Wertberichtigt
FROM dbo.tWarenLagerPlatz
LEFT JOIN dbo.tWarenLagerEingang
ON tWarenLagerPlatz.kWarenLagerPlatz = tWarenLagerEingang.kWarenLagerPlatz
AND tWarenLagerEingang.dErstellt <= @Stichtag -- Nur Wareneingänge bis zum Stichtag
JOIN dbo.tWarenLager
ON tWarenLagerPlatz.kWarenLager = tWarenLager.kWarenLager
LEFT JOIN dbo.tArtikel
ON tWarenLagerEingang.kArtikel = tArtikel.kArtikel
LEFT JOIN dbo.tSpracheUsed
ON dbo.tSpracheUsed.nStandard = 1
LEFT JOIN dbo.tArtikelBeschreibung
ON tArtikel.kArtikel = tArtikelBeschreibung.kArtikel
AND dbo.tSpracheUsed.kSprache = tArtikelBeschreibung.kSprache

-- Subquery zur Berechnung der Warenausgänge bis zum Stichtag
LEFT JOIN
(
SELECT
SUM(ISNULL(tWarenLagerAusgang.fAnzahl, 0.0)) AS fAnzahl,
tWarenLagerAusgang.kWarenLagerEingang
FROM dbo.tWarenLagerAusgang
WHERE tWarenLagerAusgang.dErstellt <= @Stichtag -- Nur Warenausgänge bis zum Stichtag
GROUP BY tWarenLagerAusgang.kWarenLagerEingang
) AS Warenausgang
ON tWarenLagerEingang.kWarenLagerEingang = Warenausgang.kWarenLagerEingang

-- Filtern nach dem ausgewählten Lager
WHERE tWarenLager.kWarenLager = @warenlager

-- Gruppieren nach Lagername und Artikelnummer
GROUP BY tWarenLager.cName, tArtikel.cArtNr

-- Sortieren nach Artikelnummer
ORDER BY tArtikel.cArtNr;

Ich hab das ganze mal ordentlich kommentiert und hoffe, dass ich keinen Denkfehler drin habe.
Würde mich über Feedback freuen.
Hi,
danke für deine Abfrage, leider kommt beim Export folgender Fehler.
 

Anhänge

  • Screenshot 2025-01-03 105918.png
    Screenshot 2025-01-03 105918.png
    7,2 KB · Aufrufe: 14

overfl0w23

Sehr aktives Mitglied
19. Oktober 2020
131
73
Celle
Schaue ich mir schnellstmöglich an. Danke fürs Feedback. Nochmal kurz zum Verständnis:

- Der Fehler kommt beim v0.3b?
- Bestandsproblem bsp: 11 wird zu 77 bei Version 0.4b?

Ich würde mich nur um die neue Version kümmern. Ich hatte keine Fehler bei mir und versuche es nachzustellen bzw den Fehler zu finden.

lg
 

Kissenoutlet24.de

Gut bekanntes Mitglied
2. April 2012
167
9
Sonneberg
Schaue ich mir schnellstmöglich an. Danke fürs Feedback. Nochmal kurz zum Verständnis:

- Der Fehler kommt beim v0.3b?
- Bestandsproblem bsp: 11 wird zu 77 bei Version 0.4b?

Ich würde mich nur um die neue Version kümmern. Ich hatte keine Fehler bei mir und versuche es nachzustellen bzw den Fehler zu finden.

lg
Haben die Version 0.4b getestet.
 

overfl0w23

Sehr aktives Mitglied
19. Oktober 2020
131
73
Celle
- Fehler behoben, bei dem Bestände in manchen Fällen zu hoch waren (z. B. 77 statt 11).
- Ursache: Mehrfache JOINs auf tArtikelBeschreibung führten zu Vervielfachung.
- Lösung: DISTINCT-Join in der Standard- und Mit-Abwertung-SQL-Abfrage eingeführt, damit jeder Artikel nur einmal gejoint wird. Funktion bleibt unverändert, liefert nun aber korrekte Werte.

Version 0.41b

Kissenoutlet24.de würde mich freuen wenn Du mir nen Feedback gibst :)

 

Kissenoutlet24.de

Gut bekanntes Mitglied
2. April 2012
167
9
Sonneberg
- Fehler behoben, bei dem Bestände in manchen Fällen zu hoch waren (z. B. 77 statt 11).
- Ursache: Mehrfache JOINs auf tArtikelBeschreibung führten zu Vervielfachung.
- Lösung: DISTINCT-Join in der Standard- und Mit-Abwertung-SQL-Abfrage eingeführt, damit jeder Artikel nur einmal gejoint wird. Funktion bleibt unverändert, liefert nun aber korrekte Werte.

Version 0.41b

Kissenoutlet24.de würde mich freuen wenn Du mir nen Feedback gibst :)

Hallo,

vielen Dank für die schnelle Umsetzung.
Leider haben wir mit der neuen Version noch keine Lösung.
Bei der neuen Version 0.41 haben wir bei einem Artikel 600 Stück, in der Version 0.4 waren es 700 Stück in der Wawi sind es aber 100 Stück
 

overfl0w23

Sehr aktives Mitglied
19. Oktober 2020
131
73
Celle
Okay, ich schaue es mir nochmal genauer an.
Sobald ich den Fehler habe schreibe ich es hier.
Ich werde ausgiebiger testen.

Danke ebenfalls für die rasche Rückmeldung.
 

overfl0w23

Sehr aktives Mitglied
19. Oktober 2020
131
73
Celle

Kissenoutlet24.de Magst Du folgende SQLs mal testen bitte?​

Wenn es nun stimmt würde ich das einmal als neue Version veröffentlichen.

Standard:
SQL:
-- Hauptabfrage zur Berechnung der Lagerbewertung 0.42b
SELECT
    tArtikel.cArtNr AS Artikelnummer,
    MAX(artDesc.cName) AS Artikelname,                 -- Nur 1 Beschreibung pro Artikel
    AVG(tWarenLagerEingang.fEKEinzel) AS [Durchschnittlicher Einkaufspreis],
    SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
        - ISNULL(Warenausgang.fAnzahl, 0.0)) AS Bestand,
    SUM(
        (ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
         - ISNULL(Warenausgang.fAnzahl, 0.0))
        * ISNULL(tWarenLagerEingang.fEKEinzel, 0.0)
    ) AS [Einkaufspreis Gesamt],
    tWarenLager.cName AS Lagerplatz,
    MAX(tWarenLagerEingang.dGeliefertAm) AS [Letztes Lieferdatum]
FROM dbo.tWarenLagerPlatz
LEFT JOIN dbo.tWarenLagerEingang
    ON tWarenLagerPlatz.kWarenLagerPlatz = tWarenLagerEingang.kWarenLagerPlatz
    AND tWarenLagerEingang.dErstellt <= @date -- Nur Wareneingänge bis zum Stichtag
JOIN dbo.tWarenLager
    ON tWarenLagerPlatz.kWarenLager = tWarenLager.kWarenLager
LEFT JOIN dbo.tArtikel
    ON tWarenLagerEingang.kArtikel = tArtikel.kArtikel

-- Subquery für Artikelbeschreibung (nur 1 Datensatz pro Artikel; Standard-Sprache)
LEFT JOIN
(
    SELECT
        ab.kArtikel,
        ab.cName
    FROM dbo.tArtikelBeschreibung ab
    INNER JOIN dbo.tSpracheUsed su
        ON su.nStandard = 1
        AND su.kSprache = ab.kSprache

    GROUP BY ab.kArtikel, ab.cName
) AS artDesc
    ON tArtikel.kArtikel = artDesc.kArtikel

-- Subquery zur Berechnung der Warenausgänge bis zum Stichtag
LEFT JOIN
(
    SELECT
        SUM(ISNULL(tWarenLagerAusgang.fAnzahl, 0.0)) AS fAnzahl,
        tWarenLagerAusgang.kWarenLagerEingang
    FROM dbo.tWarenLagerAusgang
    WHERE tWarenLagerAusgang.dErstellt <= @date
    GROUP BY tWarenLagerAusgang.kWarenLagerEingang
) AS Warenausgang
    ON tWarenLagerEingang.kWarenLagerEingang = Warenausgang.kWarenLagerEingang

WHERE tWarenLager.kWarenLager = @warehouse

GROUP BY
    tArtikel.cArtNr,
    tWarenLager.cName

ORDER BY
    tArtikel.cArtNr;

Mit Abwertung:
SQL:
-- Diese SQL-Abfrage berechnet die Lagerbewertung für Artikel in einem Lager
-- inkl. Abwertung nach Lagerdauer 0.42b
WITH LagerBewertung AS
(
    SELECT
        tArtikel.cArtNr AS Artikelnummer,
        MAX(artDesc.cName) AS Artikelname,   -- Nur 1 Beschreibung pro Artikel
        AVG(tWarenLagerEingang.fEKEinzel) AS [Durchschnittlicher Einkaufspreis],
        SUM(
            ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
            - ISNULL(Warenausgang.fAnzahl, 0.0)
        ) AS Bestand,
        SUM(
            (ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
             - ISNULL(Warenausgang.fAnzahl, 0.0))
            * ISNULL(tWarenLagerEingang.fEKEinzel, 0.0)
        ) AS [Einkaufspreis Gesamt],
        tWarenLager.cName AS Lagerplatz,
        MAX(tWarenLagerEingang.dGeliefertAm) AS [Letztes Lieferdatum],
        DATEDIFF(YEAR, MAX(tWarenLagerEingang.dGeliefertAm), @date) AS [Lagerdauer in Jahren]
    FROM dbo.tWarenLagerPlatz
    LEFT JOIN dbo.tWarenLagerEingang
        ON tWarenLagerPlatz.kWarenLagerPlatz = tWarenLagerEingang.kWarenLagerPlatz
        AND tWarenLagerEingang.dErstellt <= @date
    JOIN dbo.tWarenLager
        ON tWarenLagerPlatz.kWarenLager = tWarenLager.kWarenLager
    LEFT JOIN dbo.tArtikel
        ON tWarenLagerEingang.kArtikel = tArtikel.kArtikel

    -- Subquery für Artikelbeschreibung (nur 1 Datensatz pro Artikel; Standard-Sprache)
    LEFT JOIN
    (
        SELECT
            ab.kArtikel,
            ab.cName
        FROM dbo.tArtikelBeschreibung ab
        INNER JOIN dbo.tSpracheUsed su
            ON su.nStandard = 1
            AND su.kSprache = ab.kSprache

        GROUP BY ab.kArtikel, ab.cName
    ) AS artDesc
        ON tArtikel.kArtikel = artDesc.kArtikel

    -- Subquery zur Berechnung der Warenausgänge bis zum Stichtag
    LEFT JOIN
    (
        SELECT
            SUM(ISNULL(tWarenLagerAusgang.fAnzahl, 0.0)) AS fAnzahl,
            tWarenLagerAusgang.kWarenLagerEingang
        FROM dbo.tWarenLagerAusgang
        WHERE tWarenLagerAusgang.dErstellt <= @date
        GROUP BY tWarenLagerAusgang.kWarenLagerEingang
    ) AS Warenausgang
        ON tWarenLagerEingang.kWarenLagerEingang = Warenausgang.kWarenLagerEingang

    WHERE tWarenLager.kWarenLager = @warehouse

    GROUP BY
        tArtikel.cArtNr,
        tWarenLager.cName
)
SELECT
    Artikelnummer,
    Artikelname,
    [Durchschnittlicher Einkaufspreis],
    Bestand,
    [Einkaufspreis Gesamt],
    Lagerplatz,
    [Letztes Lieferdatum],
    [Lagerdauer in Jahren],
    CASE
        WHEN [Lagerdauer in Jahren] >= 3 THEN 0.5  -- 50% Abwertung nach 3 Jahren
        WHEN [Lagerdauer in Jahren] = 2 THEN 0.8   -- 20% Abwertung nach 2 Jahren
        WHEN [Lagerdauer in Jahren] = 1 THEN 0.9   -- 10% Abwertung nach 1 Jahr
        ELSE 1.0                                   -- Kein Wertverlust innerhalb des ersten Jahres
    END AS Abwertungsfaktor,
    [Einkaufspreis Gesamt] *
    CASE
        WHEN [Lagerdauer in Jahren] >= 3 THEN 0.5
        WHEN [Lagerdauer in Jahren] = 2 THEN 0.8
        WHEN [Lagerdauer in Jahren] = 1 THEN 0.9
        ELSE 1.0
    END AS [Abgewerteter Gesamtwert]
FROM LagerBewertung
ORDER BY Artikelnummer;


*** EDIT ***
Ich schaffe es nicht den Fehler zu reproduzieren. Bei mir wird alles richtig angezeigt.
Dieses SQL sollte die Fehler dennoch eigentl. ausschließen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: arich001

overfl0w23

Sehr aktives Mitglied
19. Oktober 2020
131
73
Celle
So ich habe es alles einmal überarbeitet und sobald ich Zuhause bin schiebe ich das als finale Version hoch.
Hier die SQL Abfragen, die ihr bis dahin einfach im Programm anlegen könnt:

Finale SQL Abfragen"]Standardabfrage welche Artikel mit dem Zustand brauchbar, defekt und verpackung nicht mit einbezieht:
SQL:
/*
    Hinweis:
    Standardabfrage welche die folgenden Zustände NICHT mit einbezieht:
    
    -- AND tArtikel.cArtNr NOT LIKE '%brauchbar'
    -- AND tArtikel.cArtNr NOT LIKE '%defekt'
    -- AND tArtikel.cArtNr NOT LIKE '%verpackung'
*/

SELECT
    tArtikel.cArtNr AS Artikelnummer,
    MAX(tArtikelBeschreibung.cName) AS Artikelname,

    -- Einkaufspreis Gesamt
    SUM(
        (ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
        * ISNULL(tArtikel.fEKNetto, 0.0)
    ) AS [Einkaufspreis Gesamt],
    
    -- Durchschnittlicher EK pro Stück
    CASE
        WHEN SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0)) <> 0
        THEN
            SUM(
                (ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
                * ISNULL(tArtikel.fEKNetto, 0.0)
            )
            /
            SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
        ELSE 0
    END AS [Durchschnittlicher EK Einzel],

    -- Bestand
    SUM(
        ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
        - ISNULL(Warenausgang.fAnzahl, 0.0)
    ) AS Bestand,

    tWarenLager.cName AS Lager,
    MAX(tWarenLagerEingang.dGeliefertAm) AS [Letztes Lieferdatum]

FROM dbo.tWarenLagerPlatz
JOIN dbo.tWarenLager
    ON tWarenLagerPlatz.kWarenLager = tWarenLager.kWarenLager
LEFT JOIN dbo.tWarenLagerEingang
    ON tWarenLagerPlatz.kWarenLagerPlatz = tWarenLagerEingang.kWarenLagerPlatz
    AND tWarenLagerEingang.dErstellt < DATEADD(dd, +1, @date)
LEFT JOIN dbo.tArtikel
    ON tWarenLagerEingang.kArtikel = tArtikel.kArtikel
LEFT JOIN dbo.tSpracheUsed
    ON dbo.tSpracheUsed.nStandard = 1
LEFT JOIN
(
    SELECT DISTINCT kArtikel, cName, kSprache, kPlattform
    FROM dbo.tArtikelBeschreibung
) AS tArtikelBeschreibung
    ON tArtikel.kArtikel = tArtikelBeschreibung.kArtikel
    AND dbo.tSpracheUsed.kSprache = tArtikelBeschreibung.kSprache
    AND tArtikelBeschreibung.kPlattform = 1  -- Wichtig!

LEFT JOIN
(
    SELECT
        SUM(ISNULL(tWarenLagerAusgang.fAnzahl, 0.0)) AS fAnzahl,
        tWarenLagerAusgang.kWarenLagerEingang
    FROM dbo.tWarenLagerAusgang
    WHERE ISNULL(tWarenLagerAusgang.dErstellt, GETDATE()) < DATEADD(dd, +1, @date)
    GROUP BY tWarenLagerAusgang.kWarenLagerEingang
) AS Warenausgang
    ON tWarenLagerEingang.kWarenLagerEingang = Warenausgang.kWarenLagerEingang

WHERE
    tWarenLager.kWarenLager = @warehouse
    AND tArtikel.cArtNr NOT LIKE '%brauchbar'
    AND tArtikel.cArtNr NOT LIKE '%defekt'
    AND tArtikel.cArtNr NOT LIKE '%verpackung'
GROUP BY
    tArtikel.cArtNr,
    tWarenLager.cName
HAVING
    -- Nur Bestände > 0, analog zur SMSS-Abfrage
    SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0)) > 0
ORDER BY tArtikel.cArtNr;



Standardabfrage welche Artikel mit dem Zustand brauchbar, defekt und verpackung MIT einbezieht:
SQL:
/*
    Hinweis:
    Standardabfrage welche die folgenden Zustände MIT einbezieht:
    
    -- AND tArtikel.cArtNr NOT LIKE '%brauchbar'
    -- AND tArtikel.cArtNr NOT LIKE '%defekt'
    -- AND tArtikel.cArtNr NOT LIKE '%verpackung'
*/

SELECT
    tArtikel.cArtNr AS Artikelnummer,
    MAX(tArtikelBeschreibung.cName) AS Artikelname,

    -- Einkaufspreis Gesamt
    SUM(
        (ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
        * ISNULL(tArtikel.fEKNetto, 0.0)
    ) AS [Einkaufspreis Gesamt],
    
    -- Durchschnittlicher EK pro Stück
    CASE
        WHEN SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0)) <> 0
        THEN
            SUM(
                (ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
                * ISNULL(tArtikel.fEKNetto, 0.0)
            )
            /
            SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
        ELSE 0
    END AS [Durchschnittlicher EK Einzel],

    -- Bestand
    SUM(
        ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
        - ISNULL(Warenausgang.fAnzahl, 0.0)
    ) AS Bestand,

    tWarenLager.cName AS Lager,
    MAX(tWarenLagerEingang.dGeliefertAm) AS [Letztes Lieferdatum]

FROM dbo.tWarenLagerPlatz
JOIN dbo.tWarenLager
    ON tWarenLagerPlatz.kWarenLager = tWarenLager.kWarenLager
LEFT JOIN dbo.tWarenLagerEingang
    ON tWarenLagerPlatz.kWarenLagerPlatz = tWarenLagerEingang.kWarenLagerPlatz
    AND tWarenLagerEingang.dErstellt < DATEADD(dd, +1, @date)
LEFT JOIN dbo.tArtikel
    ON tWarenLagerEingang.kArtikel = tArtikel.kArtikel
LEFT JOIN dbo.tSpracheUsed
    ON dbo.tSpracheUsed.nStandard = 1
LEFT JOIN
(
    SELECT DISTINCT kArtikel, cName, kSprache, kPlattform
    FROM dbo.tArtikelBeschreibung
) AS tArtikelBeschreibung
    ON tArtikel.kArtikel = tArtikelBeschreibung.kArtikel
    AND dbo.tSpracheUsed.kSprache = tArtikelBeschreibung.kSprache
    AND tArtikelBeschreibung.kPlattform = 1  -- Wichtig!

LEFT JOIN
(
    SELECT
        SUM(ISNULL(tWarenLagerAusgang.fAnzahl, 0.0)) AS fAnzahl,
        tWarenLagerAusgang.kWarenLagerEingang
    FROM dbo.tWarenLagerAusgang
    WHERE ISNULL(tWarenLagerAusgang.dErstellt, GETDATE()) < DATEADD(dd, +1, @date)
    GROUP BY tWarenLagerAusgang.kWarenLagerEingang
) AS Warenausgang
    ON tWarenLagerEingang.kWarenLagerEingang = Warenausgang.kWarenLagerEingang

WHERE
    tWarenLager.kWarenLager = @warehouse
    /*
    -- Die folgenden Zeilen sind auskommentiert, damit Artikel mit
    -- 'brauchbar', 'defekt' oder 'verpackung' in der ArtNr auch berücksichtigt werden.
    -- AND tArtikel.cArtNr NOT LIKE '%brauchbar'
    -- AND tArtikel.cArtNr NOT LIKE '%defekt'
    -- AND tArtikel.cArtNr NOT LIKE '%verpackung'
    */
GROUP BY
    tArtikel.cArtNr,
    tWarenLager.cName
HAVING
    -- Nur Bestände > 0
    SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0)) > 0
ORDER BY tArtikel.cArtNr;


Die Werte Stimmen bei mir einwandfrei nach wirklich viel testen überein.
 

arich001

Sehr aktives Mitglied
21. April 2021
305
43
  • Gefällt mir
Reaktionen: overfl0w23

overfl0w23

Sehr aktives Mitglied
19. Oktober 2020
131
73
Celle
Hallo arich,
danke für deine Rückmeldung. Kannst Du das etwas genauer definieren? Wenn Du einen anderen Mandanten wählst nach einem Durchlauf findet er keine Läger? Hast Du nochmal auf Verbindung testen geklickt? Kann sein, dass ich da was vergessen habe zu implementieren da ich es nur mit einem Mandanten getestet habe.

LG
 
  • Gefällt mir
Reaktionen: arich001

arich001

Sehr aktives Mitglied
21. April 2021
305
43
Hallo arich,
danke für deine Rückmeldung. Kannst Du das etwas genauer definieren? Wenn Du einen anderen Mandanten wählst nach einem Durchlauf findet er keine Läger? Hast Du nochmal auf Verbindung testen geklickt? Kann sein, dass ich da was vergessen habe zu implementieren da ich es nur mit einem Mandanten getestet habe.

LG
Der Hauptmandant steht ja als erstes in der Liste, bei Lager stehen alle zugehörigen Lager. Wechsle ich jetzt auf einen anderen Mandanten ändert sich unter Lager absolut nix....da sind weiterhin nur die Läger vom ersten Mandanten zu sehen. Bei neu Verbinden springt die Ansicht wieder auf den ersten Mandanten, die Lagerauswahl bleibt auch beim erneuten Mandantenwechseln so stehen.
 

overfl0w23

Sehr aktives Mitglied
19. Oktober 2020
131
73
Celle
Die Abfrage wird um 00:00h gemacht.
Ich habe dir eine PN geschrieben. Magst Du die überarbeitete Version einmal testen? Dann brauchen wir hier nicht alles zuspammen und ich kann die Version hochladen sobald sie funktioniert. :)
 

eck1

Aktives Mitglied
29. April 2012
4
1
angepasste SQL Abfrage mit Erweiterung um Inventurwert

Der Inventurwert wird hilfsweise als Eigenes Feld angelegt [Wert 1 - 100]:
Screenshot 2025-02-26 150339.png



SQL:
SELECT
    tArtikel.cArtNr AS Artikelnummer,
    MAX(tArtikelBeschreibung.cName) AS Artikelname,
    SUM(
        (ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
        * ISNULL(tArtikel.fEKNetto, 0.0)
    ) AS [Einkaufspreis Gesamt],
    CASE
        WHEN SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0)) <> 0
        THEN
            SUM(
                (ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
                * ISNULL(tArtikel.fEKNetto, 0.0)
            )
            /
            SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
        ELSE 0
    END AS [Durchschnittlicher EK Einzel],
    SUM(
        ISNULL(tWarenLagerEingang.fAnzahl, 0.0)
        - ISNULL(Warenausgang.fAnzahl, 0.0)
    ) AS Bestand,
    tWarenLager.cName AS Lager,
    MAX(tWarenLagerEingang.dGeliefertAm) AS [Letztes Lieferdatum],
    COALESCE(Inventur.Inventurwert, 100) AS Inventurwert,
    SUM(
        (ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0))
        * ISNULL(tArtikel.fEKNetto, 0.0)
    ) * COALESCE(Inventur.Inventurwert, 100) / 100 AS [Gesamt Inventurwert]
FROM dbo.tWarenLagerPlatz
JOIN dbo.tWarenLager
    ON tWarenLagerPlatz.kWarenLager = tWarenLager.kWarenLager
LEFT JOIN dbo.tWarenLagerEingang
    ON tWarenLagerPlatz.kWarenLagerPlatz = tWarenLagerEingang.kWarenLagerPlatz
    AND tWarenLagerEingang.dErstellt < DATEADD(dd, +1, @date)
LEFT JOIN dbo.tArtikel
    ON tWarenLagerEingang.kArtikel = tArtikel.kArtikel
LEFT JOIN dbo.tSpracheUsed
    ON dbo.tSpracheUsed.nStandard = 1
LEFT JOIN
(
    SELECT DISTINCT kArtikel, cName, kSprache, kPlattform
    FROM dbo.tArtikelBeschreibung
) AS tArtikelBeschreibung
    ON tArtikel.kArtikel = tArtikelBeschreibung.kArtikel
    AND dbo.tSpracheUsed.kSprache = tArtikelBeschreibung.kSprache
    AND tArtikelBeschreibung.kPlattform = 1
LEFT JOIN
(
    SELECT
        SUM(ISNULL(tWarenLagerAusgang.fAnzahl, 0.0)) AS fAnzahl,
        tWarenLagerAusgang.kWarenLagerEingang
    FROM dbo.tWarenLagerAusgang
    WHERE ISNULL(tWarenLagerAusgang.dErstellt, GETDATE()) < DATEADD(dd, +1, @date)
    GROUP BY tWarenLagerAusgang.kWarenLagerEingang
) AS Warenausgang
    ON tWarenLagerEingang.kWarenLagerEingang = Warenausgang.kWarenLagerEingang
LEFT JOIN
(
    SELECT
        attr.kArtikel,
        tArtikelAttributSprache.nWertInt AS Inventurwert
    FROM tArtikelAttribut AS attr
    LEFT JOIN tArtikelAttributSprache
        ON tArtikelAttributSprache.kArtikelAttribut = attr.kArtikelAttribut
    WHERE attr.kAttribut = 277
) AS Inventur
    ON tArtikel.kArtikel = Inventur.kArtikel
WHERE
    tWarenLager.kWarenLager = @warehouse
    AND tArtikel.cArtNr NOT LIKE '%brauchbar'
    AND tArtikel.cArtNr NOT LIKE '%defekt'
    AND tArtikel.cArtNr NOT LIKE '%verpackung'
GROUP BY
    tArtikel.cArtNr,
    tWarenLager.cName,
    COALESCE(Inventur.Inventurwert, 100)
HAVING
    SUM(ISNULL(tWarenLagerEingang.fAnzahl, 0.0) - ISNULL(Warenausgang.fAnzahl, 0.0)) > 0
ORDER BY tArtikel.cArtNr;

Ihr müsst die ID des Eigenen Felds/Attributs auslesen, dies macht Ihr mit dem Code (hier Beispiel Ìnventurwert):
SQL:
SELECT kAttribut FROM tAttributSprache where cName = 'Inventurwert'


Daher ist im Code der Wert kAttribut nach der gesuchten Attributs ID zu ändern.
Im Beispiel ID 277.



SELECT
attr.kArtikel,
tArtikelAttributSprache.nWertInt AS Inventurwert
FROM tArtikelAttribut AS attr
LEFT JOIN tArtikelAttributSprache
ON tArtikelAttributSprache.kArtikelAttribut = attr.kArtikelAttribut
WHERE attr.kAttribut = 277
) AS Inventur
 
  • Gefällt mir
Reaktionen: overfl0w23
Ähnliche Themen
Titel Forum Antworten Datum
letzter EK bei der Lagerbewertung JTL-Wawi 1.10 2
Neu Planung: Disposition ausgegraut, Produktionstücklisten nicht mehr buchbar (WaWi 1.11.7) JTL-Plan&Produce - Fehler und Bugs 0
Neu CSS GeoIP MwSt.-Finder 2.7.1 verhindert das Anlegen von Shop-Kundenkonten aus der Wawi Plugins für JTL-Shop 0
Neu Installation JTL-Wawi 1.5.55.8 - Startet Grundsätzlich im Report-/Druckmodul Installation von JTL-Wawi 3
erstes Feedback zur WAWI 2.0 (beta) JTL-Wawi 2.0 11
Neu [Erledigt] Installationsdatei JTL‑Wawi 1.5.55.8 erhalten! Installation von JTL-Wawi 0
Neu Onlineshop von Wawi entfernen Onlineshop-Anbindung 2
Neu Kategoriestruktur auf JTL-Wawi in WooCommerce Shop darstellen WooCommerce-Connector 2
Neu Zwei eBay-Aufträge (identische Adresse) zusammen versenden, aber getrennte Rechnungen behalten – JTL-Wawi 1.9.6.5 User helfen Usern - Fragen zu JTL-Wawi 1
JTL-WAWI Datenbankprofil für neue Windows Benutzer JTL-Wawi 1.11 2
Neu GPSR Herstellerinformationen JTL Wawi 1.9.6.4 anbinden User helfen Usern - Fragen zu JTL-Wawi 0
Neu DSGVO – Automatisierte Löschung von Kundendaten nach 10 Jahren (JTL-Wawi / JTL-Shop) User helfen Usern - Fragen zu JTL-Wawi 1
Neu Erstabgleich Showpare6 zu JTL-WaWi Shopware-Connector 0
Update von 1.11.6 auf 1.11.7: JTL Worker verbindet nicht mehr mit Datenbank (WaWi schon) JTL-Wawi 1.11 1
Neu eBay Artikel kommen in WaWi sporadisch als "Angebotsnummer" ohne Text JTL-Wawi - Fehler und Bugs 1
JTL-WaWi 11.5 WMS Mobile Server sehr hohe CPU Auslastung JTL-Wawi 1.11 2
Neu welche Sync Benutzer Daten in Shop und WAWI bei neu-Hosting über JTL Allgemeine Fragen zu JTL-Shop 0
Neu Infos zu Wawi 1.11 Fragen rund um LS-POS 1
Neu Verbindungsabbruch von Wawi zu POS Einrichtung / Updates von JTL-POS 0
welche Sync Benutzer Daten in Shop und WAWI bei neu-Hosting über JTL JTL-Wawi 1.11 0
Neu von JTL-Wawi-Version 1.10.16.0 ist kein Update...möglich Installation von JTL-Wawi 2
Rechnungstext in WAWI anlegen JTL-Wawi 1.10 0
Neu Wawi Filter probleme User helfen Usern - Fragen zu JTL-Wawi 0
Neu JTL-Wawi REST-API – Performance & Monitoring JTL-Ameise - Ideen, Lob und Kritik 3
Neu WaWi - JTL Shop - Kein Abgleich des Artikelnamen möglich Onlineshop-Anbindung 1
Neu wie Wawi eigene Felder (Kunden) an Shop DB übertragen? User helfen Usern - Fragen zu JTL-Wawi 3
Neu Wawi Synchronisation mit JTL Shop nicht möglich! seit 3 Stunden was kann man machen? Onlineshop-Anbindung 1
Neu Wawi API 1.11.5 – App‑Registrierung: FormatNotParsable / GUID muss 32 Ziffern Arbeitsabläufe in JTL-Wawi 2
JTL POS an WaWi anbinden Hilfe benötigt JTL-Wawi 1.11 4
Neu Export Kundendaten mit Label in WAWI 1.9.6.5 JTL Ameise - Eigene Exporte 1
Neu JTL WAWI V1.11.6.0 Stornorechnung, Stornotext wird nicht gespeichert und ist nicht abrufbar JTL-Wawi - Fehler und Bugs 0
Neu Bankverbindung in der Wawi ändern - Bankwechsel Installation von JTL-Wawi 2
Neu Artikel aus Shopware in der Wawi importieren und WMS redy machen Shopware-Connector 0
Neu WAWI 1.11.2 Änderung von E-Mailadresse in Rechnung hat keine Auswirkung JTL-Wawi - Fehler und Bugs 3
Versandbenachrichtungen werden jetzt aus Wawi versendet JTL-Wawi 1.11 8
Neu POS-Server startet nicht mehr nach WaWi-update auf Version 1.11.6.0 JTL-POS - Fehler und Bugs 1
Neu Shopify Connector + JTL Wawi Preis Shopify-Connector 4
Neu Fehler bei Artikel Filter in der Wawi JTL-Wawi - Fehler und Bugs 2
JTL Wawi App eigene Statistiken erscheinen nicht JTL-Wawi App 0
Nach Update auf 1.11.6 werden die Preisänderung nicht mehr von der Wawi an Amazon übertragen JTL-Wawi 1.11 0
Neu Datenabgleich Wawi-POS Allgemeine Fragen zu JTL-POS 0
Neu Newsletter: KI Webinare, JTL Wawi 2.0 und vieles mehr - Freue dich auf JTL Events! User helfen Usern - Fragen zu JTL-Wawi 5
Neu HGB-konforme Stichtagsbewertung inkl. Niederstwertprinzip (JTL-Wawi / MSSQL) Arbeitsabläufe in JTL-Wawi 0
Updat Wawi 1.3 auf Wawi 1.8 JTL-Wawi 1.8 1
Neu Update von Wawi 1.3 auf Wawi 1.8 JTL-Wawi 1.6 1
JTL Wawi App Registrierung kann nicht gelöscht werden JTL-Wawi App 11
Neu Feedbackrunde zur Umsetzung der Verpackungsverordnung (PPWR) in JTL-Wawi Umfragen rund um JTL 0
Meine Bestellungen sind in einer Pickliste "verschollen" - WIE bekomme ich sie in die Wawi-Pickliste??? JTL-Wawi 1.11 2
Neu JTL-WAWI und LS-POS Wechseln Starten mit JTL: Projektabwicklung & Migration 1
Neu Steuereinstellungen JTL WAWI 1.11.5 Eigene Übersichten in der JTL-Wawi 0

Ähnliche Themen