2017-09-05 3 views
0

Wir importieren Daten über Salesforce über Talend und wir haben mehrere Elemente mit der gleichen internen ID.Talend vermeiden doppelte externe ID mit Salesforce-Ausgabe

Ein solcher Import schlägt aufgrund der Funktionsweise von upsert in Salesforce mit dem Fehler "Duplicate external id specified" fehl. Im Moment haben wir daran gearbeitet, indem wir die Commit-Größe von tSalesForceOutput auf 1 gesetzt haben, aber das funktioniert nur für kleine Datenmengen oder es würde die Salesforce-API-Limits sprengen.

Gibt es einen bekannten Ansatz in Talend? Zum Beispiel um sicherzustellen, dass Artikel mit derselben externen ID in verschiedenen "Commits" von tSalesForceOutput landen?

Antwort

1

Hier ist der Entwurf für die Lösung, die ich vorschlagen: enter image description here

  • tSetGlobalVar hier ist die Variable "Finish" auf false zu initialisieren.
  • tLoop startet eine While-Schleife mit (Boolean)globalMap.get("finish") == false als Endbedingung.
  • tFileCopy wird verwendet, um die Anfangsdatei (A zum Beispiel) in eine neue Datei (B) zu kopieren.
  • tFileInputDelimited liest Datei B.
  • tUniqRow Duplikate eliminiert. Uniques Datensätze gehen zu tLogRow, die Sie durch tSalesForceOutput ersetzen müssen. Dupliziert Datensätze, wenn sie zu "tFileOutputDelimited" mit dem Namen "A" (derselbe Name wie die Originaldatei) mit der Option "Einen Fehler auslösen, wenn die Datei bereits existiert" deaktiviert ist.
  • OnComponent OK nach tUniqRow aktiviert die tJava, die den neuen Wert für die globale Finish mit dem folgenden Code ein:
    if (((Integer)globalMap.get("tUniqRow_1_NB_DUPLICATES")) == 0) globalMap.put("finish", true);

Explaination mit den folgenden Beispieldaten:
Linie 1
Linie 2
Leitung 3
Leitung 2
Leitung 4
Leitung 2 Linie 5
Linie 3

Auf der 1. Iteration 5 uniques Aufzeichnungen geschoben werden in tLogRow, 3 Duplikate werden in der Datei A geschoben und „Finish“ wird nicht geändert, da es Duplikate ist.
In der zweiten Iteration werden Operationen für 2 uniques Datensätze und 1 Duplikat wiederholt.
Bei der dritten Iteration werden die Operationen für 1 unique wiederholt und da es nicht mehr doppelt vorhanden ist, wird "finish" auf "true" gesetzt und die Schleife wird automatisch beendet.

Hier ist das Endergebnis:
enter image description here

Sie können auch eine andere globale Variable, um den Salesforce-Commit-Ebene (mit der Syntax (Integer)globalMap.get("commitLevel")) entscheiden zu verwenden. Diese Variable wird standardmäßig auf 200 gesetzt und bei Dubletten auf 1 im tJava. Setzen Sie "finish" gleichzeitig auf "true" (ohne die Anzahl der Duplikate zu testen), und Sie haben einen Commit-Level von 200 für die 1. Iteration und von 1 für die 2. Iteration (und nicht mehr als 2 Iterationen).
Je nach der Anzahl der möglichen Duplikate entscheiden Sie sich für die bessere Wahl. Sie können jedoch feststellen, dass Sie keine Änderungen am Auftragsdesign vornehmen können.

Ich denke, es sollte Ihr Problem lösen. Gib mir Bescheid.

Grüße,
TRF

+0

Nach der Überprüfung meiner zweiten Option wird es etwas komplizierter, dass das, was ich als tUniqRow geschrieben habe, während der 2bd-Iteration umgangen werden muss. Wenn Sie diese Lösung übernehmen möchten, ersetzen Sie tJava durch einen tJavaRow und fügen Sie einen zweiten tSalesForceOutput hinzu, nachdem der Commit-Level auf 1 gesetzt wurde. Schließlich ist es ein anderer Prozess. Sie müssen nur wählen, welche für Ihren Anwendungsfall besser ist. – TRF

+0

Ich bin mir nicht sicher, warum sich der Inhalt der Datei bei jeder Iteration ändert und daher ändert sich die Anzahl der Duplikate – Edmondo1984

+0

Weil wir bei jeder Iteration den ersten Datensatz für eine gegebene ID bekommen und die Duplikate in die Datei schieben, die weniger Datensätze zählt zu jeder Zeit. – TRF

1

Meinst du, du hast den gleichen Datensatz (das gleiche Konto zum Beispiel) zweimal oder mehr in der Eingabe?
Wenn ja, können Sie nicht versuchen, die Duplikate zu entfernen und nur den Datensatz zu behalten, den Sie an Salesforce senden müssen?
Wenn jeder Datensatz spezifische Informationen enthält (Sie müssen also alle Eingabedatensätze in Salesforce vollständig haben), sollten Sie die Datensätze zuvor zusammenführen, um das Ergebnis in Salesforce zu übertragen.
Und schließlich, wenn Sie das nicht tun können, schieben Sie die Doublons in einem temporären Raum, schieben Sie die Datensätze, aber die Doublons in Salesforce und iterieren andere diesen Prozess, bis es keine Doublons mehr gibt.
Persönlich, wenn Sie die Doublons nicht einfach eliminieren können, bevorzuge ich den zweiten Ansatz, da es die Lösung ist, weniger Salesforce-API-Aufrufe zu haben.

Hoffe, das hilft.
TRF

+0

Können Sie mehr Details zu „schieben die doublons im temporären Raum und durchlaufen den Prozess“ zur Verfügung stellen? Wie wird das in Talend gemacht? – Edmondo1984

+0

Ich meine, push das Ergebnis zu einem tHashOutput oder eine getrennte Datei, wie Sie bevorzugen – TRF

+0

Das ist in Ordnung, aber was ist mit der Prozessiteration? Das ist der Teil, den ich nicht verstanden habe – Edmondo1984

Verwandte Themen