0

我正在创建一个实体的虚假实例beep。它有一个类型picklist为的必填字段pickaboobeep首先我省略了它,但由于某些业务逻辑要求所有新创建的实例都分配该字段,因此应用程序开始抱怨向我抛出错误消息。

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”等。

如何以编程方式获得该值?

现在我有一个丑陋的解决方法来获取所有的beeps并从它们中的第一个中获取价值。甚至不要让我开始知道我失去了多少睡眠,知道它看起来多么尴尬,有人会花时间给我一些反馈。:(

4

3 回答 3

3

你有两个选择。

  1. 您可以使用 CrmSrvcUtil 将您的 OptionSetValues 生成为枚举...这将创建一个 pickaboo 枚举,然后您可以在代码中引用该枚举 entity.Attributes.Add("pickaboo", new OptionSetValue((int)pickaboo.YourEnumValue);

  2. 您还可以使用该RetrieveOptionSetRequest消息来获取您感兴趣的特定选项集的所有值的列表。请参阅此 SO question

于 2012-11-09T16:03:46.967 回答
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);
  1. 注意 - 我假设您通过名为proxy.
  2. 在整个代码周围设置一个try/catch,以防万一发生越界异常。
  3. 确保处理 的选项-1,因为Value返回的是一个可为空的整数。
于 2012-11-10T19:37:50.933 回答
1

这个问题启发了我写博客。

如果你看看我下面的帖子,它有一个函数可以用来查找选项列表(全局和本地选项集)、状态码、状态码和布尔(两个选项)字段的 int 值。

CRM 2011 以编程方式查找选项列表、选项集、状态码、状态码和布尔值的值(两个选项)

于 2012-11-10T22:27:21.583 回答