Кастомизация
06
Фев
0

Возвращение текстового значения пиклиста

.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);
}



Комментарии (0)

*

code