有没有办法以编程方式访问Label&是否已在MS CRM Dynamics中创建为自定义字段的值字段?
我添加了一个名为“new_producttypesubcode”的自定义字段,例如,有两个选项,Trophy = 1000000和Kit = 10000001。
我正在编写一个导入实用程序,用于镜像客户网站和他们的CRM之间的产品,我希望获得CRM中所有可能的产品选项列表,以查看它们是否在网站中匹配。
所以,实质上我想......
因此,如果我发现某个产品已添加到网站并且其标记为“Trophy”并且“Trophy”存在于CRM中,那么新的OptionSetValue(100000001)
我希望这是有道理的......
由于
答案 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)。