Master-/Child: SKU -> Product_ID Abfrage

Hallo zusammen,

ich habe einen Master-/Child DataStore in dem Auftragskopf- und Positionssätze liegen. Um aus diesen nun Bestellungen anlegen zu können muss ich die SKU aus den Positionssätzen in ProductIDs übersetzen. Das will ich mit einer REST-API Abfrage per SpreadsheetUrlDownload machen.
Leider stehen in den Quelltabellen anfangs immer Kopfzeilen, was dazu führt, dass Response#1 voller Produktinfos ist, die ich nicht benötige.

Im Mapper sind die folgenden Informationen bereits für die Bestellungserzeugung gemappt.
image

Der Call ist ***host*** /wp-json/wc/v3/products/?sku=${line_items_SKU!} .

Die Response sieht dann immer so aus:

Gibt es eine Möglichkeit die Zeilen innerhalb des SpreadsheetUrlDownloaders loszuwerden? Bzw. vllt einen anderen Ansatz zur Lösung des Problems?

Im nächsten Schritt wird die Antwort per JSONReader in eine Tabelle gewandelt die lediglich SKU und ID beinhaltet. Danach soll sie per KeyValueSpreadsheet verweisbar gemacht und dann dem Zielcall hinzugefügt werden, um die Bestellung erstellen zu können.

Danke schon mal für eure Hilfe :slight_smile:

Hallo @laddi,

ich bin mir nicht ganz sicher was genau du vorhast. Es liest sich so, als bekommst du eine Response, bei der du nur jede zweite Zeile brauchst, oder? Das kannst du eigentlich mit einem nachfolgenden Filter-Step erledigen.

In dem Filter gibst du dann eine Spalte mit einem bestimmten Wert an, die nur in den Zeilen auftritt, die du auch brauchst.

Viele Grüße
Lukas

Hey @synesty-Lukas ,

Ich hatte das schon mit dem Filter versucht; Items_SKU!?trim != '' auf den SearchDatastore Output. Frage mich aber gerade, warum das jetzt funktioniert.

Im Mapper versuche ich jetzt in der entsprechenden Zielspalte das folgende:

<#if map@KeyValueSpreadsheet_13.containsKey('BItems_SKU')>
map@KeyValueSpreadsheet_13.get['id']
<#else>
</#if>

Leider ohne Erfolg. Er schimpft und meckert, dass er map@KeyValueSpreadsheet_13 nicht findet… die allerdings existiert.

