Attributs de liste à sélection multiple
Note
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, consultez : 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(00aa00aa-bb11-cc22-dd33-44ee44ee44ee)
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 ContainValues
et 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
.
Note
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