Plentymarkets Orders in XML Datei

Hallo,


wir würden gern einen Spreadsheet mit verschiedenen Aufträgen + Auftragspositionen aus Plentymarkets in eine XML Datei schreiben. Der Aufbau der XML Datei ist hier vom Kunden vorgegeben.


Welchen Step nehmen wir dazu am besten?


Vielen Dank und liebe Grüße

Mark

Folgendes könnte weiterhelfen:

Vielen Dank, das hat mir sehr weitergeholfen. Mein Template sieht aktuell so aus:


<?xml version="1.0"?>
<#list spreadsheet@SpreadsheetMapper_12.getRows() as row> 
  <ORDER>
  <ordr_date_ext>${row.get("ordr_date_ext")!}</ordr_date_ext>
  <ordr_key_ext>${row.get("ordr_key_ext")!} </ordr_key_ext>
  <ordr_debt_key_ext>${row.get("ordr_debt_key_ext")!}</ordr_debt_key_ext>
  <ordr_despatch_type>${row.get("ordr_despatch_type")!}</ordr_despatch_type>
  <ordr_form_typ>${row.get("ordr_form_typ")!}</ordr_form_typ>
  <order_fee_gross>${row.get("order_fee_gross")!}</order_fee_gross>
  <order_fee_net>${row.get("order_fee_net")!}</order_fee_net>
  <ordr_description>${row.get("ordr_description")!}</ordr_description>
  <ordr_notice>${row.get("ordr_notice")!}</ordr_notice>
  <ordr_customers_email>${row.get("ordr_customers_email")!}</ordr_customers_email>
  <ORDER_ADDR>
    <orat_id>2</orat_id>
    <orad_text>${row.get("orad_text_cust_Name")!}</orad_text>
    <orad_text>${row.get("orad_text_cust_address_street")!}</orad_text>
    <orad_text>${row.get("orad_text_cust_plz_ort")!}</orad_text>
  </ORDER_ADDR>
  <ORDER_ADDR>
    <orat_id>3</orat_id>
    <orad_text>${row.get("orad_text_del_Name")!}</orad_text>
    <orad_text>${row.get("orad_text_del_address_street")!}</orad_text>
    <orad_text>${row.get("orad_text_del_plz_ort")!}</orad_text>
  </ORDER_ADDR>
  <ORDER_ITEM>
    <ordi_pos_text>${row.get("ordi_pos_text")!}</ordi_pos_text>
    <ordi_arti_no>${row.get("ordi_arti_no")!}</ordi_arti_no>
    <ordi_amount>${row.get("ordi_amount")!}</ordi_amount>
    <ordi_one_net>${row.get("ordi_one_net")!}</ordi_one_net>
    <ordi_total_net>${row.get("ordi_total_net")!}</ordi_total_net>
    <ordi_one_gross>${row.get("ordi_one_gross")!}</ordi_one_gross>
    <ordi_total_gross>${row.get("ordi_total_gross")!}</ordi_total_gross>
    <ordi_vat>${row.get("ordi_vat")!}</ordi_vat>
  </ORDER_ITEM>
</ORDER>
</#list>

<ORDER_ITEM> soll dabei eine Schleife sein, die alle OrderItems abarbeitet und anschließend die gesamte Parent-Order über </ORDER> schließt.


Habt ihr einen Tipp, wie ich das bewerkstelligen kann?


LG

Mark

Das geht nur wenn die Daten vorher in einen Datastore geschrieben werden. Wenn man davon ausgehen kann, dass die Plenty Order Daten 2-stufig im Datastore liegen, dann ist es grob so:


Diese kann man dann mit einem SearchDatastore Step auslesen.


