Frage zu TextHTMLWriter

Ich rufe bei Idealo Bestellungen ab und baue mir mit dem TextHTMLWriter eine XML um die Daten ins ERP zu importieren.


Kann ich irgendwie verhindern das die Einträge mehrfach ausgegeben werden, z.B. das immer nur ein Datensatz importiert werden kann?



<#list idealo_orders@idealoGetOrders_1.getRows() as row>
<Beleg xmlns="http://www.mauve.eu/MauveXml/2.1/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mauve.eu/MauveXml/2.1/ http://download.mauve.eu/schema/MauveXml_2_1.xsd">
<AuftragsNr>${row.get("order_number")!}:</AuftragsNr>
<BelegTyp>Auftrag neu</BelegTyp>
<Zahlungsweise>${row.get("payment_payment_method")!}</Zahlungsweise>
<Versandart>${row.get("fulfillment_type")!}</Versandart>
<RechnungsAdresse>
<Anrede>${row.get("billing_address_salutation")!}</Anrede>
<Vorname>${row.get("billing_address_given_name")!}</Vorname>
<Nachname>${row.get("billing_address_family_name")!}</Nachname>
<Firma></Firma>
<Telefon>${row.get("customer_phone")!}</Telefon>
<Email>${row.get("customer_email")!}</Email>
<Strasse>${row.get("billing_address_address1")!}</Strasse>
<HausNr>${row.get("billing_address_address2")!}</HausNr>
<Plz>${row.get("billing_address_zip")!}</Plz>
<Ort>${row.get("billing_address_city")!}</Ort>
<Land>${row.get("billing_address_country")!}</Land>
</RechnungsAdresse>
<LieferAdresse>
 <Vorname>${row.get("shipping_address_given_name")!}</Vorname>
 <Nachname>${row.get("shipping_address_family_name")!}</Nachname>
 <Firma></Firma>
 <Strasse>${row.get("shipping_address_address1")!}</Strasse>
 <HausNr>${row.get("shipping_address_address2")!}</HausNr>
 <Plz>${row.get("shipping_address_zip")!}</Plz>
 <Ort>${row.get("shipping_address_city")!}</Ort>
 <Land>${row.get("shipping_address_country")!}</Land>
</LieferAdresse>
<PostenListe>
<Posten>
<ArtikelNr>${row.get("line_items_sku")!}</ArtikelNr>
<ArtikelName>${row.get("line_items_title")!}</ArtikelName>
<Menge>${row.get("line_items_quantity")!}</Menge>
<EinzelPreisBrutto>${row.get("line_items_price")!}</EinzelPreisBrutto>
<MwstSatz>19</MwstSatz>
<IstVersandkosten>false</IstVersandkosten>
</Posten>
</PostenListe>
</Beleg>
</#list>

Guten Tag,


über welchen Weg wird denn die XML an das ERP übergeben? Als Datei oder per URL-Web-Call?

Wenn ich Sie korrekt verstanden habe, müssen hier mit dem TextHTMLWriterMultiOutput Step arbeiten.

Dieser ermöglicht es mehrere Dateien in einem zu generieren. Somit könnten Sie hier pro Auftrag eine eigene XML-Datei generieren.


Viele Grüße

Stefan

Hallo,


vielen Dank für die Antwort, aktuell wird die XML als Datei ans ERP übergeben.


Bei der Ausgabe kommt immer wieder mehrfach, das möchte ich irgendwie verhindern

<Beleg xmlns="http://www.mauve.eu/MauveXml/2.1/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mauve.eu/MauveXml/2.1/ http://download.mauve.eu/schema/MauveXml_2_1.xsd">
<AuftragsNr>${row.get("order_number")!}:</AuftragsNr>

Hallo,


Die <#list ...> Anweisung bewirkt, dass Sie durch alle Zeilen der Quelle "idealoGetOrders" gehen und die gesamte XML, die Sie hier festgelegt haben, für jede Zeile, die in der Quelle existiert, ausgeben. Das heißt auch das Element <Beleg ...> wird somit für jede Zeile immer wieder ausgegeben.


Wenn ich die Struktur der XML korrekt deute, beinhaltet jedes XML nur einen Auftrag, das heißt pro Auftrag muss eine neue XML-Datei generiert werden. Bin ich hier korrekt in der Annahme?


Wenn dem so ist müssen Sie hier den Step TextHTMLWriterMultiOutput statt dem normalen TextHTMLWriter verwenden.


Alternativ, wenn Sie mehrere Aufträge pro XML haben wollen, müssen Sie einfach das <Beleg... > Element aus der <#list ...> Anweisung raus ziehen.

Das daraus entstehende XML Template sieht dann so aus:

