Diese Seite beschreibt verschiedene Wege, um Daten in einen Datastore zu importieren und zu exportieren. 


Grundlagen


NameBeschreibung

folder

(Pflichtfeld)

Bezeichnung für einen Ordner, zur Gruppierung. Der folder ist Teil des Primärschlüssels eines Datensatzes.

Default-Wert (wenn leer oder nicht vorhanden): default

identifier

(Pflichtfeld)

Eindeutiger Bezeichner des Datensatzes, der zusammen mit folder in einem Datastore eindeutig sein muss.

z.B. Artikelnummer, SKU.


Import mit einem Flow

Um Datensätze zu importieren brauchen Sie einen Flow und den Step SpreadsheetDatastoreWriter.
Dieser Step kann ein Spreadsheet aus einer beliebigen Quelle in einen Datastore schreiben.

Eine der wichtigsten Einstellungen, die Sie im SpreadsheetDatastoreWriter Step treffen müssen, ist dem Step zu sagen, in welchen Spalten identifier und folder stehen. 

Beispiel: Die Einrichtung des Imports einer CSV-Datei wird in diesem Beispiel ausführlich erklärt.

Einfacher nicht-hierarchischer Import

Wenn wir von "einfachem" Import sprechen, dann meinen wir den Import von sog. flachen Daten. D.h. einzelne Datensätze, die in keiner Beziehung zu anderen Datensätzen stehen. 

Fall 1: Import im gleichen Folder

identifierfoldername
SKU1defaultSchuh 1
SKU2defaultHose 1


identifierfoldername
SKU1defaultSchuh 1
SKU1defaultHose 1


Fall 2: Import in verschiedene Folder

identifierfoldername
SKU1LieferantASchuh 1
SKU2LieferantBHose 1


identifierfoldername
SKU1LieferantASchuh 1
SKU1LieferantBSchuh 1

Zur Erinnerung: im gleichen folder müssen identifier unterschiedlich sein. Sind die folder unterschiedlich, dann können identifier gleich sein


Hierarchischer Import Parent-Variant

Wenn wir von hierarchischen Daten bzw. Parent-Variant Import sprechen, dann meinen wir damit den Import von Daten, zwischen denen es eine Eltern-Kind Beziehung (z.B. Stamm-Artikel und dazugehörige Varianten) gibt und die sich im gleichen Datastore befinden.

Bei hierarchischen Daten kommt zum identifier und folder noch eine weitere wichtige Spalte hinzu: der parent_identifier

 

parent_identifier

(Optional)

Der identifier des referenzierten Parent Datensatzes im gleichen Datastore und Folder. Wenn gesetzt, dann wird dieser Datensatz mit dem Parent verknüpft und bildet einen Datensatz vom Typ "Variant".

Default-Wert: <leer>


Fall 3: Import im gleichen Folder

identifierfolderparent_identifiername
SKU1default
Schuh 1
SKU1-reddefaultSKU1Schuh 1 rot
SKU1-bluedefaultSKU1Schuh 1 blau
SKU2default
Hose 1
SKU2-SdefaultSKU2Hose 1 Größe S
SKU2-MdefaultSKU2Hose 1 Größe M
SKU2-LdefaultSKU2Hose 1 Größe L


Fall 4: Import in verschiedene Folder

identifierfolderparent_identifiername
SKU1LieferantA
Schuh 1
SKU1-redLieferantASKU1Schuh 1 rot
SKU1-blueLieferantASKU1Schuh 1 blau
SKU1LieferantB
Schuh 1
SKU1-redLieferantBSKU1Schuh 1 rot
SKU1-blueLieferantBSKU1Schuh 1 blau


Hierarchischer Import Master-Child

Vorab: Master-Child ist sehr ähnlich zu Parent-Variant. Beide Konzepte beschreiben eine Eltern-Kind-Beziehung, aber mit folgenden Unterschieden:

Wir haben uns für diese 2 unterschiedlichen Begriffe entschieden, um diese beiden Konzepte auseinander halten zu können. 

Bei Master-Child spielt die Spalte master_identifier die wichtige Rolle, um Child-Datensatz mit dem Master-Datensatz zu verknüpfen. (master_identifier ist bei Master-Child das, was bei Parent-Variant der parent_identifier ist)

Voraussetzung

Um mit Master-Child zu arbeiten sind 2 Datastores notwendig, und zwar ein Master-Datastore und ein Child-Datastore.

 


In der Datastore Ansicht, werden Master-Child Datastores eingerückt dargestellt. 

Bestellpositionen ist der Child-Datastore vom Master-Datastore Bestellungen. 


Fall 5: Import in Master und in Child Datastore

