2

请问有没有办法以编程方式访问已在 MS CRM Dynamics 中创建为自定义字段的标签和值字段?

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

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

所以,本质上我想...

  1. 获取可能的 new_producttypesubcodes 列表及其对应的值。
  2. 遍历网站中的产品变体。
  3. 如果产品变体名称与 new_producttypecodes 列表中的任何名称匹配,则添加值 1000000

因此,如果我发现添加到网站的产品并将其标记为“奖杯”并且 CRM 中存在“奖杯”,那么 new OptionSetValue(100000001)

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

谢谢

4

2 回答 2

5

此函数检索本地化到当前用户的可能值的字典。取自:CRM 2011 以编程方式查找选项列表、选项集、状态码、状态码和布尔值(两个选项)的值

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;
}
于 2013-04-29T14:51:21.340 回答
2

是的,这些数据都存储在属性的元数据中(SDK 文章)。您必须检索实体的实体元数据,然后在列表中找到该属性。然后将该属性转换为 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 文章)。

于 2013-04-29T14:08:55.783 回答