Script error: You have used a variable (map@KeyValueSpreadsheet_13.containsKey) which does not exist. This can happen if you misspelled the variable, forgot to check if if the variable exists or pause(…)d a previous step. (Root Causes: InvalidReferenceException: The following has evaluated to null or missing: ==> map@KeyValueSpreadsheet_13.containsKey [in template „line_items_SKU“ at line 1, column 6] ---- FTL stack trace („~“ means nesting-related): - Failed at: #if map@KeyValueSpreadsheet_13.contai… [in template „line_items_SKU“ at line 1, column 1] ----): <#if map@KeyValueSpreadsheet_13.containsKey(‚BItems_SKU‘)>map@KeyValueSpreadsheet_13.get[‚id‘]<#else></#if>

Edit: Genug edit. :wink:

Guten Morgen @laddi,

im Mapper haben die Referenzen zu Outputs vorheriger Steps und Flow/Projekt Variablen alle den Präfix meta.. In deinem Beispiel sollte das

meta.map@KeyValueSpreadsheet_13

sein.

Wenn du die Wert einfügen Funktion (+ Button nebenWert Feld) verwendest, dann sollte die korrekte Variable eingefügt werden.

Nach dem einfügen musst du ggf. die Daten nochmal neu holen: speichern, aus Mapper raus und anschließend nochmal konfigurieren, wie hier von Lukas beschrieben. Das ist leider noch ein Bug, der sich momentan nicht so leicht lösen lässt (aber wir arbeiten dran).

Viele Grüße
Torsten

Guten Morgen @synesty-Torsten,
danke dir! Das habe ich umgesetzt.

Aus einem bisher unverständlichen Grund, gibt es Leerzeilen aus.

<#if meta.map@KeyValueSpreadsheet_13.containsKey(Items_SKU!)> 
${meta.map@KeyValueSpreadsheet_13.get("value")}
<#else>
</#if>

Auch nachdem ich den Konfigurator verlassen habe füllt er sie nicht aus. Als wäre die KeyMap leer; was sie aber nicht ist :-/.

Glaube ich bin kurz vor der Lösung und sehe den Wald vor lauter Bäumen nicht >.<’

Hallo @laddi,

ich denke der Fehler liegt hier:

Den Wert (Spalte „value“) aus dem KeyValueSpreadsheet bekommst du mit

${meta.map@KeyValueSpreadsheet_13.get(Items_SKU!)}

Viele Grüße
Torsten

Hey @synesty-Torsten!
Ja top! Das funktioniert. Wenn du mir jetzt noch erklären magst, warum sich die Syntax ‚gefühlt‘ falschrum zusammensetzt, bin ich happy :smiley:

Abseits davon macht mich der Syntax allgemein fertig. Gibt es eine Doku dazu, wie man in Output-Spreadsheets von vorherigen Steps verweist? Steps | Synesty Docs habe ich gelesen, dort wird nur auf den Gesamtoutput oder list verwiesen. Da ich aber einen einzelnen Wert brauche, bringt mich list hier nicht voran.

Innerhalb meines APIcalls, mit dem ich die nun umgewandelten Bestellungen einzeln zu unserem Shop POSTe will ich nun auf Einträge im spreadsheet des Mappers zeigen. Nur check’ ich die Syntax noch immer nicht.

{
"payment_method": "${spreadsheet@SpreadsheetMapper_4.get(payment_method)}"
}

Sie haben eine Variable verwendet (spreadsheet@SpreadsheetMapper_4.get), die nicht existiert.

Ich mache das zum Testen in einem TextHTMLWriter. Später kommt das dann in den APICall.

Danke schon mal für die nächste Unterstützung :slight_smile:

Hallo @laddi,

wenn du aus einem TextHTMLWriter auf einen Mapper zugreifen möchtest, musst du durch den Mapper listen, da die Logik davon ausgeht, dass dein Mapper mehrere Zeile also auch mehrere Werte hat.
Weil ${spreadsheet@SpreadsheetMapper_4.get(payment_method)} wüsste, abseits davon, dass der Syntax falsch ist, nicht welchen Wert du aus Spalte payment_method haben möchtest.

Deshalb ist im HTMLWriter der ±Button dein bester Freund:
image

Wenn du das Skript hinzufügst werden dir erstmal alle Spalten deines Mappers aufgelistet, die nicht gewünschten löschst du raus.

Willst du nur einen bestimmten Wert, zum Beispiel den der ersten Zeile kannst du dir das ungefähr so als Variable definieren:

<#assign payment_methode>
<#list spreadsheet@SpreadsheetMapper_4.getRows() as row>
<#if row.rowNumber == 1>${row.get("payment_methode")!}<#break></#if>
</#list>
</#assign>
${payment_methode}

Viele Grüße
Lukas

Okay, das klingt erstmal gut. Ich klicke mich schon als durch das + … in der Regel kommt es auch zu dem gewünschten Ergebnis. Nur manchmal halt nicht :-D.

Ich schaue mal wie ich das nun umsetze; schließlich brauche ich etwas wie einen COUNT und spätestens bei den Positionszeilen (unterschiedliche Anzahl) wird’s dann schwieriger. Ich habe irgendwie sowas wie eine forEach im Kopf.

Vielleicht fällt mir was ein, wie ich das machen könnte. Oder es zeigt sich ein anderer Weg zur Lösung auf.

Danke schon mal :slight_smile: !