Plenty: Warenbestand zu Aufträgen --> wie "Reservierung" für die zuvor verarbeiteten vornehmen?

Hallo,

mit Auftragsverarbeitung bin ich regelmäßig herausgefordert :-/


Diesmal:

Ich will (immer noch) Aufträge nach gewissen Kriterien filtern, und wenn die zutreffen, den Positionen ein anderes Lager zuordnen. Konkret: ich hab eine handvoll Bundles per ID in einer Variable gespeichert, und will am Ende nur Aufträge haben die eines oder mehrere dieser Bundles, aber keine anderen Artikel enthalten, per Brief versandt werden, ein Gesamtgewicht nicht überschreiten, und in Lager 23 ausreichend Bestand aufweisen. Alles außer dem letzten Punkt klappt zuverlässig.

Aus PlentySearchOrders bekomme ich ja diverse Zeilen: die Kopfzeile, eine Zeile für die Versandkosten, eine für das erste Bundle, gefolgt von seinen Bestandteilen, danach optional ein anderes (oder das selbe!) Bundle, wieder mit Bestandteilen, beliebig oft.


Ich gruppiere nach einem String den ich aus OrderID und VariantenID zusammengesetzt habe: wenn ein Artikel mehrfach in der Bestellung war, wird er so zusammengefasst. Aber nur innerhalb der selben Bestellung.


Ich habe einen (aktuellen) Datastore mit den Beständen (im Ziellager) für die Bundles, darauf Querverweis per VariantID. Im Nachgang leere ich per #if alle Stock-Zeilen, wenn die Artikelbeschreibung nicht auf "?contains('[Bundle]')" zutrifft. So entferne ich die gescheiterten Querverweise für Zeilen die keine Bundles waren.


Jetzt simple Prüfung: Wenn Bestand im neuen Lager >= bestellte Anzahl für Artikel (in dieser Bestellung) Zelle = 1 , wenn nicht 0. Wenn Zeile ohne Bestand (d.h. kein Bundle), Zelle leer.


Danach gruppieren nach OrderID, dabei die Ergebnisse dieser letzten Prüfung alle verketten, und mit contains() prüfen dass keine 0 und mindestens eine 1 drin sind, dann kann der Auftrag verschoben werden. Ergebnis wieder als 0 oder 1 in eine Spalte, darauf später filtern.


So, Problem jetzt: ich prüfe immer auf den selben, "gecachten" Bestand (aus dem Querverweis). Wenn ich zB 5 Bestand habe, und der erste Auftrag 3 reserviert, sollten bei der Prüfung in der darauffolgenden Zeile/Auftrag nur noch 2 verfügbar sein.


Die hat aber das selbe Ergebnis aus dem Querverweis bekommen wie die erste (und jede weitere): 5. Und würde die Prüfung jetzt wieder bestehen, auch wenn er das Bundle auch 3 mal enthält. Dann sind 6 reserviert, aber nur 5 im Lager.


Komplizierte Herleitung, simple Frage: wie komme ich in der Auftragsverarbeitung immer an aktuelle Stocks zu Artikeln?


Ich hatte (zum ersten mal) mit setVariable und getVariable rumexperimentiert, bin aber zu keinem Ergebnis gekommen. In etwa so:

<#if (getVariable(VariantID) == "">
    <#if (bestand?number >= anzahl?number)>1<#else>0</#if>
    setVariable(VariantID, bestand?number - anzahl?number)
<#else>
    <#if (getVariable(VariantID)?number >= anzahl?number)>1<#else>0</#if>
    setVariable(VariantID, getVariable(VariantID)?number - anzahl?number)
</#if>

Gibt es weitere Ansätze?

Grüße Daniel



Hi Daniel,


dein Skript sieht (fast) korrekt aus. Ich habe es kopiert, Spaltennamen angepasst und das setVariable noch in ${} gesetzt und es hat direkt funktioniert.


Mein (Test) Beispiel:

Ich habe dein Skript hier im Beispiel nochmal etwas angepasst, sodass man der noch vorhandene Bestand (Gesamt - Quantity vorherige Zeilen ) deutlich wird. Den vorhanden Bestand im Lager (Spalte Gesamtbestand) müsstest du mit Querverweis aus dem Datastore holen.


Viele Grüße

Torsten

Hi Torsten & Co,

ich glaube ich habe in diesem Zusammenhang einen Bug(?) in eurer Vorschau gefunden:

Im Flow Order_changeItems hab ich das im Step countStocks Mapper (17) relativ analog dazu aufgezogen:

OrderItemsQuantity ist wie gehabt die Artikelmenge, der Stock liegt jetzt in ersetzen_gesamtzahl, und deine beiden Spalten sind in stockAfterReservation und enoughStock umbenannt.

Testfall is so aufgezogen dass ich drei Aufträge, und einen Stock von 3 habe:

  • der erste Auftrag hat 1
  • der zweite und dritte jeweils 2

In der Konstellation sollten also der erste + zweite Auftrag durchgehen wenn ich auf enoughStock filtere. Zeigt die Vorschau im Mapper auch so an:

image


Nicht jedoch die Vorschau am Filter (enoughStock! == '1'):

initiale Ansicht:

image


Hier hätte Auftrag 565535 schon durch gehen müssen, erst 565533 dann ausgefiltert werden (siehe erster Screenshot).

Wenn ich die Ansicht jetzt auf 10 Zeilen erweitere, ändert sich das Ergebnis nochmal, es fallen jetzt alle durch:

image


Hier scheint der Zähler/das Script "weiter zu laufen", die Werte für enoughStock gehen immer weiter ins Minus.

Aber nur in eurer Anzeige, nicht real: Wenn ich den Filter aus Step 18 mit einem CSVWriter abgreife, spuckt der mit vollkommen korrekt die ersten beiden Aufträge aus. So wie in der Vorschau des Mappers auch angezeigt wurde:

image


Wenn ich an den Filter aber einen weiteren Mapper anhänge, "leidet" der genauso unter den falschen Werten wie zuvor nur die Step-Vorschau:


ich bekomme zuerst nur den ersten Auftrag angezeigt. Wenn ich auf 10 Zeilen erweitere, bekomme ich gar keine Zeilen mehr angezeigt. Der Zähler ist "weiter gelaufen", es kommen keine Daten mehr aus dem Filter.


Zumindest glaube ich dass es das ist was da passiert...

Wundert mich ein bisschen das es mir beim ersten Flow nicht aufgefallen war. Andererseits habe ich dessen Formeln nur kopiert, und ein paar umgebende If-Anweisungen entfernt.

Ich habe mal versucht die Spalte dem Inhalt ${enoughStock?number} von der Scriptausführung zu "entkoppeln", hat aber nichts gebracht. Die Werte für enoughStock zählen immer weiter runter. Aber in einem "echten" Durchlauf würden sie stimmen.

Ist blöd so zu entwickeln... Gibts was das ich tun kann damit das läuft, oder muss ich hier auf einen Fix warten?

Grüße Daniel

Hallo Daniel,


das ist leider ein "Vorschau Problem" der GetVariable/SetVariable Funktion. Du kannst den "Cache Mode" im SpreadsheetMapper aktivieren ( Mapper der set-/getVariable verwendet), dann sollte es funktionieren.


VG Torsten

Super, das funktioniert! Gewusst wie... Danke!