Alle Buchungen bezgl. Lieferscheine (Quell-Lager und Fehlbestand Buchungen überprüfen)

TotalerNeuling

Mitglied
27. Mai 2023
16
1
Hallo Gemeinde,

wir haben sehr oft falsche Lagerbestände, die durch löschen von Lieferscheinen entstehen. Leider Funktioniert das zurückbuchen nicht wie im Guide (JTL Guide Punkt 2 (Der Lieferschein wird nun entfernt und die Ware wieder in das Ausgangslager eingebucht.) beschrieben nicht korrekt. Wir müssen den korrekten Lager auswählen, damit die Ware wieder im richtigen Lagerort landet.

Grundgedanke ist, diese Fehler durch einen Workflow zu identifizieren und anzuzeigen. Trigger soll sein, Lieferschein gelöscht. Nun soll die aus dem gelöschten Lieferschein die Postitionen mit Warenausgang aus LagerX und Wareneingang in LagerY gegen geprüft werden.
Frage 1: Ist dies generell möglich. Wenn ja, hat vielleicht jemand einen Lösungsvorschlage

Da 1 weit über meinem Niveu liegt, wollte ich Sache erst mal manuell per sql-abfrage lösen. Hierzu habe ich im Forum und durch ai folgendes Script zusammengestellt.

Code:
SELECT
    Buchungen.dGebucht,
    tArtikel.cArtNr,
    tArtikelBeschreibung.cName,
    tWarenLagerPlatz.cName AS cWarenLagerPlatzName,
    Buchungen.kWarenLagerPlatz,
    tWarenLager.cName AS cWarenLagerName,
    tWarenLagerPlatz.kWarenLager,
    Buchungen.fAnzahl,
    Buchungsart.cName AS BuchungsartName
FROM
(
    SELECT
        dErstellt AS dGebucht, kArtikel, kWarenLagerPlatz, fAnzahl, kBuchungsart
    FROM dbo.tWarenLagerEingang
    WHERE dErstellt >= DATEADD(day, -1, GETDATE()) -- Nur die letzten 1 Tage
    UNION ALL
    SELECT
        dErstellt AS dGebucht, kArtikel, kWarenLagerPlatz, -fAnzahl, kBuchungsart
    FROM dbo.tWarenLagerAusgang
    WHERE dErstellt >= DATEADD(day, -1, GETDATE()) -- Nur die letzten 1 Tage
) AS Buchungen
LEFT JOIN dbo.tArtikel ON tArtikel.kArtikel = Buchungen.kArtikel
LEFT JOIN dbo.tWarenLagerPlatz ON tWarenLagerPlatz.kWarenLagerPlatz = Buchungen.kWarenLagerPlatz
LEFT JOIN dbo.tWarenLager ON tWarenLager.kWarenLager = tWarenLagerPlatz.kWarenLager
LEFT JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tArtikel.kArtikel
LEFT JOIN dbo.tbuchungsart AS Buchungsart ON Buchungsart.kBuchungsart = Buchungen.kBuchungsart
ORDER BY Buchungen.dGebucht DESC;

Hier fehlt noch das Splitten in Auftragen.

Frage 2: Wie bekomme ich das Script noch soweit umgemodelt, dass in der Eigene Übersicht alle Positionen auftauchen, die über einen Auftrag Aus- (Ausgeliefert) und wieder Eingebucht (Lieferschein gelöscht) wurden aber nur, wenn sich der Lagerplatz ändert. Eigentlich reicht auch das Überprüfen einer Position Warenausgang aus LagerX und Wareneingang in LagerY .

Für Hilfen wäre ich sehr dankbar.
 
Zuletzt bearbeitet:

TotalerNeuling

Mitglied
27. Mai 2023
16
1
ich bin schon sehr weit gekommen mit punkt 2:

hier der aktuelle Code:


WITH NumberedBuchungen AS (
SELECT
Buchungen.dGebucht,
Buchungen.cKommentar AS BuchungsartName,
Lieferschein.cLieferscheinNr,
Lieferschein.kLieferschein,
LieferscheinPos.kLieferscheinPos, -- Hinzugefügt
tArtikel.cArtNr,
tArtikelBeschreibung.cName,
Buchungen.kWarenLagerPlatz,
tWarenLager.cName AS cWarenLagerName,
tWarenLagerPlatz.kWarenLager,
Buchungen.fAnzahl,
ROW_NUMBER() OVER (PARTITION BY Buchungen.dGebucht ORDER BY Buchungen.dGebucht DESC) AS RowNum
FROM
(
SELECT
dErstellt AS dGebucht, cKommentar, kArtikel, kWarenLagerPlatz, fAnzahl, kBuchungsart, NULL AS kLieferscheinPos
FROM dbo.tWarenLagerEingang
WHERE cKommentar = 'Lieferschein gelöscht'
AND dErstellt >= DATEADD(hour, -5, GETDATE()) -- Nur die letzten 5 Stunden
UNION ALL
SELECT
tWarenLagerAusgang.dErstellt AS dGebucht, tWarenLagerAusgang.cKommentar, tWarenLagerAusgang.kArtikel, tWarenLagerAusgang.kWarenLagerPlatz, -tWarenLagerAusgang.fAnzahl, tWarenLagerAusgang.kBuchungsart, tWarenLagerAusgang.kLieferscheinPos
FROM dbo.tWarenLagerAusgang
LEFT JOIN dbo.tLieferscheinPos ON tWarenLagerAusgang.kLieferscheinPos = tLieferscheinPos.kLieferscheinPos
WHERE tWarenLagerAusgang.cKommentar = 'Auslieferung'
AND tWarenLagerAusgang.dErstellt >= DATEADD(hour, -5, GETDATE()) -- Nur die letzten 5 Stunden
) AS Buchungen
LEFT JOIN dbo.tArtikel ON tArtikel.kArtikel = Buchungen.kArtikel
LEFT JOIN dbo.tWarenLagerPlatz ON tWarenLagerPlatz.kWarenLagerPlatz = Buchungen.kWarenLagerPlatz
LEFT JOIN dbo.tWarenLager ON tWarenLager.kWarenLager = tWarenLagerPlatz.kWarenLager
LEFT JOIN dbo.tArtikelBeschreibung ON tArtikelBeschreibung.kArtikel = tArtikel.kArtikel
LEFT JOIN dbo.tLieferscheinPos ON dbo.tLieferscheinPos.kLieferscheinPos = Buchungen.kLieferscheinPos
LEFT JOIN dbo.tLieferschein AS Lieferschein ON Lieferschein.kLieferschein = dbo.tLieferscheinPos.kLieferschein -- Hier die Verknüpfung mit tLieferschein
LEFT JOIN dbo.tLieferscheinPos AS LieferscheinPos ON LieferscheinPos.kLieferscheinPos = Buchungen.kLieferscheinPos -- Hinzugefügt
)

SELECT
dGebucht,
BuchungsartName,
cLieferscheinNr,
kLieferschein,
kLieferscheinPos, -- Hinzugefügt
cArtNr,
cName,
kWarenLagerPlatz,
cWarenLagerName,
kWarenLager,
fAnzahl
FROM NumberedBuchungen
WHERE RowNum = 1 and cArtNr='AKMixed001'
ORDER BY dGebucht DESC;


Das Problem ist nun, dass ich keine Spalte gefunden habe, in der noch ein Wert drinsteht, welches ich verwenden könnte.

cLieferscheinNr, kLieferschein, kLieferscheinPos haben nach dem löschen "NULL" Werte.
Screenshot 2024-02-15 162516.png

Welche Spalte in der Datenbank wäre für diesen Zweck tauglich.

Was ich hier Schade finde, dass der Bezug komplett gelöscht wird.

Ich habe nun herausgefunden, dass man beim löschen der Lieferscheine etwas unter Lieferscheinnr manuell eintragen kann. Leider fehlt hier dann der Bezug bei Auslieferung.
Screenshot 2024-02-15 171341.png

Hier wäre es sinvoller, dass dieser automatisch übernommen wird.
Generell verstehe ich nicht, warum beim löschen die Ware nicht standardmäßig im Ursprungslager landet, wie auch im Guide beschrieben.

Bitte um dringende konstruktive Antwort.
 
Zuletzt bearbeitet:

TotalerNeuling

Mitglied
27. Mai 2023
16
1
SQL bringt mich in der Form nicht weiter.

Nun habe ich es über einen Workflow versucht. Leider komme ich auch hier nicht an das Lagerort, in das es eingebucht wird.
Für Warenausgang habe ich das Gefunden - {{ Vorgang.Lieferscheine.ErstesObjekt.Positionen.ErstesObjekt.Warenlagerausgänge.ErstesObjekt.WarenlagerName }}"

Frage 1: Da sich ständig die Lagerorte ändern, gibt es ""{{ Vorgang.Lieferscheinnummer }};{{ Vorgang.Auftrag.Auftragsnummer }};{{ Vorgang.Lieferscheine.ErstesObjekt.Positionen.ErstesObjekt.Warenlagerausgänge.ErstesObjekt.WarenlagerName }}"" auch eine ID
Frage 2: Gibt es eine Variable, in der ich den Wareneingang abfragen kann.

Ich hoffe es kann jemand Antworten. Bin gänzlich kurz vor der Verzweiflung.
 

TotalerNeuling

Mitglied
27. Mai 2023
16
1
Schade dass mir keiner geholfen hat.

Nun habe ich es über ein Workaround gelöst bekommen. Direkt nach dem Löschen wird die letzte Buchung mit dem Kommentar "Lieferschein gelöscht" aus der Variable "Vorgang.Positionen.ErstesObjekt.Warenlagerausgänge.ErstesObjekt.WarenlagerName" verglichen und bei Abweichung eine Fehlermeldung mittels cscript ausgegeben. Hier ist die Umsetzung. Grobe Fehler können gerne per PM gemeldet werden.

  1. Bedingung hinzufügen

Skript in der Erweiterten Eigenschaft hinzufügen

{% capture query -%}
SELECT TOP 1 tWarenLager.cName, dbo.tWarenLagerEingang.dErstellt AS dGebucht FROM dbo.tWarenLagerEingang LEFT JOIN dbo.tWarenLagerPlatz ON dbo.tWarenLagerPlatz.kWarenLagerPlatz = dbo.tWarenLagerEingang.kWarenLagerPlatz LEFT JOIN dbo.tWarenLager ON dbo.tWarenLager.kWarenLager = dbo.tWarenLagerPlatz.kWarenLager WHERE dbo.tWarenLagerEingang.cKommentar = 'Lieferschein gelöscht' ORDER BY dbo.tWarenLagerEingang.dErstellt DESC;
{% endcapture -%}
{% assign LagerZu = query | DirectQueryScalar -%}
{% assign LagerVon = Vorgang.Positionen.ErstesObjekt.Warenlagerausgänge.ErstesObjekt.WarenlagerName -%}
{% if LagerVon == LagerZu %}
0
{% else %}
1
{% endif %}

Bedingung „Gleich“ 1

Aktion Einstellungen

  • Ausführen
  • Programm/Skript „C:\Program Files (x86)\JTL-Software\Lieferschein_Falsch_Geloescht.bat (Siehe Punkt 3)
  • Parameter
    {% capture query -%} SELECT TOP 1 tWarenLager.cName AS cWarenLagerName, dbo.tWarenLagerEingang.dErstellt AS dGebucht FROM dbo.tWarenLagerEingang LEFT JOIN dbo.tWarenLagerPlatz ON dbo.tWarenLagerPlatz.kWarenLagerPlatz = dbo.tWarenLagerEingang.kWarenLagerPlatz LEFT JOIN dbo.tWarenLager ON dbo.tWarenLager.kWarenLager = dbo.tWarenLagerPlatz.kWarenLager WHERE dbo.tWarenLagerEingang.cKommentar = 'Lieferschein gelöscht' ORDER BY dbo.tWarenLagerEingang.dErstellt DESC; {% endcapture -%}
    {% assign Lager = query | DirectQueryScalar -%}
    "{{ Vorgang.Positionen.ErstesObjekt.Warenlagerausgänge.ErstesObjekt.WarenlagerName }}" "{{ Lager }}"
  • Alle Haken weg
  • Verzeichnis festlegen
  • Pfad „C:\Program Files (x86)\JTL-Software“


Inhalt von „C:\Program Files (x86)\JTL-Software\Lieferschein_Falsch_Geloescht.bat „
@echo off & setlocalset "M=%userprofile%\MsgBox.vbs"
SET "MSG1=%~1"
SET "MSG2=%~2"
set "Titel=Meldung von JTL-WaWi"
Set "Zeile1=ACHTUNG:"
set "Zeile2=Die Ware wurde nicht in das Lager gebucht,"
set "Zeile3=aus dem es entnommen wurde."
set "Zeile4=ausgebuch von: %MSG1%"
set "Zeile5=eingebucht in: %MSG2%"
set "Zeile6="BITTE KONTROLLIEREN!"
>%M% echo MsgBox "%Zeile1%" ^& vbCrLf ^& "" ^& vbCrLf ^& "%Zeile2%" ^& vbCrLf ^& "%Zeile3%" ^& vbCrLf ^& "" ^& vbCrLf ^& "%Zeile4%" ^& vbCrLf ^& "%Zeile5%", vbCritical or VbMsgBoxSetForeground or vbSystemModal, "%Titel%"
cscript /nologo %M%
del %M%
 

Anhänge

  • Bild1.png
    Bild1.png
    201,9 KB · Aufrufe: 0
  • Gefällt mir
Reaktionen: Star Piercing

Ähnliche Themen