Beim Import in 2 getrennte Datastore braucht man auch 2 DatastoreWriter Steps.
Zuerst müssen die Master-Datensätze in den Master-Datastore geschrieben werden, danach die Child-Datensätze in den Child-Datastore.
Dazu brauchen Sie 2 Spreadsheets. Ein Spreadsheet beinhaltet die Master-Datensätze, das zweite die Child-Datensätze. 

Master-Spreadsheet

identifierfoldermaster_identifiername
Auftrag1default
Bestellung 1
Auftrag2default
Bestellung 2


Child-Spreadsheet

identifierfoldermaster_identifiername
Auftrag1-SKU1-reddefaultAuftrag1 Schuh 1 rot aus Auftrag 1
Auftrag1-SKU2-MdefaultAuftrag1 Hose 1 Größe M aus Auftrag 1
Auftrag2-SKU2-LdefaultAuftrag2 Hose 1 Größe L aus Auftrag 2



Ein Flow, der Master-Spreadsheet und Child-Spreadsheet importiert hat meistens folgenden Aufbau:

Optionale weitere identifier-Spalten

Jeder Datensatz verfügt noch über 2 weitere identifier-Spalten identifier2 und identifier3.
Diese Spalten sind optional und können mit weiteren IDs/Nummern belegt werden, die für einen Datensatz wichtig sind. Sie spielen bei der Verwendung mit dem Querverweis eine wichtige Rolle. 
identifier2 und identifier3 werden häufig dazu verwendet z.B. EAN und Lieferanten-Artikelnummer zu einem Datensatz zu speichern - mit anderen Worten IDs eines Drittsystems. Mit dem Querverweise kann man dann den identifier ermitteln, welcher beim Import zum Update eines Datensatzes notwendig ist. 

Ein Videotutorial zum Thema Querverweis findet man hier.  Ausserdem gibt es weitere Infos im Handbuch.


Beispiel: identifier per Querverweis über identifier2 herausfinden

Nehmen wir an, wir importieren Artikelstammdaten in einen Datastore. 

identifieridentifier2namepreis
SKU11234567891234Schuh 159,99 EUR

Nun nehmen wir an, Sie bekommen von einem Lieferanten täglich eine Datei mit aktuellen Preisen, in der folgendes enthalten ist:

EANPreis
123456789123449,99 EUR

Diese Lieferantendatei beinhaltet nur die EAN, nicht aber ihre eigenen Artikelnummer, die im identifier gespeichert ist.
Nehmen wir weiter an, Sie möchten die Lieferantendatei um die Spalte mit Ihrer eigenen Artikelnummer anreichern wie folgt:

EANPreisidentifier
123456789123449,99 EURSKU1

Um das zu erreichen, nutzt man man die Querverweis-Funktion im SpreadsheetMapper. (Hinweis für Excel-Nutzer: Der Querverweis in Synesty Studio ist vergleichbar mit einem SVerweis in Excel)

Die folgende Spaltenkonfiguration liest sich wie folgt:

In SQL übersetzt könnte es sich so lesen:

SELECT identifier FROM Artikelstammdaten WHERE identifier2 = $EAN

Der Querverweis liefert als Ergebnis in dieser Spalte für jede Zeile den identifier (unsere interne Artikelnummer, also im Beispiel SKU1). 
Sollte es keinen Treffer geben (d.h. es gibt keinen Datensatz bei dem in identifier2 die gesuchte EAN steht), dann gibt die Querverweis-Funktion No Record found in der entsprechenden Spalte aus. 

EANPreisidentifier
123456789123449,99 EURSKU1
987665 (nicht im Datastore)19,99 EURNo Record found

Mit diesem angereicherten Ergebnis-Spreadsheet kann man nun weiterarbeiten und z.B. ein Preis-Update im eigenen Shop machen.
(Hinweis: Oft ist es so, dass Shop- oder ERP-Systeme die eigene interne Nummer zum Abgleich brauchen. D.h. den identifier statt der externen EAN. Da externe Lieferanten aber niemals diese interne Nummer kennen, sondern meistens EAN schicken, ist der Querverweis notwendig. Voraussetzung ist natürlich, dass die EAN auch im Datastore hinterlegt ist.)

Wie kann ich Zeilen mit No Record found ignorieren / herausfiltern?

Um alle Zeilen zu entfernen, in denen in einer Spalte der Wert No Record found des Querverweises auftaucht, benutzt man den SpreadsheetFilter.

Ein SpreadsheetFilter mit dieser Filterbedinung lässt alle Zeilen durch, die im identifier nicht "No Record found" enthalten - mit anderen Worten: entferne alle Zeilen, in denen im identifier "No Record found" steht. 