1. Parent-Variant Datastore (d.h. nur ein Datastore, aber mit Parent- und Variantenzeilen:



<#list row.variants() as v>
  <ORDER_ITEM>
    <ordi_bla>${v.get('variantenspalte')!}</ordi_bla>
  </ORDER_ITEM>
  </#list>


Hier ist wichtig, dass man den Filter im SearchDatastore Parents/Varianten Filter="Nur Parents" setzt.


2. liegen die die Auftragsdaten getrennt in einem Master- und Child-Datastore


<#list row.children() as c>
  <ORDER_ITEM>
    <ordi_bla>${c.get('childspalte')!}</ordi_bla>
  </ORDER_ITEM>
  </#list>


Hier ist wichtig, dass man den Filter im SearchDatastore Children ausgeben="Children nicht ausgeben" setzt.


Wir haben die Daten schon über einen Filter-Step vorher getrennt, d.h. Plenty OrderHead und OrderItems separiert. Auf diese greifen wir dann mit bspw. ${parent['OrderHeadShippingProfileID']} zu.


Müssen wir hier dennoch zwingend mit Datastores arbeiten?

Man kommt anders nicht vom OrderHeader an die OrderItems ran. Nur wenn man Datastores verwendet hat man diese Möglichkeit. Ja, ${parent['parentSpalte']} funktioniert. Aber die OrderItems hängen ja an der Order und man muss über die Order an die Items ran. Das geht nur mit Datastores. (${parent.variants()} bzw. ${master.children()}). Das ist auch der übliche Weg, sich die Aufträge erstmal im Datastore zu puffern und danach getrennt zu verarbeiten. Vorteil ist auch, dass man die Daten erstmal im Datastore hat, und dann tracken kann, was man schon exportiert hat. Auch sicherer, falls mal irgendwas mi der API ist. Dadurch hat man Datenholen per API sauber getrennt vom Export.


Hier noch 2 Vorlagen, die den hierarchischen Import in Datastores zeigen:

Mit der Vorlage Hierarchischer Export von oben kann man das dann exportieren.

Vielen Dank.


Es klappt soweit ganz gut, allerdings habe ich folgendes Problem:

Sobald wir die Auftragspositionen in den Child Datastore speichern wollen, wird pro Artikel lediglich eine Zeile erstellt.

In der Vorschau sieht soweit alles gut aus, es werden mehrere Zeilen pro Order erstellt:

image


Sobald ich nun aber den Flow anstoße, wird für jeden Artikel lediglich eine Zeile erstellt. Wenn ein Artikel in mehreren Aufträgen vorkommt, werden die Zeilen nicht korrekt gespeichert.


identifierColumn im DatastoreWriter für Master: OrderHeadOrderID

identifierColumn im DatastoreWriter für Child: OrderItemsVariantID

masterIdentifierColumn im DatastoreWriter für Child: OrderHeadOrderID


Habt ihr eine Idee?


identifierColumn im DatastoreWriter für Child sollte sich aus aus OrderHeadOrderID-OrderItemsVariantID zusammensetzen.

z.B. ${OrderHeadOrderID}-${OrderItemsVariantID}


weil identifier immer eindeutig sein muss.

Hallo zusammen,


vielen Dank nochmal für eure Hilfe - wir haben das Setup jetzt ganz gut hinbekommen:


image


Nun stehen wir vor einer letzten Herausforderung: Wir möchten in der XML Datei nur die Daten aus den Datastores ziehen, die "UNPROCESSED" sind. Gibt's hierfür eine direkte Freemarker Lösung oder brauchen wir einen Zwischenstep?


Besten Dank

Mark


Hallo Mark,


im Step 7 (SearchDatastore) kannst du den Filter "processingStatus" verwenden, um z.B. nur "UNPROCESSED" Datensätze zu exportieren.


Viele Grüße

Torsten

Hallo Torsten,


klar - da hätte ich mal selbst drauf kommen sollen. DANKE!


LG
Mark

Merkwürdigerweise wirft der SearchDatastore Step aber keine Ergebnisse aus:


image


Der Datastore hat Zeilen und es ändert nichts, welchen Processing Status ich filter.


Habt ihr eine Idee?


LG
Mark

Hallo Mark,


könnte sein das es noch ein "gecachtes" Ergebnis erhalten hast. Kannst du bitte nochmal schauen welchen Processing Status die Datensätze im Datastore haben (siehe 2. Screenshot) und nach der Ausführung der Vorschau ggf, nochmal auf Cache zurücksetzen anklicken.





Viele Grüße

Torsten

Hi Torsten,


das war es, vielen Dank.


Sorry dass ich dich hier so beanspruche, aber mit dem XML Output und einigen speziellen Anforderungen unseres Kunden haben wir ein paar Probleme.


Aktuell folgendes: Über den oben genannten Flow exportieren wir die Auftragsdaten. Im Child Datastore haben wir als identifier die OrderHeadID + VariationID. Nun werden aber bei einigen Aufträgen nur eine bestimmte Anzahl an Artikeln in dem Datastore gespeichert. Einige fehlen einfach.


Beispiel:

Plenty Auftrag:

image


Datastore:

image


In Plenty sind es 15, im Datastore nur 9. Beispiel VariantenID: 1149. Diese ist nur einmal enthalten.


Hast du eine Idee?


LG
Mark

Hallo Mark,


der identifier muss eindeutig sein. Ansonsten wird nur ein Datensatz neu importiert und wenn der identifier ein weiteres mal vorkommt wird der Datensatz aktualisiert. In deinem Beispiel führt die doppelt vorhandene Varianten ID am Auftrag (Order ID 375) zu dem doppelten identifier (375-1149).


Um das Problem zu beheben, würde ich dir empfehlen eine Kombination aus OrderHeadOrderID+ OrderItemsID für den identifier im Child Datastore zu verwenden. Die OrderItemsID (Achtung: nicht verwechseln mit OrderItemsVariantItemID) ist eine eindeutige ID pro Positionszeile der Bestellung.


Viele Grüße

Torsten