Fichier de configuration ObjectsToGet de Salesforce
Avec ce fichier de configuration, vous obtenez le contrôle sur :
-
Les informations qui sont récupérées en spécifiant les champs et les relations qui devraient être récupérés pour chaque objet. Ces informations seront disponibles pour utilisation dans le fichier de correspondances.
-
Les enregistrements qui sont retournés en spécifiant des conditions dans la requête SOQL qui sera utilisée pour filtrer les résultats de la requête.
Notes :
-
Si vous souhaitez récupérer des articles de la base de connaissances Salesforce, vous devez spécifier au moins deux requêtes pour chaque type d'article de la base, un pour l'objet *__ka et un autre pour l'objet *__kav (voir Exemple de fichier de configuration ObjectsToGet de Salesforce pour la base de connaissances).
-
Il y a un bogue dans l'API de Salesforce qui fait en sorte que le JSON retourné est invalide en recherchant un champ binaire d'un objet, alors veillez à ne pas inclure de champ binaire dans votre requête.
Définition d'objet Salesforce
Pour obtenir la liste de champs pouvant être recherchés dans un objet spécifique :
-
Les développeurs de Salesforce peuvent utiliser la méthode describeSObject() pour obtenir la définition d'objet complète en format JSON.
Exemple : https://na15.salesforce.com/services/data/v27.0/sobjects/Account/describe
-
Les administrateurs de Salesforce peuvent obtenir la liste complète de champs de la documentation en ligne de l'API Salesforce (voir Account, Task).
Pour obtenir la liste de relations disponibles dans un objet spécifique :
-
Les administrateurs de Salesforce peuvent accéder à toute définition d'objet à partir de Salesforce dans Setup sous le menu Customize. Les relations d'objet sont identifiées par champs de données de type Lookup (voir AccountFields, TaskFields).
Éléments du fichier de configuration
Le fichier de configuration ObjectsToGet de Salesforce est un agrégat de nœuds de requête XML. Un nœud de requête contient plusieurs éléments, chacun étant utilisé pour générer la requête SOQL d'un objet Salesforce.
-
ObjectName (exigé)
-
Le nom de l'objet (standard ou personnalisé) à rechercher (voir Standard Objects).
Note : Si vous utilisez la value attribute, le nom de l'object est facultatif et doit être le même.
-
GroupBy (facultatif)
-
Le nom du champ dans lequel les résultats devraient être regroupés.
-
Limit (facultatif)
-
Le nombre maximal d'éléments qui seront récupérés par la requête.
-
Offset (facultatif)
-
Le nombre d'éléments qui devraient être ignorés dans les résultats de la requête.
-
Fields (exigé)
-
Contient le nom des champs (colonne Field Name dans Salesforce) qui seront disponibles dans chaque enregistrement retourné par la requête. Chaque nom de champ doit être dans un élément <string>, peu importe son type de données. Les champs spécifiés dans cette section peuvent être de tout type de données, sauf Lookup.
Exemple :
<Query> <ObjectName>Account</ObjectName> <Fields> <string>Id</string> <string>IsDeleted</string> <string>Name</string> <string>Type</string> <string>BillingStreet</string> <string>BillingCity</string> <string>BillingState</string> <string>BillingPostalCode</string> <string>BillingCountry</string> <string>Phone</string> <string>Fax</string> <string>AccountNumber</string> <string>Website</string> <string>Sic</string> <string>Industry</string> <string>AnnualRevenue</string> <string>NumberOfEmployees</string> <string>Ownership</string> <string>TickerSymbol</string> <string>Description</string> <string>Rating</string> <string>Site</string> <string>CreatedDate</string> <string>LastModifiedDate</string> <string>SystemModstamp</string> </Fields> </Query>
-
Important : Pour les versions de CES antérieures à 7.0.7022 (septembre 2014), cet opérateur n’est pas validé et a une forme libre. Toutefois, le SOQL résultant doit être dans le format FIELD OPERATOR VALUE. Utilisez plutôt QueryCondition2.
Une ou plusieurs conditions qui seront appliquées à la requête SOQL utilisée pour récupérer des enregistrements d'objets.
-
Field (exigé) :
Nom (ne respectant pas la casse) du champ d'objet auquel la condition est appliquée. Des noms de relations peuvent également être utilisés (ex. : Parent.Type).
-
Operator (exigé) :
L'opérateur à appliquer à la condition. Tout opérateur pris en charge par les requêtes SOQL de Salesforce peut être utilisé (voir Comparison Operators).
-
Value (exigé) :
Valeur sensible à la casse utilisée pour évaluer la condition. Les valeurs de chaîne doivent être entre guillemets.
Exemple :
<Query> <ObjectName>Account</ObjectName> <Fields> <string>Name</string> <string>AccountNumber</string> </Fields> <Conditions> <QueryCondition> <Field>Type</Field> <Operator>!=</Operator> <Value>'Prospect'</Value> </QueryCondition> <QueryCondition> <Field>Owner.Name</Field> <Operator>=</Operator> <Value>'John Smith'</Value> </QueryCondition> </Conditions> </Query>
La requête générée est :
SELECT Name FROM Account WHERE Type != 'Prospect' AND Owner.Name = 'John Smith'
-
-
QueryCondition2 (facultatif)
-
Note : Cette condition de requête est validée et possède davantage d'options. Ceci est la façon préférée de créer une condition de requête.
Une ou plusieurs conditions qui seront appliquées à la requête SOQL utilisée pour récupérer des enregistrements d'objets.
-
Field (exigé) :Nom (ne respectant pas la casse) du champ d'objet auquel la condition est appliquée. Des noms de relations peuvent également être utilisés (ex. : Parent.Type).
-
Relation (exigé) : L'opérateur à appliquer à la condition. Les opérateurs pris en charge sont Equal, NotEqual, Less, LessOrEqual, Greater, GreaterOrEqual, Like, NotLike.
-
SoqlString|SoqlBoolean|SoqlDateTime (exigé) : Valeur sensible à la case (pas Like) utilisée pour évaluer la condition.
Exemple :
<Query> <ObjectName>Account</ObjectName> <Fields> <string>Name</string> </Fields> <Conditions> <QueryCondition2> <Field>Type</Field> <Relation>NotEqual</Relation> <SoqlString>Prospect</SoqlString> </QueryCondition2> <QueryCondition2> <Field>IsEscalated</Field> <Relation>Equal</Relation> <SoqlBoolean>true</SoqlBoolean> </QueryCondition2> <QueryCondition2> <Field>LastViewDate</Field> <Relation>GreaterOrEqual</Relation> <SoqlDateTime>2014-04-28T00:00:00.0000000-00:00</SoqlDateTime> </QueryCondition2> </Conditions> </Query>
Note : Pour SoqlDateTime, le format de date et d'heure doit correspondre exactement à YYYY-MM-DDTHH:MM:SS.0000000-00:00
La requête générée est :
SELECT Name FROM Account WHERE Type != 'Prospect' AND IsEscalated = true AND LastViewDate >= 2014-04-28T00:00:00
-
-
InCondition (facultatif)
-
-
Field (exigé) :Nom (ne respectant pas la casse) du champ d'objet auquel la condition est appliquée. Des noms de relations peuvent également être utilisés (ex. : Parent.Type).
-
AllowedValues (exigé): Valeurs sensibles à la casse possibles du champ.
Exemple :
<Query> <ObjectName>Account</ObjectName> <Fields> <string>Name</string> </Fields> <Conditions> <InCondition> <Field>Type</Field> <AllowedValues> <string>Prospect</string> <string>Client</string> </AllowedValues> </InCondition> </Conditions> </Query>
La requête générée est :
SELECT Name FROM Account WHERE Type IN ('Prospect', 'Client')
-
-
InQueryCondition (facultatif)
-
-
Field (exigé) :
Nom (ne respectant pas la casse) du champ d'objet auquel la condition est appliquée. Des noms de relations peuvent également être utilisés (ex. : Parent.Type).
-
Query (exigé) : Un objet de requête valide (avec ObjectName, Fields, etc) (voir Semi-Joins or Anti-Joins Relationship Query Limits).
Exemple :
<Query> <ObjectName>Case</ObjectName> <Fields> <string>Id</string> </Fields> <Conditions> <InCondition> <Field>Id</Field> <Query> <ObjectName>CaseComment</ObjectName> <Fields> <string>ParentId</string> </Fields> <Conditions> <QueryCondition> <Field>CommentBody</Field> <Operator>=</Operator> <Value>'this is a test'</Value> </QueryCondition> </Conditions> </Query> </InCondition> </Conditions> </Query>
La requête générée est :
SELECT Id FROM Case WHERE Id IN (SELECT ParentId FROM CaseComment WHERE CommentBody = 'this is a test')
-
À partir de CES 7.0.7183 (novembre 2014), semi-jointures dans les conditions de requête (voir Comparison Operators). Les semi-jointures sont utiles lorsque vous souhaitez n’indexer qu’un sous-groupe d’enregistrements basé sur un autre groupe d’enregistrements.
-
Not InQueryCondition (facultatif)
-
-
Field (exigé) :
Nom (ne respectant pas la casse) du champ d'objet auquel la condition est appliquée. Des noms de relations peuvent également être utilisés (ex. : Parent.Type).
-
Query (exigé) : Un objet de requête valide (avec ObjectName, Fields, etc) (voir Semi-Joins or Anti-Joins Query Limits).
Exemple :
<Query> <ObjectName>Case</ObjectName> <Fields> <string>Id</string> </Fields> <Conditions> <NotCondition> <InCondition> <Field>Id</Field> <Query> <ObjectName>CaseComment</ObjectName> <Fields> <string>ParentId</string> </Fields> <Conditions> <QueryCondition> <Field>CommentBody</Field> <Operator>=</Operator> <Value>'this is a test'</Value> </QueryCondition> </Conditions> </Query> </InCondition> </NotCondition> </Conditions> </Query>
La requête générée est :
SELECT Id FROM Case WHERE NOT Id IN (SELECT ParentId FROM CaseComment WHERE CommentBody = 'this is a test')
-
À partir de CES 7.0.7183 (novembre 2014), anti-jointures dans les conditions de requête (voir Comparison Operators). Les anti-jointures sont utiles lorsque vous souhaitez n’indexer qu’un sous-groupe d’enregistrements basé sur un autre groupe d’enregistrements.
-
ParentRelationship (facultatif)
-
Une ou plusieurs relations dont les informations seront disponibles dans chaque enregistrement d'objet retourné par la requête. Une relation d'objet est définie par un champ de recherche qui crée une relation entre l'objet présent qui est recherché et un autre objet. Ces relations permettent des opérations de requête SOQL identiques à des jointures SQL.
-
RelationshipName (exigé) :
Le nom de champ du type de données Lookup.
-
Fields (exigé) :
Le nom des champs de l'objet relié qui sera disponible dans chaque enregistrement retourné par la requête.
-
ParentRelationships (facultatif) :
Un autre niveau de relation parent, mais cette fois, la relation s'applique à l'objet relié.
Exemple :
<Query> <ObjectName>Account</ObjectName> <Fields> <string>Name</string> <string>AccountNumber</string> </Fields> <ParentRelationships> <ParentRelationship> <RelationshipName>Owner</RelationshipName> <Fields> <string>Name</string> <string>Email</string> </Fields> </ParentRelationship> </ParentRelationships> </Query>
Important : Le champ parent est copié dans l'enregistrement. Si le parent est modifié, l'enregistrement indexé n'est pas mis à jour.
-
-
ChildRelationship (facultatif)
-
Une ou plusieurs relations dont les informations seront disponibles dans chaque enregistrement Objet retourné par la requête. Une relation Object est définie par un Lookup Field qui crée une relation entre l'Object présent qui est recherché et un autre Object. Ces relations permettent des opérations de requête SOQL identiques à des jointures SQL.
-
Query (exigé) : Un objet de requête valide (avec ObjectName, Fields, etc).
Exemple :
<Query> <ObjectName>Opportunity</ObjectName> <Fields> <string>Id</string> <string>Name</string> </Fields> <ChildRelationships> <Query> <ObjectName>Attachments</ObjectName> <Fields> <string>Id</string> <string>Name</string> </Fields> </Query> </ChildRelationships> </Query>
La requête générée est :
SELECT Id, Name, (SELECT Id, Name FROM Attachments) FROM Opportunity
Les métadonnées générées, lorsqu'une pièce jointe est retrouvée à l'occasion :
"Attachments.attribute.type" => "Attachment" "Attachments.attribute.url" => "/services/data/v29.0/sobjects/Attachment/00PG000000B8RUvMAN" "Attachments.Id" => "00PG000000B8RUvMAN" "Attachments.Name" => "a_stash_of_werthers.jpg"
Note :
-
Lorsque plus d'un enfant existe, les champs contiennent des valeurs séparées par des points-virgules.
Exemple : Attachments.Name: a.jpg;b.jpg
-
Les relations enfants imbriquées (sous-sous-requêtes) ne sont pas prises en charge.
Important : Le champ enfant est copié dans l'enregistrement. Si l'enfant est modifié, l'enregistrement indexé n'est pas mis à jour.
-
-
PolymorphicRelationship (facultatif)
-
Des relations polymorphiques peuvent être utiles pour des relations parents dans un champ Lookup qui peut être relié à divers types d'objets (ex. : Lookup(Contract,Campaign,Account,Opportunity,Product,Asset,Case,Solution)). La relation polymorphique permet à différents champs d'être récupérés selon l'objet qui sera relié pour un enregistrement spécifique.
Notes :
-
Les deux métadonnées suivantes apparaissent dans l’enregistrement avec des relations polymorphiques : <polymorphic_relationship_name>.<field> et <polymorphic_relationship_name>_<object_name>.<field>.
-
Avant CES 7.0.7183 (novembre 2014), l’enregistrement avec des relations polymorphiques ne fournissait que la métadonnée nommée <polymorphic_relationship_name>_<object_name>.<field>.
-
RelationshipName (exigé) :
Le nom de champ du type de données Lookup.
-
ObjectName (facultatif) :
Le type d'objet relié auquel cette relation polymorphique s'applique.
Note : Avant CES 7.0.7183 (novembre 2014), le champ ObjectName est exigé.
-
Fields (exigé) :
Le nom des champs de l'objet relié qui sera disponible dans chaque enregistrement retourné par la requête.
-
ParentRelationships (facultatif) :
Un autre niveau de relation parent, mais cette fois, la relation s'applique à l'objet relié.
Exemple :
<Query> <ObjectName>Task</ObjectName> <Fields> <string>Id</string> <string>Subject</string> <string>ActivityDate</string> </Fields> <ParentRelationships> <ParentRelationship> <RelationshipName>What</RelationshipName> <Fields> <string>Name</string> <string>Type</string> </Fields> </ParentRelationship> </ParentRelationships> <PolymorphicRelationships> <PolymorphicRelationship> <RelationshipName>What</RelationshipName> <ObjectName>Account</ObjectName> <Fields> <string>Name</string> <string>AccountNumber</string> </Fields> </PolymorphicRelationship> <PolymorphicRelationship> <RelationshipName>What</RelationshipName> <ObjectName>Opportunity</ObjectName> <Fields> <string>Amount</string> <string>TotalOpportunityQuantity</string> </Fields> </PolymorphicRelationship> </PolymorphicRelationships> </Query>
Important : Le champ parent est copié dans l'enregistrement. Si un parent est modifié, l'enregistrement indexé n'est pas mis à jour.
-
-
Une ou plusieurs restrictions d'ordre qui seront appliquées à la requête SOQL utilisée pour récupérer des enregistrements d'objets.
-
Ascending (facultatif) : La direction du classement. La valeur par défaut est true (ascendant). Utilisez false pour descendant.
-
NullsFirst (facultatif) : Si les enregistrements avec les valeurs NULL dans les champs spécifiés doivent être retournés en premier ou en dernier. La valeur par défaut est true.
-
Fields (exigé) : Un ou plusieurs champs sur lesquels baser l'ordre, dans l'ordre de champ spécifié.
Exemples :
Avec la configuration suivante :
-
Opportunity.Id montre que nous pouvons spécifier le nom d'objet de la requête en tant que parent du champ.
-
Account.Foo.Id est un champ dans le parent Foo, qui est également un champ du parent Account de Opportunity.
-
What.Id est un champ dans le parent polymorphique What de Opportunity.
<Query> <ObjectName>Opportunity</ObjectName> <Fields> <string>Id</string> </Fields> <Order> <Ascending>true</Ascending> <NullsFirst>false</NullsFirst> <Fields> <string>Name</string> <string>Opportunity.Id</string> <string>Account.Foo.Id</string> <string>What.Id</string> </Fields> </Order> </Query>
La requête générée est :
SELECT Id FROM Opportunity ORDER BY Name, Opportunity.Id, Account.Foo.Id, What.Id ASC NULLS LAST
Configuration contenant une relation enfant :
<Query> <ObjectName>Opportunity</ObjectName> <Fields> <string>Id</string> </Fields> <ChildRelationships> <Query> <ObjectName>Attachments</ObjectName> <Fields> <string>Id</string> </Fields> <Order> <Fields> <string>Name</string> </Fields> </Order> </Query> </ChildRelationships> </Query>
La requête générée est :
SELECT Id, (SELECT Id FROM Attachments ORDER BY Name ASC NULLS FIRST) FROM Opportunity
Note : L'élément order est pris en charge avec CES 7.0.6607+ (avril 2014).
-
Définition de schéma XML
Note : À partir de CES 7.0.7183 (novembre 2014), chaque ObjectsToGet dans vos sources Salesforce est validé contre le XSD.
Si ce n’est pas le cas, un message d’erreur SALESFORCE_INVALID_CONFIGURATION apparaît dans la console et les journaux de CES.
Utilisez la définition de schéma XML suivante pour valider votre fichier de configuration.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ArrayOfQuery" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Fields">
<xs:complexType>
<xs:sequence>
<xs:element name="string" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="string_Text" msdata:Ordinal="0">
<xs:extension base="xs:string">
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ParentRelationships">
<xs:complexType>
<xs:sequence>
<xs:element name="ParentRelationship" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="RelationshipName" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element ref="Fields" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="ParentRelationships" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="ParentRelationship" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="RelationshipName" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element ref="Fields" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Query" type="QueryType" />
<xs:complexType name="QueryType">
<xs:sequence>
<xs:element name="ObjectName" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="GroupBy" type="xs:string" minOccurs="0" />
<xs:element name="Limit" type="xs:string" minOccurs="0" />
<xs:element name="Offset" type="xs:string" minOccurs="0" />
<xs:element name="FoundRecordsAreDeleted" type="xs:string" minOccurs="0" />
<xs:element ref="Fields" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="Order" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="Ascending" type="xs:boolean" minOccurs="0" maxOccurs="1" />
<xs:element name="NullsFirst" type="xs:boolean" minOccurs="0" maxOccurs="1" />
<xs:element ref="Fields" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Conditions" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="QueryCondition" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Field" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="Operator" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="Value" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element ref="ParentRelationships" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="PolymorphicRelationships" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="PolymorphicRelationship" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="RelationshipName" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="ObjectName" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element ref="Fields" minOccurs="0" maxOccurs="unbounded" />
<xs:element ref="ParentRelationships" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ChildRelationships" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Query" type="QueryType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfQuery" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:sequence>
<xs:element ref="Query" minOccurs="0" maxOccurs="unbounded">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Prochaines étapes?
Créez votre fichier de configuration ObjectsToGet (voir Création d'un fichier de configuration ObjectsToGet de Salesforce).