identifier2 und identifier3 dürfen Duplikate enthalten (im Gegensatz zu identifier). Sie müssen hier selbst darauf achten, wie Sie mit Duplikaten umgehen. Beim Querverweis können Duplikate problematisch sein, da der Querverweis bei mehreren Treffern nur eines zurück gibt. Bei Duplikaten ist es dann Zufall, welcher Datensatz als Treffer gewählt wird.

Wenn Sie herausfinden möchten, ob Sie evtl. Duplikate in identifier2 oder identifier3 haben, dann können Sie das mit den Spaltenfunktionen herausfinden.

Manueller Import ohne Flow

Datastores verfügen auch über eine manuelle Importfunktion für CSV- oder Exceldateien. Um eine Datei zu Importieren gehen Sie in den gewünschten Datastore und wählen im Dropdown Menü des "Neuer Datensatz" Buttons die Option "Datei importieren" .

Wählen Sie anschließend die Datei aus und klicken den "Upload und Vorschau" Button. Nachdem die Datei verarbeitet wurden gelangen Sie in die Transformy Ansicht, mit allen Spalten des Datastores. Sie können nun die Quell-Spalten aus der Datei den entsprechenden Spalten des Datastores zuordnen. Über den Button starten Sie den Import der Datensätze.

Datenexport mit Flow

Wenn man Daten in einen Datastore hinein importiert, dann will man meistens auch diese Daten wieder heraus holen - sprich exportieren. 

Dafür verwendet man den Step SearchDatastore.

Ein typischer Export-Flow, welcher Daten aus einem Datastore exportiert hat folgenden Aufbau:

Datensätze vom DatastoreWriter lesen

Wenn Sie durch einen DatastoreWriter geschriebenen Datensätze abrufen möchten, verwenden Sie bitte die entsprechenden Output-Spreadsheets des DatastoreWriters wie z.B. newAndUpdatedRecords.

Verwenden Sie dafür NICHT den SearchDatastore-Step! 
Warum nicht? Unsere Datenbank, eine sog. NoSQL Datenbank, arbeitet "eventual consistent". Das heißt, dass es vorkommen kann, dass die gerade geschriebenen Datensätze nicht sofort auf alle Datenbanken und Indizes geschrieben wurden. Damit kann es vorkommen, dass der SearchDatastore Step noch veraltete Daten erhält. Der Vorteil dieses Verhaltens ist allerdings, dass der DatastoreWriter dafür sehr schnell importiert. Verwenden Sie daher zum Lesen eigener Schreibvorgänge (sog. Read your own writes) ausschließlich die erwähnten Output-Spreadsheets.


Export hierarchischer Daten mit Zugriff auf Parent / Master Zeile 

Im genannten SpreadsheetMapper Step können Sie die zu exportierenden Spalten bearbeiten und haben bei hierarchischen Daten darüber hinaus auch noch die Möglichkeit auf die Parent-Zeile bzw. Master-Zeile (bei Child-Datatstore-Zeilen) zuzugreifen. 

Wir empfehlen auch den Abschnitt Spreadsheets - Auf Relationen zugreifen, der beschreibt, wie man beim Export hierarchischer Daten auf die Parent- bzw. Master-Zeile zugreift. Das ist nützlich wenn man z.B. Auftragspositionen mit Daten aus dem Auftragskopf anreichern möchte.


Beispiel Export Auftragsdaten als XML

Ein typisches Beispiel sind Auftragsdaten (Bestellungen) und den dazugehörigen Auftragspositionen (bzw. Bestellpositionen).

Das Skript-Beispiel geht von folgendem Szenario aus:


<?xml version="1.0" encoding="UTF-8"?>  
<PurchaseOrders>

<#list spreadsheet@SearchMasterDatastore_1.getRows() as row> 

<#if (row.children()?? && row.children()?size > 0) >
        <Name>${row.get("shipping_address_given_name")!} ${row.get("shipping_address_family_name")!}</Name>  
        <Street>${row.get("shipping_address_address1")!}</Street>  
        <City>${row.get("shipping_address_city")!}</City>  
        <Zip>${row.get("shipping_address_zip")!}</Zip>  
        <Country>${row.get("shipping_address_country")!}</Country>  
    <Items>

    <#list row.children() as ch>

       <Item PartNumber="${ch['line_items_sku']!}">
          <ProductName><![CDATA[${ch['line_items_title']!}]]></ProductName>
          <Quantity>${ch['line_items_quantity']!}</Quantity>
          <Price>${ch['line_items_price']!}</Price>
          <Currency>${row.get("currency")!}</Currency>
       </Item>
   </#list>

    </Items>
 </PurchaseOrder>
</#if>

</#list>
</PurchaseOrders> 

Das entscheidende sind die beiden verschachtelten Schleifen (<#list>).

Das komplette Beispiel findet sich in der Vorlage Hierarchische XML oder JSON Datei aus Spreadsheet erzeugen (komplexeres Beispiel)