Возвращение текстового значения пиклиста
.Net
В CRM 2011 стало несколько труднее вернуть текстовые значения пиклистов в .Net коде. Раньше они поставлялись вместе с пиклистами, а теперь для того чтобы вернуть текстовые значения (в плагине, например) необходимо обращаться к метаданным. Рассмотрим, как это сделать:
using System; using System.Diagnostics; using System.Linq; using System.ServiceModel; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Metadata; namespace CRM_2011_Plug_in3 { public class MyPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { // Получаемо сервис CRM из контекста IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); // Получаемо объект Target Entity entity = (Entity)context.InputParameters["Target"]; try { /* Функция optionSetLabel принимает четыре параметра; - CRM Service - Имя объекта, в котором находится OptionSet - Имя OptionSet - Числовое значение OptionSet */ string label = optionSetLabel(service, entity.LogicalName, "new_colors", 100000001); // Выводим текстово значение опции 100000001 throw new Exception(label); } catch (FaultException<OrganizationServiceFault> ex) { throw new InvalidPluginExecutionException("An error occurred in the plug-in.", ex); } } private string optionSetLabel(IOrganizationService service, string entityName, string attributeName, int optionSetValue) { // Формируем и выполняем запрос по атрибуту RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest { EntityLogicalName = entityName, LogicalName = attributeName, RetrieveAsIfPublished = true }; RetrieveAttributeResponse attributeResponse = (RetrieveAttributeResponse)service.Execute(attributeRequest); // Получаем текущие значения OptionSet PicklistAttributeMetadata picklistAttributeMetadata = (PicklistAttributeMetadata) attributeResponse.AttributeMetadata; OptionMetadata[] optionList = picklistAttributeMetadata.OptionSet.Options.ToArray(); string label = string.Empty; // Просматриваем значения OptionSet и находим нужное foreach (OptionMetadata option in optionList) { if (option.Value == optionSetValue) label = option.Label.UserLocalizedLabel.Label; } return label; } } }
JavaScript
Теперь то же самое, только с JavaScript. Ниже следующий JS-код вернет Вам текстовое значение опции по указанному объекту, пиклисту и числовому значению опции.
Только чтобы использовать этот код, Вам также нужно будет подключить к форме следующую библиотеку из SDK: sdk\samplecode\js\soapforjscript\soapforjscript\scripts\sdk.metadata.js
function RetrieveOptionsetLabel() { var entity = "account"; // Имя объекта var attribute = "new_colors"; // Имя пиклиста var value = 100000001; // Значение пиклиста, тектовое значение которого необходимо вернуть // Вызываем Metadata сервис, чтобы получить текстовое значение пиклиста. SDK.MetaData.RetrieveEntityAsync( SDK.MetaData.EntityFilters.Attributes, entity, null, false, function (entityMetadata) { var label = successRetrieveEntity(entityMetadata, attribute, value); alert(label); // Выводим текстовое значение опции пиклиста }, errorDisplay ); } // Функция вызывается при успешном выполнеии запроса function successRetrieveEntity(entityMetadata, attribute, value) { // Просматриваем атрибуты объекта for (var i = 0; i < entityMetadata.Attributes.length; i++) { var AttributeMetadata = entityMetadata.Attributes[i]; // Если просматриваемый атрибут равен искомому... if (AttributeMetadata.SchemaName.toLowerCase() == attribute.toLowerCase()) { // Просматриваем его значения... for (var o = 0; o < AttributeMetadata.OptionSet.Options.length; o++) { var option = AttributeMetadata.OptionSet.Options[o]; // Если искомое значение найдено... if (option.OptionMetadata.Value == value) // Возвращаем результат return option.OptionMetadata.Label.UserLocalizedLabel.Label; } } } } // Функция вызывается при неудачном выполнеии запроса function errorDisplay(XmlHttpRequest, textStatus, errorThrown) { alert(errorThrown); }