Änderung der Werte von ein Datastore in ein anderes

Hallo,

und zwar habe ich zwei Datastores.

Datastore A

identifier … wert

1 … test1
2 … test2
3 … test3
4 … test4
5 … test5

Datastore B

identifier … key

123450 … 1
123451 … 2
123451 … 3
123451 … 4
123451 … 5

Nun habe ich im Datastore B ein weiteres Feld „test“ angelegt, wo die Wert „wert“ von Datastore A geändert werden soll.

Ich möchte nun den „identifier“ von Datastore A mit dem „key“ von Datastore B matchen und dann den jeweiligen Wert von „wert“ Datastore A in „test“ von Datastore A ändern lassen. Ich bekomme die dafür nötigen Steps nach mehreren Versuchen nicht hin.

Was habe ich probiert?

Ich habe ein SearchDatastore auf Datastore A gemacht. Um dann mit DatastoreWrite auf Datastore B die jeweiligen Werte zu aktualisieren. Hierbei bekomme ich immer die Fehlermeldung, das „identifier“ von Datastore B angegeben werden muss beim Mappen. Aber das ist die Artikelnr. 123450 usw, was mich aber in dem Fall nicht interessiert. Ich will nach „key“ mappen. So habe ich dann versucht den „identifier2“ von Datastore B mit dem Wert von „key“ zu füllen, um es damit zu mappen. Auch keine Chance. Ich habe den Step Filter und Mapper genutzt, aber auch hier sämtliche Versuche ohne Erfolg.

Hat jemand ein Tipp?

Hallo @Lemm,

das sollte mit der Querverweis Funktion relativ einfach machbar sein.

Du im einfachsten Fall reicht ein SearchDatastore Step (Datastore B) um die Datensätze aus dem Datastore zu holen.

Im DastastoreWriter (auch Datastore B) kannst du ein Mapping mit zwei Spalten konfigurieren (identifier und test):

In der test Spalte verwendest du die Querverweis Funktion, um den wert aus dem Datastore A zu holen.

Wenn für einen key kein Datensatz in Datastore A gefunden wurde, dann wird der Wert „No Record found“ ausgegeben.

VG Torsten

Hallo Torsten,

danke für deine schnelle Antwort. :slight_smile:

Das führt leider dazu, dass nun 5 Datensätze in Datastore B angelegt wurden. Ich hatte den DatastoreWriter vorher auf „nur aktualisieren“. Da passierte nichts. Daher hatte ich es testweise auf „anlegen & aktualisieren“ gestellt.

Nun sind folgende Datensätze in Datastore B:

identifier … key … wert

1 … 1 … test1
2 … 2 … test2
3 … 3 … test3
4 … 4 … test4
5 … 5 … test5

Alle anderen Felder der Artikel in Datastore B sind leer. Aktualisiert hat es hier leider nichts.

Hallo @Lemm,

da sollten keine neuen Datensätze angelegt werden, wenn der SearchDatastore und der DatastoreWriter den gleichen Datastore verwenden. Kannst du bitte nochmal überprüfen, ob du das Mapping im DatastoreWriter wie oben im Screenshot konfiguriert hast und das identifier Feld in den erweiterten Einstellungen deines DatastoreWriters leer ist:

VG Torsten

@synesty-Torsten

da sollten keine neuen Datensätze angelegt werden, wenn der SearchDatastore und der DatastoreWriter den gleichen Datastore verwenden.

Es sind nicht die gleichen Datastores.

SearchDatastore ist Datastore A und DatastoreWriter ist Datastore B, weil ich die Inhalte von A nach B aktualisieren möchte. Hier müsste „identifier“ aus Datastore A mit „key“ aus Datastore B gemappt werden. Aber hier kommt es dann zum Problem mit den identifier, wie beschrieben, was ich nicht gelöst bekomme.

Hallo @Lemm,

