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

Dynamics crm 2011 Dynamics CRM-访问自定义产品选项值,dynamics-crm-2011,Dynamics Crm 2011,是否有方法以编程方式访问已在MS CRM Dynamics中创建为自定义字段的标签和值字段 我添加了一个名为“new_producttypesubcode”的自定义字段,例如,它有两个选项,Trophy=1000000和Kit=10000001 我正在编写一个导入实用程序,用于在客户网站和他们的CRM之间镜像产品,我希望获得CRM中所有可能的产品选项的列表,以查看它们在网站中是否匹配 所以,本质上我想 获取可能的新\u ProductTypeSubcode及其相应值的列表 反复浏览网站中的产品变

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

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

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

所以,本质上我想

  • 获取可能的新\u ProductTypeSubcode及其相应值的列表
  • 反复浏览网站中的产品变体
  • 如果产品变体名称与新产品类型代码列表中的任何名称匹配,则添加值1000000
  • 因此,如果我发现一个产品添加到网站上,并在CRM中标记为“Trophy”和“Trophy”,则新选项SetValue(100000000001)

    我希望这是有道理的


    谢谢

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

    私有静态选项SetMetadata RetrieveOptionSet(IOOrganizationService orgService,
    字符串entityName,字符串attributeName)
    {
    var entityResponse=(RetrieveEntityResponse)orgService.Execute(
    新检索实体请求
    {LogicalName=entityName,EntityFilters=EntityFilters.Attributes});
    var entityMetadata=entityResponse.entityMetadata;
    for(int i=0;i
    下面是如何使用上述调用将选项写入控制台

    var optionSetMD=retrieveoptionstart(orgService,“account”,“accountcategorycode”);
    var options=optionSetMD.options;
    for(int i=0;i

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

    此函数将检索一个可能的值字典,这些值是当前用户的局部值。摘自:

    静态字典GetNumericValues(IOOrganizationService服务、字符串实体、字符串属性)
    {
    RetrieveAttributeRequest请求=新建RetrieveAttributeRequest
    {
    EntityLogicalName=实体,
    LogicalName=属性,
    RetrieveAsIfPublished=true
    };
    RetrieveAttributeResponse响应=(RetrieveAttributeResponse)服务。执行(请求);
    开关(response.AttributeMetadata.AttributeType)
    {
    案例属性Specode.Picklist:
    案例属性Specode.State:
    案例属性Specode.状态:
    return((EnumAttributeMetadata)response.AttributeMetadata.OptionSet.Options
    .ToDictionary(key=>key.Label.UserLocalizedLabel.Label,option=>option.Value.Value);
    case AttributeTypeCode.Boolean:
    字典值=新字典();
    BooleanOptionSetMetadata元数据=((BooleanAttributeMetadata)response.AttributeMetadata).OptionSet;
    值[metaData.TrueOption.Label.UserLocalizedLabel.Label]=metaData.TrueOption.Value.Value;
    值[metaData.FalseOption.Label.UserLocalizedLabel.Label]=metaData.FalseOption.Value.Value;
    返回值;
    违约:
    抛出新ArgumentOutOfRangeException();
    }
    }
    
    因此,您需要执行以下操作:

    Dictionary values=GetNumericValues(代理,“您的实体”、“新的产品类型子代码”);
    if(价值观。容器(“奖杯”))
    {
    //做一些有价值的事情
    OptionSetValue OptionSetValue=值[“奖杯”];
    int value=optionSetValue.value;
    }
    
    optionset是全局的还是本地的?对于全局optionset,必须使用RetrieveOptionSetRequest类;对于本地optionset,还可以使用RetrieveAttributeRequest类。另外,如果只检查代码中的一种语言,最好通过LocalizedLabels属性检查所有标签。RetrieveAttributeRequest更合适。我忘了。但是,我刚刚验证了具有全局选项集的属性在上面的代码中是否有效。是的,您是对的,RetrieveOptionSetRequest对于全局optionset不是必需的,很抱歉我的不准确,因为我总是将该类用于全局optionset。