Dynamics CRM - 访问自定义产品选项价值

时间:2013-04-29 12:57:13

标签: dynamics-crm-2011

有没有办法以编程方式访问Label&是否已在MS CRM Dynamics中创建为自定义字段的值字段?

我添加了一个名为“new_producttypesubcode”的自定义字段,例如,有两个选项,Trophy = 1000000和Kit = 10000001。

我正在编写一个导入实用程序,用于镜像客户网站和他们的CRM之间的产品,我希望获得CRM中所有可能的产品选项列表,以查看它们是否在网站中匹配。

所以,实质上我想......

  1. 获取可能的new_producttypesubcodes列表及其对应的值。
  2. 浏览网站上的产品变体。
  3. 如果产品变体名称与new_producttypecodes列表中的任何名称匹配,则添加值1000000
  4. 因此,如果我发现某个产品已添加到网站并且其标记为“Trophy”并且“Trophy”存在于CRM中,那么新的OptionSetValue(100000001)

    我希望这是有道理的......

    由于

2 个答案:

答案 0 :(得分:5)

此函数检索本地化为当前用户的可能值的字典。取自:CRM 2011 Programatically Finding the Values of Picklists, Optionsets, Statecode, Statuscode and Boolean (Two Options)

static Dictionary<String, int> GetNumericValues(IOrganizationService service, String entity, String attribute)
{
    RetrieveAttributeRequest request = new RetrieveAttributeRequest
    {
        EntityLogicalName = entity,
        LogicalName = attribute,
        RetrieveAsIfPublished = true
    };

    RetrieveAttributeResponse response = (RetrieveAttributeResponse)service.Execute(request);

    switch (response.AttributeMetadata.AttributeType)
    {
        case AttributeTypeCode.Picklist:
        case AttributeTypeCode.State:
        case AttributeTypeCode.Status:
            return ((EnumAttributeMetadata)response.AttributeMetadata).OptionSet.Options
                .ToDictionary(key => key.Label.UserLocalizedLabel.Label, option => option.Value.Value);

        case AttributeTypeCode.Boolean:
            Dictionary<String, int> values = new Dictionary<String, int>();

            BooleanOptionSetMetadata metaData = ((BooleanAttributeMetadata)response.AttributeMetadata).OptionSet;

            values[metaData.TrueOption.Label.UserLocalizedLabel.Label] = metaData.TrueOption.Value.Value;
            values[metaData.FalseOption.Label.UserLocalizedLabel.Label] = metaData.FalseOption.Value.Value;

            return values;

        default:
            throw new ArgumentOutOfRangeException();
    }
}

因此,您需要执行以下操作:

Dictionary<String, int> values = GetNumericValues(proxy, "your_entity", "new_producttypesubcode");

if(values.ContainsKey("Trophy"))
{
    //Do something with the value
    OptionSetValue optionSetValue = values["Trophy"];
    int value = optionSetValue.Value;
}

答案 1 :(得分:2)

是的,该数据全部存储在属性(SDK article)的元数据中。您必须检索实体的实体元数据,然后在列表中查找该属性。然后将该属性强制转换为PicklistAttributeMetadata对象,它将包含一个选项列表。我要提到的是,通常从CRM中检索元数据是一项昂贵的操作,因此请考虑缓存。

private static OptionSetMetadata RetrieveOptionSet(IOrganizationService orgService,
    string entityName, string attributeName)
{
    var entityResponse = (RetrieveEntityResponse)orgService.Execute(
        new RetrieveEntityRequest 
            { LogicalName = entityName, EntityFilters = EntityFilters.Attributes });

    var entityMetadata = entityResponse.EntityMetadata;

    for (int i = 0; i < entityMetadata.Attributes.Length; i++)
    {
        if (attributeName.Equals(entityMetadata.Attributes[i].LogicalName))
        {
            if (entityMetadata.Attributes[i].AttributeType.Value == 
                    AttributeTypeCode.Picklist)
            {
                var attributeMD = (PicklistAttributeMetadata)
                    entityMetadata.Attributes[i];

                return attributeMD.OptionSet;
            }
        }
    }

    return null;
}

以下是使用上述调用将选项写入控制台的方法。

var optionSetMD = RetrieveOptionSet(orgService, "account", "accountcategorycode");
var options = optionSetMD.Options;

for (int i = 0; i < options.Count; i++)
{
    Console.WriteLine("Local Label: {0}.  Value: {1}",
        options[i].Label.UserLocalizedLabel.Label,
        options[i].Value.HasValue ? options[i].Value.Value.ToString() : "null");
}

我相信这也适用于全局选项集属性,但是如果你知道它是一个全局选项集,则会有一个不同的消息可能会更高效(SDK article)。