Wenn du im SearchDatastore Step auch den Datastore B verwendest und im Querverweis (siehe oben) den Wert aus Datastore A „holst“ dann sollte es funktionieren und du bekommst auch den gewünschten Wert aus Datastore A.


Der Weg den du gewählt hast (Datastore A → Datstore B) ist meiner Ansicht nach etwas umständlicher, auch wenn es auf den 1. Blick logischer erscheint. Das Problem ist, dass der „Abgleich“ ob ein Datensatz neu im Datastore ist, nur über den identifier des Datensatzes funktioniert. Diesen Wert hast du im Datastore A nicht.

Lösen kann man das über die Querverweis Funktion. Damit du den Querverweis verwenden kannst, benötigst du aber den identifier der Datensätze aus Datastore A („key“ in Datastore B) in einem der beiden freien identifier Felder (identifier2 oder identifier3) in Datastore B.

Wenn du den Wert aus key im identifier2/3 hast kannst du folgendes machen:

  • SearchDatastore (Datastore A)
  • DatastoreWriter (Datastore B)

In der Konfiguration(Mapping) des DatastoreWriter Steps kannst du folgendes einstellen:

  • identifier Spalte im Mapping lassen und alle Spalten aus Datastore A entfernen die du nicht in Datastore B benötigst:

  • in der identifier Spalte kann du die Querverweis Funktion verwenden um den identifier der Datensätze in Datastore B zu bekommen:

In den erweiterten Einstellungen sollte mode = „Nur aktualisieren“ ausgewählt werden, damit keine neuen Datensätze in Datastore B angelegt werden.

Eventuell ist es auch sinnvoll die Option autoExtendSchema auf „aktiviert“ zu stellen. Mit der Einstellung werden die „gemappten“ Felder aus Datastore A im Schema von Datastore B automatisch hinzugefügt. Ansonsten müssen diese manuell im Schema des Datastore B hinzugefügt werden

VG Torsten

1 Like

Vielen vielen Dank. Das hat funktioniert. :slight_smile:

Hilft mir weiterer solcher Themen in Zukunft besser zu verstehen. :+1:

Danke :slight_smile: :+1:

1 Like

Ich muss hier doch nochmal Nachfragen, weil ich erst jetzt sehe, dass doch nicht komplett passt.

