Abschluß eines LagerbuchungJobs erkennen

Arne Drews

Mitglied
Moin,

Gibt es die Möglichkeit, zu erkennen, wann ein BuchungsJob abgeschlossen wurde?
Wenn man Lagerbuchungen über den Sage-Standard macht, wird ja beim Anlegen der ersten Buchung eine Job ID vergeben und alle folgenden Artikel werden in dem Job übernommen, bis man auf "NEU" klickt oder halt die Maske schließt.

Ich beschreibe den Zustand des Jobs mal als offen bis dahin.
Jetzt suche ich wie gesagt die Möglichkeit für eine SQL Query, zu erkennen, welche Jobs nicht mehr offen sind!

Der Hintergrund ist der, dass wir eine Umbuchung zwischen zwei Läger entwickelt haben, die sporadisch nicht sauber läuft, weil der Task evtl. gerade läuft, nachdem eine Artikelbuchung im Job vorhanden ist und hinterher erst die weiteren Artikelbuchungen angelegt werden.
Das Problem dabei ist, dass die Job ID als Kennung übergeben wird und das Zielsystem dann meckert, weil diese bereits verarbeitet wurde.

Ich hoffe, das war einigermaßen verständlich?
Danke für Unterstützung
Gruß Arne
 

GlanS

Neues Mitglied
Guten Tag,

die einzige fehlerfreie Möglichkeit die Lagerumbuchungen zwischen zwei Lägern zu automatisieren kann mittels einer Programmierung mit DCM
DcmDefinitionManager.DcmListId.LagerplatzBuchungSave erfolgen. D. h. wenn die Lagerbuchung über das Objekt gespeichert wird, wird dieses Ereignis ausgelöst und alle relevanten Daten bereitgestellt.

Über die SQL-Abfrage (ich vermute zeitlich in einem gewissen Intervall) kann nicht sichergestellt werden, ob der Lagerjob bereit vollständig abgeschlossen ist. Wenn z. B. ein lagerrelevanter Beleg über 1000 lagergeführten Positionen gespeichert wird, wird ein Lagerjob eröffnet und anschließend pro Position eine Lagerbewegung generiert. Wenn die SQL-Abfrage mitten in dem "Speichervorgang" ausgeführt wird, werden nicht alle relevanten Daten ermittelt.

Beste Grüße
 

Arne Drews

Mitglied
Hallo,

Danke für die Antwort.
Das DCM-Ereignis LagerplatzBuchungSave bezieht sich aber lediglich auf die einzelnen Buchungen. Ein BuchungsJob kann aber mehrere Buchungen enthalten.

Mit der ersten Buchung wird ein Job angelegt und alle weiteren Buchungen werden in diesem Job angelegt, solange man keinen neuen Job erstellt!
Mein Problem ist nun zu erkennen, wann ein Job abgeschlossen ist.
;)
 

GlanS

Neues Mitglied
Hallo Arne,

gerne, hätte dann aber ein paar Fragen ;)

* Welche Informationen zusätzlich zu der LagerJob-Nummer werden noch an das Zielsystem übertragen?
* Um welche Lagerbewegungsarten geht es?
* Wie wird momentan mit Stornierungen / Löschen von Lagerjobs etc. umgegangen?

Beste Grüße
 

Arne Drews

Mitglied
Hi,

Aktuell habe ich einen Workaround, der eine fortlaufende Nummer mit übergibt, sodass es keine Duplikate mehr gibt. Die Buchungs-Auftragsnummer für das Ziel-System ist dann schematisch so aufgebaut: <Bewegungsart><Job>.<fortl.Nr>, also bspw. IU12345678.0, dann IU12345678.1, falls die Job Id schon mal übermittelt wurde, allerdings mit anderen Buchungen!
Mir gefällt dieses Workaround aber nicht, daher suche ich nach einer besseren Lösung.

Es geht ausschließlich um die Interne Umbuchung ( IU ).

Vielleicht einfach nochmal kurz ein Szeanrio, das hin und wieder in der Praxis vorkommt:
Lagermitarbeiter Dröhnbüddel beginnt Lagerbuchungen über das Sage Formular anzulegen. Die erste Artikelbuchung erzeugt eine JobId 0815 und legt die Buchung an, zwei weitere Artikel werden gebucht und im selben Job, also der 0815 angelegt. Es gibt also bisher drei Warenbuchungen im Job 0815! Nun kommt Mitarbeiter Kaputtlick ins Büro und stellt eine Frage, die Lagermitarbeiter Dröhnbüddel ein bis zwei Minuten beschäftigt.
In dieser Zeit läuft ein Task, der die Schnittstelle zwischen der Sage und dem externen Lagersystem triggert.

