我正在创建一个实体beep
的虚假实例。它有一个picklist
类型的必填字段,名为pickaboo
。首先我省略了它,但随后由于某些业务逻辑要求所有新创建的beep
实例分配该字段,应用程序开始向我发送错误消息。
Entity entity = new Entity { LogicalName = "beep" };
Guid guid = proxy.Create(entity);
proxy.Delete("beep", guid);
我没有给出一个啮齿动物的尾部关于这个需求,因为在我创建实例后,我正在删除它。然而,CRM给了一个巨大的啮齿动物,并没有让我做我的魔术。所以,我很聪明,并为缺少的属性添加了一个属性。
OptionSetValue option = new OptionSetValue(0);
Entity entity = new Entity { LogicalName = "beep" };
entity.Attributes.Add("pickaboo", option);
Guid guid = proxy.Create(entity);
proxy.Delete("beep", guid);
当然,它不起作用,因为零不是有效值。显然,CRM根据解决方案添加一个哈希值,因此实际的“零”具有数字值,如“846000000000”,实际“一”具有“846000000001”等。
如何以编程方式获取该值?
现在我有一个丑陋的解决方法,获取所有beep
s 并从第一个获取值。甚至不要让我知道多少睡眠我不知道它看起来多么尴尬,是否有人花时间给我一些反馈。 :(
答案 0 :(得分:3)
你有两个选择。
您可以使用CrmSrvcUtil生成您的OptionSetValues作为枚举...这将创建一个pickaboo枚举,然后您可以在您的代码中引用
entity.Attributes.Add("pickaboo", new OptionSetValue((int)pickaboo.YourEnumValue);
您还可以使用RetrieveOptionSetRequest
消息获取您感兴趣的特定选项集的所有值的列表。请参阅this SO question
答案 1 :(得分:1)
由于我知道所有 CRM程序员都是懒猪(自己的经验,哈哈),我知道你更喜欢简短而全面的解决方案。我意识到您正在寻找快速访问只有一个有效值。如果我弄错了,请停止阅读 - 使用@Daryl的建议 - 他对你有一个很好的答案。
但是,如果我是对的,请使用此代码获取第一个有效选项值(前提是它存在)。为了以防万一,请记住用try/catch
包围它,所以如果你拼错了,你最终不会挠头。
RetrieveAttributeRequest request = new RetrieveAttributeRequest
{
EntityLogicalName = "beep",
LogicalName = "pickaboo",
RetrieveAsIfPublished = true
};
RetrieveAttributeResponse response
= proxy.Execute(request) as RetrieveAttributeResponse;
PicklistAttributeMetadata metaData
= response.AttributeMetadata as PicklistAttributeMetadata;
OptionSetValue option
= new OptionSetValue(metaData.OptionSet.Options[0].Value ?? -1);
proxy
的代理建立了有效连接。try/catch
,以防万一发生超出限制的异常。-1
选项,因为返回的Value
是一个可以为空的整数。答案 2 :(得分:1)
这个问题激发了我的博客。
如果你看一下我的帖子,下面有一个函数可以用来查找选项列表(全局和本地选项集),状态代码,状态代码和布尔(两个选项)字段的int值。