2017-08-17 5 views
0

Je travaille sur une intégration Salesforce pour une application à fort trafic où nous souhaitons automatiser le processus d'importation des enregistrements de Salesforce dans notre application. Pour être clair, je ne travaille pas du côté de Salesforce (c'est-à-dire Apex), mais plutôt en utilisant l'API de repos Salesforce à partir de l'autre application.Comment puis-je interroger l'API Salesforce pour rechercher des enregistrements qui répondent aux critères et qui n'ont jamais été consultés par mon application?

La première idée consistait à utiliser l'heure limite pour la création de l'enregistrement où nous allions augmenter ce temps sur chaque sondage en fonction de l'heure de création du demandeur dans le dernier sondage. On s'est vite rendu compte que ça ne marcherait pas pour ça. Dans la requête, d'autres filtres peuvent inclure un champ d'état dans Salesforce, par exemple, où l'enregistrement doit uniquement être importé après la définition d'un certain statut. Cela rendrait le temps de création de la vérification ou tout autre élément non fiable, car un enregistrement plus ancien pourrait devenir pertinent pour notre importation automatique.

Mon idée suivante consistait à interroger l'API Salesforce pour trouver des enregistrements toutes les quelques heures. Afin d'éviter d'importer le même enregistrement deux fois, la seule façon que je pouvais penser à faire est de garder la trace des ID que nous avons déjà tenté d'importer et les utiliser pour faire un pas en bon état:

SELECT #{columns} FROM #{sobject_name} 
WHERE Id NOT IN #{ids_we_already_imported} AND #{other_filters} 

Mon grand À ce stade, la question était de savoir si Salesforce avait ou non une limite à la longueur de la clause WHERE. A travers quelques recherches, je vois qu'il ya en fait plusieurs limites:

https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_soslsoql.htm

La prochaine chose que je considérais comme accomplissait des requêtes pour trouver tous les ID dans Salesforce qui répondent aux conditions des autres filtres sans vérifier l'ID lui-même . Ensuite, nous pourrions prendre cette liste d'identifiants et supprimer ceux que nous avons déjà suivis de notre côté pour trouver une condition IN plus petite que nous pourrions définir pour trouver toutes les données sur les enregistrements dont nous avons réellement besoin.

Cela ne semble toujours pas complètement fiable cependant. Je vois qu'une seule requête ne peut renvoyer que 2 000 lignes et avoir seulement un décalage jusqu'à 2000. Si nous avons déjà importé 2000 enregistrements, la première requête pourrait ne pas avoir de lignes nécessaires à importer, mais nous ne pouvons pas la compenser pour obtenir les lignes pertinentes en raison de ces limitations. Avec ces limitations je ne peux pas trouver un moyen fiable de trouver les enregistrements pertinents à importer que le nombre d'enregistrements que nous avons déjà importé se développe. J'ai l'impression que ce serait une utilisation courante d'une intégration Salesforce, mais je ne trouve rien à ce sujet. Comment puis-je faire cela sans avoir à m'inquiéter des problèmes lorsque nous atteignons un volume élevé?

+0

il n'y a pas 2000 limite sur la requête, les 2000 premières lignes seront retournées mais vous pouvez accéder au reste d'entre eux [en obtenant la valeur du champ nextRecordsUrl] – superfell

+0

Merci!Je n'avais aucune idée qu'il y avait un moyen intégré pour obtenir le reste des résultats de la requête! Cela permettrait certainement le plan que j'ai expliqué ci-dessus de travailler. – mikewoj

Répondre

0

Vous ne savez pas exactement quelles sont vos exigences ou si la solution doit être générique, mais vous pourriez faire certaines choses.

  1. records de drapeau qui ont été importés, mais cela signifie faire un rappel à Salesforce de mettre à jour les dossiers, mais qui peuvent être bulkified pour réduire le nombre d'appels et de modifier votre requête pour exclure le drapeau
  2. inverse de la façon dont vous obtenez les données à pousser au lieu de tirer, de même avoir des enregistrements push qui répondent aux critères de votre application chaque fois que l'enregistrement répond aux critères avec workflow et messages sortants
  3. Utilisez l'API de diffusion pour configurer un sujet push que vous appliquez peut s'abonner à ce qui serait notifié quand un enregistrement répond aux critères
+0

En quoi la solution 2 diffère-t-elle de 3? Existe-t-il un moyen pour Salesforce d'appeler un webhook de notre côté? – mikewoj

+0

La solution 2 est une règle de workflow dans Salesforce qui envoie un message sortant (par exemple un message SOAP) à un noeud final de votre choix chaque fois qu'un enregistrement répond aux critères spécifiés. La solution 3 est un Push Topic (pensez à une longue interrogation) où votre application s'abonne au canal de discussion push et écoute les modifications. Le canal est alimenté par une instruction SOQL, donc chaque fois qu'un enregistrement change pour répondre aux critères spécifiés dans le SOQL, un message est envoyé aux clients abonnés avec les détails. Il y a quelques limitations avec l'option 3 principalement autour du volume élevé de changements en même temps. –