Ich erhalte oftmals „No Record found“. Das kann aber nicht sein, weil „key“ von Datastore B immer ein Wert zu „identifier“ von Datastore A hat. Ich habe sogar ein Fall, wo 1 von 8 Datensätze den Wert befüllt hat, die anderen 7 aber nicht, obwohl es den gleichen „key“ (damit auch „identifier2“ von Datastore B hat.

Ich habe da auch keine Leerzeichen oder sonstiges drin, was zu Fehler führen könnte. Ich habe bei dem Querverweis auch noch etwas rumgespielt. Auch bei den erweiterten Einstellungen. Nichts hilft. Es macht aber wie gesagt auch überhaupt keinen Sinn, weil die Zuweisung klar ist, wie man an der rechten Spalte im Screenshot auch sieht. Zum Beispiel die 10006 in Zeile 2 gibt es in Datastore A.

Daher meine Frage, was noch zu den „No Record found“ führen könnte?

Auch wenn ich aus einer CSV-Datei Daten in meinem Datastore veredeln möchte, komme ich einfach mit dem Querverweis nicht weiter.

In der Vorschau kommt dann immer bei „identifier“ „No Record found“.

Ich habe mir das Spreadsheets | Synesty Docs durchgelesen. Auch das Tutorial-Video. Aber ich finde dafür keine Lösung.

Hallo @Lemm,

„No Record found“ heißt, das der „key“ nicht in der im Querverweis angegeben Spalte (identifier3) des Folders („default“) des Datastores gefunden wurde. Du kannst das auch testen indem du den Datastore öffnest und über den Filter nach der Artikelnummer in identifier3 suchst:

Das liegt daran, dass der Querverweis nur einen Treffer (den 1.) liefert. Wenn du den „key“ an 8 verschiedenen Datensätzen am identifier3 des Datastores hast, wird immer nur der identifier eines Datensatzes (1. Treffer) kommen. Es wird dann entsprechen auch nur dieser eine Datensatz aktualisiert.

Wie du schon festgestellt hast, werden die meisten Probleme beim Querverweis durch Leerzeichen, Zeilenumbrüche oder sonstige Steuerzeichen in den Werten verursacht. Zum testen kannst du den key (z.B. 10006) auch direkt in das identifier3 Feld des Querverweises eintragen. Eventuell hilft auch die ?trim Funktion. Diese entfernt Leerzeichen und Zeilenumbrüche am Anfang und Ende.
image

Ein weitere, mögliche Fehlerquelle wäre die Verwendung eine Datastore Folders der nicht „default“ ist. In diesem Fall muss der Folder im Querverweis angegeben werden.

VG Torsten

@synesty-Torsten

Dann ist es das Problem und das kommt bei meinen Tests auch so hin. Ich möchte aber, dass alle anderen Datensätze auch aktualisiert werden - nicht nur der Erste.

Hallo @Lemm,

wenn der identifier2 („key“) doppelt bzw. mehrfach im Datastore B vorhanden ist, wird der Querverweis immer nur den 1. Datensatz (identifier des 1. Datensatzes) liefern. Damit du alle Datensätze aktualisieren kannst, benötigst du alle identifier (ein Zeile pro Datensatz).
Deshalb hatte ich oben geschrieben, dass es eventuell sinnvoller ist, den SearchDatastore Step mit Datastore B zu verwenden und über die Querverweis Funktion den benötigten Wert aus Datastore A zu holen und dieses Ergebnis dann wieder in Datastore B zu schreiben.
Das hat den Vorteil, dass der SearchDatastore dir ein Spreadsheet mit je einer Zeile pro Datensatz liefert.

Beispiel:

Datastore A:

identifier wert
1 test1
2 test2
3 test3
4 test4
5 test5

Datastore B:

identifier identifier2 key
123450 1 1
123451 2 2
123452 2 2
123453 2 2
123454 5 5

Ergebnis Spreadsheet SearchDatastore (Datastore B) + Querverweis

identifier key Querverweis „wert“
123450 1 test1
123451 2 test2
123452 2 test2
123453 2 test2
123454 5 test5

Das Ergebnis kannst du mit dem DatastoreWriter in Datastore B schreiben. Da du pro Datensatz aus Datastore B eine Zeile (identifier) hast, werden auch alle Datensätze in Datastore B aktualisiert.


Es gibt noch einen weiteren Step, der dir eventuell hilft. Der SearchInDatastoreByIdentifiers kann alle Zeilen für einen identifier (auch doppelte) ausgeben.

Den Querverweis um an den Wert aus Datastore A zu kommen, benötigst du aber trotzdem. Der SearchInDatastoreByIdentifiers ersetzt nur den SearchDatastore Step.

VG Torsten

1 Like

@synesty-Torsten

wenn der identifier2 („key“) doppelt bzw. mehrfach im Datastore B vorhanden ist, wird der Querverweis immer nur den 1. Datensatz (identifier des 1. Datensatzes) liefern. Damit du alle Datensätze aktualisieren kannst, benötigst du alle identifier (ein Zeile pro Datensatz).
Deshalb hatte ich oben geschrieben, dass es eventuell sinnvoller ist, den SearchDatastore Step mit Datastore B zu verwenden und über die Querverweis Funktion den benötigten Wert aus Datastore A zu holen und dieses Ergebnis dann wieder in Datastore B zu schreiben.
Das hat den Vorteil, dass der SearchDatastore dir ein Spreadsheet mit je einer Zeile pro Datensatz liefert.

Habe ich so umgesetzt und funktioniert.

Danke! :slight_smile: :+1: