2017-09-05 2 views
0

Nous importons des données sur Salesforce via Talend et nous avons plusieurs éléments avec le même identifiant interne.Talend évite les doublons ID externes avec Salesforce Output

Une telle importation échoue avec l'erreur "ID externe en double spécifié" en raison du fonctionnement de Salesforce. À l'heure actuelle, nous avons travaillé sur ce point en utilisant la taille de commit de tSalesforceOutput à 1, mais cela ne fonctionne que pour une petite quantité de données ou cela éliminerait les limites de l'API Salesforce.

Y a-t-il une approche connue chez Talend? Par exemple, pour s'assurer que les éléments ayant le même ID externe se retrouvent dans différentes "validations" de tSalesforceOutput?

Répondre

1

Voici la conception de la solution que je souhaite proposer: enter image description here

  • tSetGlobalVar est ici pour initialiser la variable "finition" false. TLoop commence une boucle while avec (Boolean)globalMap.get("finish") == false comme condition de fin. TFileCopy est utilisé pour copier le fichier initial (A par exemple) dans un nouveau fichier (B).
  • tFileInputDelimited lit le fichier B.
  • tUniqRow élimine les doublons. Les enregistrements Uniques vont à tLogRow que vous devez remplacer par tSalesforceOutput. Duplique les enregistrements s'il y en a, allez dans tFileOutputDelimited appelé A (même nom que le fichier original) avec l'option "Lancer une erreur si le fichier existe déjà" non cochée.
  • OnComponent OK après tUniqRow active le tJava qui fixe la nouvelle valeur pour la finition globale avec le code suivant:
    if (((Integer)globalMap.get("tUniqRow_1_NB_DUPLICATES")) == 0) globalMap.put("finish", true);

Explaination avec les données d'échantillon suivantes:
ligne 1
ligne 2
ligne 3

ligne 2 ligne 4
ligne 2
ligne 5
ligne 3

Sur la 1ère itération, 5 dossiers de Uniques sont poussés dans tLogRow, 3 doublons sont poussés dans le fichier A et « finition » ne change pas car il y a des doublons.
Lors de la 2ème itération, les opérations sont répétées pour 2 enregistrements uniques et 1 en double.
Sur la 3ème itération, les opérations sont répétées pour 1 unique et comme il n'y a plus de doublon, "finish" est mis à true et la boucle se termine automatiquement.

Voici le résultat final:
enter image description here

Vous pouvez également décider d'utiliser une autre variable globale pour définir le niveau salesforce commettras (en utilisant la syntaxe (Integer)globalMap.get("commitLevel")). Cette variable sera définie à 200 par défaut et à 1 dans le tJava s'il y a des doublons. En même temps, définissez "finish" sur true (sans tester le nombre de doublons) et vous aurez un niveau de validation de 200 pour la 1ère itération et de 1 pour la 2ème (et pas besoin de plus de 2 itérations).
Vous déciderez du meilleur choix en fonction du nombre de doublons potentiels, mais vous remarquerez que vous pouvez le faire sans modification de la conception du travail.

Je pense que cela devrait résoudre votre problème. Faites le moi savoir.

Cordialement,
TRF

+0

Après avoir passé en revue ma 2ème option, il semble qu'il sera un peu plus compliqué que ce que j'ai écrit comme tUniqRow doive être contourné pendant l'itération 2bd. Si vous voulez adopter cette solution, remplacez tJava par un tJavaRow et ajoutez un second tSalesforceOutput après le niveau de validation défini sur 1. Enfin, il s'agit d'un processus différent. Il vous suffit de choisir lequel est le mieux adapté à votre cas d'utilisation. – TRF

+0

Je ne suis pas sûr de savoir pourquoi le contenu du fichier changerait à chaque itération et donc le nombre de doublons changera – Edmondo1984

+0

Parce qu'à chaque itération nous obtenons le 1er enregistrement pour un ID donné et poussons les doublons dans le fichier qui comptera moins d'enregistrements à chaque fois. – TRF

1

Voulez-vous dire que vous avez le même enregistrement (le même compte par exemple) deux fois ou plus dans l'entrée?
Si oui, ne pouvez-vous pas essayer d'éliminer les doublons et ne garder que l'enregistrement que vous devez transmettre à Salesforce?
Sinon, si chaque enregistrement contient des informations spécifiques (vous avez donc besoin que tous les enregistrements d'entrée soient complets dans Salesforce), envisagez de fusionner les enregistrements avant de transférer le résultat dans Salesforce. Et enfin, si vous ne pouvez pas faire cela, poussez les doublons dans un espace temporaire, placez les enregistrements mais les doublons dans Salesforce et recommencez ce processus jusqu'à ce qu'il n'y ait plus de doublons.
Personnellement, si vous ne pouvez pas éliminer les doublons, je préfère la 2ème approche car c'est la solution pour avoir moins d'appels API Salesforce.

Espérons que cela aide.
TRF

+0

Pouvez-vous fournir plus de détails sur « pousser les doublons dans l'espace temporaire et itérer le processus »? Comment cela se passe-t-il chez Talend? – Edmondo1984

+0

Je veux dire pousser le résultat vers un tHashOutput ou un fichier délimité, comme vous préférez – TRF

+0

C'est bon, mais qu'en est-il de l'itération du processus? C'est la partie que je n'ai pas comprise – Edmondo1984