Gefunden wird nun ein Job 0815 mit drei Warenbuchungen. An keiner Stelle ist in diesem Moment erkennbar, ob der Lagerjob komplett, also abgeschlossen ist oder nicht! Also werden die drei Buchungen ( ohne Workaround ) als Wareneingangsbuchung IU0815 an das Zielsystem übergeben.

Jetzt ist aber Mitarbeiter Kaputtlick zufriedengestellt und Dröhnbüddel bucht fleißig weiter, allerdings weiterhin unter der Job Id 0815!
Diese wird im nächsten Task also erneut eingesammelt, weil es darin offene Buchungen gibt.

Genau das möchte ich verhindern. Ich möchte die Buchungen eines Jobs erst dann übermitteln, wenn dieser wirklich abgeschlossen ist.
Die BuchungsID anstelle der JobId zu verwenden ist keine Option, da ich nicht für jeden Artikel einzeln eine Warenbuchung übergeben möchte.

Ich hoffe, das ist einigermaßen verständlich, wo mein Problem liegt? ;)

Danke für Dein Mitdenken!
 

GlanS

Neues Mitglied
Hi Arne,

vielen Dank für die ausführliche Erklärung.

Es ist eine gewisse Sackgasse, da es nicht einfach zu erkennen ist, wann der Lagerjob vom Mitarbeiter abgeschlossen ist. Der Mitarbeiter gibt an der Stelle nicht explizit einen Signal - "so, jetzt bin ich fertig mit dem Lagerjob". Abgesehen davon kann der Mitarbeiter z. B. das Lagerbewegungsformular schließen und am nächsten Tag nach dem Lagerjob suchen und erneut im bereits bestehenden Lagerjob buchen oder den Fehler (Artikel, Menge, evtl. Charge/Seriennummer) von gestern korrigieren oder eine versehntlich erstellte Lagerbuchung stornieren.

Die Problematik ist grundsätzlich verständlich beschrieben. Spontan habe ich nur drei mgl. Lösungsansätze (mit Vor- und Nachteilen):

1) Im Lagerbewegungsformular das Schließen des Fensters und Neugenerierung einer LagerJobID abgreifen
und in einem Zusatzfeld in der Tabelle KHKLagerplatzbuchungenJobs festhalten.
D. h. das Fenster wird geschlossen, existiert ein Lagerjob von diesem Benutzer, der nicht als abgeschlossen gekennzeichnet ist, dann in der Tabelle beim Lagerjob entsprechend ein "abgeschlossen"-Kennzeichen setzen. Analog auch mit der Generierung einer neuen LagerJob-Nummer, damit der ursprüngliche Lagerjob ein "abgeschlossen"-Kennzeichen bekommt.


2) Zusatzfenster für die Lagerbuchungen erstellen, wo einfach alle Artikel und Mengen etc. eingegeben werden und mit "OK" die Lagerbuchungen in einem Lagerjob in einer SQL-Transaktion generiert werden.


3) Über Belegerfassung die Lagerbuchungen abbilden - wenn der Beleg gespeichert wird, kann dies genau abgegriffen werden.

Beste Grüße
 

Arne Drews

Mitglied
Hi Glan,

Danke für die Lösungswege, etwas ähnliches schwebt mir auch im Kopf.
Wie Du schon schreibst, ist es aus bestimmten Gründen kaum möglich das Ende eines Lagerjobs zu erfassen, wobei ich nicht mal daran gedacht habe, dass ja jemand am nächsten Tag einen Lagerjob sogar wiederverwenden kann.

Meine Lösung, die ich seit ein paar Tagen im Kopf habe, basiert auf einer GUI, die ich sowieso gerade entwickle, damit die Lagermitarbeiter die Buchungen an das und von dem externem Lager einsehen, überwachen und bearbeiten können.
In dem Zuge denke ich darüber nach, die Warenbuchungen auch darin zu erledigen, dann werden die Buchungen außerhalb der Sage gesammelt und erst wenn der Mitarbeiter auf Buchen klickt, werden die Buchungen über einen Lagerjob an die Sage übermittelt.
Das wäre dann auch eine etwas vereinfachte Bedienung gegenüber des Sage-Formular.

Ich denke, dass ich dies die nächsten Tage mal umsetzen werde.

Danke für Deine Infos und Anregungen!
Gruß Arne
 
Oben