Attributs de liste à sélection multiple
Hinweis
Des attributs de liste à sélection multiple ont été ajoutés dans Dynamics 365 Customer Engagement (on-premises) version 9.x.
Les clients qui n’utilisent pas les assemblys .NET actuels doivent inclure SdkClientVersion avec la valeur 9.0.0.0 ou valeur supérieure afin d’utiliser les attributs MultiSelectPicklistAttributeMetadata. Pour plus d’informations, voir SdkClientVersion.
Les personnalisateurs peuvent définir un attribut qui offre la sélection de plusieurs options. La classe MultiSelectPicklistAttributeMetadata définit un type d’attribut qui hérite de la classe EnumAttributeMetadata. Comme la classe PicklistAttributeMetadata, cet attribut comprend une propriété OptionSetMetadataOptions qui contient les options valides pour l’attribut. La différence est que les valeurs que vous obtenez ou définissez sont d’un type OptionSetValueCollection contenant un éventail d’entiers représentant les options sélectionnées. Les valeurs mises en forme pour cet attribut sont une chaîne séparée par des points-virgules contenant les étiquettes des options sélectionnées.
Avec l’API web, cet attribut est défini à l’aide de MultiSelectPicklistAttributeMetadata EntityType.
Comme les attributs de liste à choix multiple, il n’existe techniquement pas de limite supérieure pour le nombre d’options qui peuvent être définies. Les considérations d’ordre pratique doivent être déterminer le facteur de limitation. Néanmoins, seules 150 options peuvent être sélectionnées pour un attribut unique. En outre, la valeur par défaut ne peut pas être définie.
Définir des valeurs de liste à sélection multiple
Avec l’API web, vous définissez les valeurs en passant une chaîne contenant des numéros séparés par des virgules comme décrit dans l’exemple suivant :
Demande
POST [organization uri]/api/data/v9.1/contacts HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
{
"@odata.type": "Microsoft.Dynamics.CRM.contact",
"firstname": "Wayne",
"lastname": "Yarborough",
"sample_outdooractivities": "1, 9"
}
Réponse
HTTP/1.1 204 No Content
OData-Version: 4.0
OData-EntityId: [organization uri]/api/data/v9.1/contacts(0c67748a-b78d-e711-811c-000d3a75bdf1)
Avec le service d’organisation en utilisant les assemblys, utilisez OptionSetValueCollection pour définir les valeurs pour cet attribut comme décrit dans l’exemple C# suivant :
OptionSetValueCollection activities = new OptionSetValueCollection();
activities.Add(new OptionSetValue(1)); //Swimming
activities.Add(new OptionSetValue(9)); //Camping
Contact contact = new Contact();
contact["firstname"] = "Wayne";
contact["lastname"] = "Yarborough";
contact["sample_outdooractivities"] = activities;
_serviceProxy.Create(contact);
Interroger les données à partir de listes à sélection multiple
Deux nouveaux opérateurs de condition ont été ajoutés pour prendre en charge l’interrogation des valeurs dans des groupes d’options à sélection multiple : ContainValues et DoesNotContainValues ou les opérateurs FetchXml contain-values et not-contain-values. Avec l’API web, il existe les fonctions de requête équivalentes ContainValueset DoesNotContainValues.
Les autres opérateurss de condition existant qui peuvent être utilisés avec ce type d’attribut comprennent : Equal, NotEqual, NotNull, Null, In et NotIn.
Hinweis
Les opérateurs ContainValues et DoesNotContainValues dépendent de l’indexation de texte intégral à appliquer sur les tables de base de données qui stockent les valeurs multiples. Il y a une certaine latence une fois que les enregistrements sont créés et que l’index de texte intégral est appliqué. Vous devrez peut-être attendre quelques secondes après la création des enregistrements avant que les filtres utilisant ces opérateurs puissent évaluer les valeurs.
Les exemples suivants illustrent l’utilisation de ContainValues et not-contain-values à l’aide de FetchXML avec le jeu de données suivant sur un attribut de liste à sélection multiple nommé sample_outdooractivities sur l’entité contact.
Options sample_outdooractivities de liste à sélection multiple :
| Valeur | Étiquette |
|---|---|
| 1 | Natation |
| 2 | Randonnée |
| 3 | Alpinisme |
| 4 | Pêche |
| 5 | Chasse |
| 6 | Exécution |
| 7 | Canotage |
| 8 | Ski |
| 9 | Camping |
Valeurs de l’entité Contact
fullname |
sample_outdooractivities |
|---|---|
| Wayne Yarborough | 1,9 |
| Monte Orton | 2 |
| Randal Maple | 4 |
| Hiram Mundy | 2,3,8,9 |
| Barbara Weber | 1,4,7 |
| Georgette Sullivan | 4,5,9 |
| Verna Kennedy | 2,4,9 |
| Marvin Bracken | 1,2,8,9 |
Exemple de code utilisant l’API web
Cet exemple explique l’utilisation de la fonction de requête ContainsValues pour obtenir tous les contacts qui aiment la randonnée. Remarquez comment le texte des options est retourné sous la forme d’annotations suite à la préférence appliquée odata.include-annotations="OData.Community.Display.V1.FormattedValue".
Demande
GET [organization uri]/api/data/v9.1/contacts?$select=fullname,sample_outdooractivities&$filter=Microsoft.Dynamics.CRM.ContainValues(PropertyName='sample_outdooractivities',PropertyValues=%5B'2'%5D) HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"
Réponse
HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
OData-Version: 4.0
Preference-Applied: odata.include-annotations="OData.Community.Display.V1.FormattedValue"
Content-Length: 1092
{
"@odata.context": "[organization uri]/api/data/v9.1/$metadata#contacts(fullname,sample_outdooractivities)",
"value": [{
"@odata.etag": "W/\"529811\"",
"fullname": "Monte Orton",
"sample_outdooractivities@OData.Community.Display.V1.FormattedValue": "Hiking",
"sample_outdooractivities": "2",
"contactid": "cdbcc48e-0b8d-e711-811c-000d3a75bdf1"
}, {
"@odata.etag": "W/\"529823\"",
"fullname": "Hiram Mundy",
"sample_outdooractivities@OData.Community.Display.V1.FormattedValue": "Hiking; Mountain Climbing; Skiing; Camping",
"sample_outdooractivities": "2,3,8,9",
"contactid": "d7bcc48e-0b8d-e711-811c-000d3a75bdf1"
}, {
"@odata.etag": "W/\"529838\"",
"fullname": "Verna Kennedy",
"sample_outdooractivities@OData.Community.Display.V1.FormattedValue": "Hiking; Fishing; Camping",
"sample_outdooractivities": "2,4,9",
"contactid": "e6bcc48e-0b8d-e711-811c-000d3a75bdf1"
}, {
"@odata.etag": "W/\"529843\"",
"fullname": "Marvin Bracken",
"sample_outdooractivities@OData.Community.Display.V1.FormattedValue": "Swimming; Hiking; Skiing; Camping",
"sample_outdooractivities": "1,2,8,9",
"contactid": "ebbcc48e-0b8d-e711-811c-000d3a75bdf1"
}]
}
Cet exemple explique l’utilisation de l’opérateur not-contain-values dans la requête FetchXml suivante à l’aide de l’API web.
<fetch distinct='false' no-lock='false' mapping='logical'>
<entity name='contact'>
<attribute name='fullname' />
<attribute name='sample_outdooractivities' />
<filter type='and'>
<condition attribute='sample_outdooractivities' operator='not-contain-values'>
<value>2</value>
</condition>
</filter>
</entity>
</fetch>
Demande
GET [organization uri]/api/data/v9.1/contacts?fetchXml=%253Cfetch%2520distinct%253D'false'%2520no-lock%253D'false'%2520mapping%253D'logical'%253E%253Centity%2520name%253D'contact'%253E%253Cattribute%2520name%253D'fullname'%2520%252F%253E%253Cattribute%2520name%253D'sample_outdooractivities'%2520%252F%253E%253Cfilter%2520type%253D'and'%253E%253Ccondition%2520attribute%253D'sample_outdooractivities'%2520operator%253D'not-contain-values'%253E%253Cvalue%253E2%253C%252Fvalue%253E%253C%252Fcondition%253E%253C%252Ffilter%253E%253C%252Fentity%253E%253C%252Ffetch%253E HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue"
Réponse
HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
OData-Version: 4.0
Preference-Applied: odata.include-annotations="OData.Community.Display.V1.FormattedValue"
{
"@odata.context": "[organization uri]/api/data/v9.1/$metadata#contacts(fullname,sample_outdooractivities,contactid)",
"value": [{
"@odata.etag": "W/\"529806\"",
"fullname": "Wayne Yarborough",
"sample_outdooractivities@OData.Community.Display.V1.FormattedValue": "Swimming; Camping",
"sample_outdooractivities": "1,9",
"contactid": "c8bcc48e-0b8d-e711-811c-000d3a75bdf1"
}, {
"@odata.etag": "W/\"529816\"",
"fullname": "Randal Maple",
"sample_outdooractivities@OData.Community.Display.V1.FormattedValue": "Fishing",
"sample_outdooractivities": "4",
"contactid": "d2bcc48e-0b8d-e711-811c-000d3a75bdf1"
}, {
"@odata.etag": "W/\"529828\"",
"fullname": "Barbara Weber",
"sample_outdooractivities@OData.Community.Display.V1.FormattedValue": "Swimming; Fishing; Boating",
"sample_outdooractivities": "1,4,7",
"contactid": "dcbcc48e-0b8d-e711-811c-000d3a75bdf1"
}, {
"@odata.etag": "W/\"529833\"",
"fullname": "Georgette Sullivan",
"sample_outdooractivities@OData.Community.Display.V1.FormattedValue": "Fishing; Hunting; Camping",
"sample_outdooractivities": "4,5,9",
"contactid": "e1bcc48e-0b8d-e711-811c-000d3a75bdf1"
}]
}
Exemple de code utilisant QueryExpression et FetchExpression
L’exemple C# suivant illustre l’utilisation de l’opérateur ContainsValues avec QueryExpression et de not-contain-values avec FetchExpression utilisant RetrieveMultiple et le service d’organisation.
//Retrieve contacts who like hiking
//Using Query Expression
int[] hikingValue = new int[] { 2 };
ConditionExpression condition = new ConditionExpression("sample_outdooractivities", ConditionOperator.ContainValues, hikingValue);
FilterExpression filter = new FilterExpression();
filter.AddCondition(condition);
QueryExpression likesHikingQuery = new QueryExpression(Contact.EntityLogicalName);
likesHikingQuery.ColumnSet.AddColumns("fullname", "sample_outdooractivities");
likesHikingQuery.Criteria.AddFilter(filter);
EntityCollection hikers = _serviceProxy.RetrieveMultiple(likesHikingQuery);
Console.WriteLine("\nContacts who like Hiking");
Console.WriteLine("=========================");
foreach (Contact contact in hikers.Entities)
{
string values = (contact["sample_outdooractivities"] == null) ? "null" : contact.FormattedValues["sample_outdooractivities"];
Console.WriteLine("{0} {1}", contact.FullName, values);
}
/*OUTPUT:
Contacts who like Hiking
=========================
Monte Orton Hiking
Hiram Mundy Hiking; Mountain Climbing; Skiing; Camping
Verna Kennedy Hiking; Fishing; Camping
Marvin Bracken Swimming; Hiking; Skiing; Camping
*/
//Retrieving contacts who do not like hiking:
//Using Fetch Expression
string fetchXml = @"<fetch distinct='false' no-lock='false' mapping='logical'>
<entity name='contact'>
<attribute name='fullname' />
<attribute name='sample_outdooractivities' />
<filter type='and'>
<condition attribute='sample_outdooractivities' operator='not-contain-values'>
<value>2</value>
</condition>
</filter>
</entity>
</fetch>";
FetchExpression doesNotLikeHiking = new FetchExpression(fetchXml);
EntityCollection nonHikers = _serviceProxy.RetrieveMultiple(doesNotLikeHiking);
Console.WriteLine("\nContacts who do not like Hiking");
Console.WriteLine("===============================");
foreach (Contact contact in nonHikers.Entities)
{
string values = (contact["sample_outdooractivities"] == null) ? "null" : contact.FormattedValues["sample_outdooractivities"];
Console.WriteLine("{0} {1}", contact.FullName, values);
}
/* OUTPUT
Contacts who do not like Hiking
===============================
Wayne Yarborough Swimming; Camping
Randal Maple Fishing
Barbara Weber Swimming; Fishing; Boating
Georgette Sullivan Fishing; Hunting; Camping
*/
Créer une liste à sélection multiple avec du code
La manière la plus simple de créer une liste à sélection multiple est d’utiliser l’éditeur d’attribut dans les outils de personnalisation. Informations complémentaires : Créer et modifier des champs
Cependant, si vous devez automatiser la création de ce type d’attribut, vous pouvez utiliser un code C# tel que celui qui suit avec le service d’organisation, qui crée une liste à sélection multiple pour choisir les activités de plein air pour l’entité contact. Pour plus d’informations, consultez Créer des attributs
private const int _languageCode = 1033; //English
MultiSelectPicklistAttributeMetadata outDoorActivitiesAttribute = new MultiSelectPicklistAttributeMetadata()
{
SchemaName = "sample_OutdoorActivities",
LogicalName = "sample_outdooractivities",
DisplayName = new Label("Outdoor activities", _languageCode),
RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
Description = new Label("Outdoor activities that the contact likes.", _languageCode),
OptionSet = new OptionSetMetadata()
{
IsGlobal = false,
OptionSetType = OptionSetType.Picklist,
Options = {
new OptionMetadata(new Label("Swimming",_languageCode),1),
new OptionMetadata(new Label("Hiking",_languageCode),2),
new OptionMetadata(new Label("Mountain Climbing",_languageCode),3),
new OptionMetadata(new Label("Fishing",_languageCode),4),
new OptionMetadata(new Label("Hunting",_languageCode),5),
new OptionMetadata(new Label("Running",_languageCode),6),
new OptionMetadata(new Label("Boating",_languageCode),7),
new OptionMetadata(new Label("Skiing",_languageCode),8),
new OptionMetadata(new Label("Camping",_languageCode),9)}
}
};
CreateAttributeRequest createAttributeRequest = new CreateAttributeRequest
{
EntityName = Contact.EntityLogicalName,
Attribute = outDoorActivitiesAttribute
};
Voir aussi
Présentation des attributs d’entité
Créer une entité à l’aide de l’API web
Interroger les données à l’aide de l’API web
Utilisation des métadonnées d’attributs
Exemple : Utilisation des métadonnées d’attributs
Utiliser les classes d’entité à liaison anticipée pour la création, la mise à jour et la suppression
Hinweis
Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)
Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).
Commentaires
Envoyer et afficher des commentaires pour