<Beleg xmlns="http://www.mauve.eu/MauveXml/2.1/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mauve.eu/MauveXml/2.1/ http://download.mauve.eu/schema/MauveXml_2_1.xsd">
<#list idealo_orders@idealoGetOrders_1.getRows() as row>
<AuftragsNr>${row.get("order_number")!}:</AuftragsNr>
<BelegTyp>Auftrag neu</BelegTyp>
<Zahlungsweise>${row.get("payment_payment_method")!}</Zahlungsweise>
<Versandart>${row.get("fulfillment_type")!}</Versandart>
<RechnungsAdresse>
<Anrede>${row.get("billing_address_salutation")!}</Anrede>
<Vorname>${row.get("billing_address_given_name")!}</Vorname>
<Nachname>${row.get("billing_address_family_name")!}</Nachname>
<Firma></Firma>
<Telefon>${row.get("customer_phone")!}</Telefon>
<Email>${row.get("customer_email")!}</Email>
<Strasse>${row.get("billing_address_address1")!}</Strasse>
<HausNr>${row.get("billing_address_address2")!}</HausNr>
<Plz>${row.get("billing_address_zip")!}</Plz>
<Ort>${row.get("billing_address_city")!}</Ort>
<Land>${row.get("billing_address_country")!}</Land>
</RechnungsAdresse>
<LieferAdresse>
 <Vorname>${row.get("shipping_address_given_name")!}</Vorname>
 <Nachname>${row.get("shipping_address_family_name")!}</Nachname>
 <Firma></Firma>
 <Strasse>${row.get("shipping_address_address1")!}</Strasse>
 <HausNr>${row.get("shipping_address_address2")!}</HausNr>
 <Plz>${row.get("shipping_address_zip")!}</Plz>
 <Ort>${row.get("shipping_address_city")!}</Ort>
 <Land>${row.get("shipping_address_country")!}</Land>
</LieferAdresse>
<PostenListe>
<Posten>
<ArtikelNr>${row.get("line_items_sku")!}</ArtikelNr>
<ArtikelName>${row.get("line_items_title")!}</ArtikelName>
<Menge>${row.get("line_items_quantity")!}</Menge>
<EinzelPreisBrutto>${row.get("line_items_price")!}</EinzelPreisBrutto>
<MwstSatz>19</MwstSatz>
<IstVersandkosten>false</IstVersandkosten>
</Posten>
</PostenListe>
</#list>
</Beleg>

Bitte beachten Sie, dass hier ein Element fehlt, welches Aufträge von einander trennt, d.H. das hier entstehende XML ist nicht valide.


Viele Grüße

Stefan

Wenn ich

<#list idealo_orders@idealoGetOrders_1.getRows(1) as row>

dann zieht er nur einen Datensatz

Hallo eldisto,


das idealo_orders Ergebnis-Spreadsheet enthält sowohl die Auftragsdaten (Kopfdaten) als auch die zugehörigen Auftragspositionen. Dabei wird der Kopf immer in der 1. Zeile und die Positionen in den nachfolgenden Zeilen ausgegeben. Das führt dazu, dass bei der Anweisung


<#list idealo_orders@idealoGetOrders_1.getRows() as row>


"Einträge mehrfach ausgegeben" werden.


Die Anweisung


<#list idealo_orders@idealoGetOrders_1.getRows(1) as row>


bewirkt, dass nur die 1. Zeile des idealo_orders Ergebnis-Spreadsheets in ausgegeben wird. D.h. die Auftragspositionen und alle weiteren Bestellungen werden nicht in der XML Datei ausgegeben.


Wenn sie eine XML Datei pro Auftrag inkl. aller Posten erstellen wollen, würden wir ihnen den Weg über einen Master-Child Datastore empfehlen. Als Grundlage können sie die Vorlage "datastore-auslesen" (Flow "XML und JSON Ausgabeformat aus Master-Child datastore erzeugen (eine Datei pro Bestellung)") verwenden und um den idealo Abruf und Speicherung im Datastore erweitern.


Der Flow könnte dann in etwa wie folgt aussehen:




Im 1. DatstoreWriter verwenden sie als Input das Ergebnis "idealo_OrderHeaderData" und im 2. DatastoreWriter "idealo_OrderItemData" des IdealoGetOrders Steps.





Damit die Positionen (Childs Datensätze) dem entsprechenden Auftrag (Master Datensatz) zugeordnet werden, müssen sie im 2. DatastoreWriter noch als masterIdentifierColumn = item_order_number angeben.


Im letzen Schritt können sie dann das template des Steps "TextHTMLWriter - create order data, one file per order (XML format)" auf ihr XML Format anpassen.