我们的组织有一个CRM安装,我们已经在其上进行了广泛的定制。现在,我正在尝试实施一个解决方案来强制执行业务规则:当程序是开放机会的指定机会时,阻止用户将程序更新为非活动状态。
我知道如何阻止更新;从JavaScript中的false
返回OnSave()
。我还没有找到这种情况。我提出的最好的想法是在CRM中对OData端点进行SOAP调用,但是我在最后一步遇到了一个棘手的问题。 (如果你有更好的想法我完全愿意接受它。)
这是我所拥有的。我可以得到有问题的节目:
programset(guid'thisone')
<子> ... / OrganizationData.svc / uwkc_programSet(GUID&#39; F4D75E9D-3A79-E611-80DA-
C4346BACAAC0&#39)子>
我可以得到相关的名称:
programset(guid'thisone')/program-desig
<子> ... / OrganizationData.svc / uwkc_programSet(GUID&#39; F0D75E9D-3A79-E611-80DA-C4346BACAAC0&#39;)/ uwkc_uwkc_program_uwkc_opportunitydesignation 子>
以及相关的机会:
programset(guid'thisone')/program-desig?$expand=desig-opportunity
<子> ... OrganizationData.svc / uwkc_programSet(GUID&#39; F0D75E9D-3A79-E611-80DA-C4346BACAAC0&#39;)?/ uwkc_uwkc_program_uwkc_opportunitydesignation $扩大= uwkc_opportunity_uwkc_opportunitydesignation 子>
......但现在我有点陷入困境。
我可以在机会(链接+字段)上过滤原始值
...$filter=opp-oppdesig/EstimatedCloseDate gt DateTime('2016-07-01')
<子> ... OrganizationData.svc / uwkc_programSet(GUID&#39; F0D75E9D-3A79-E611-80DA-C4346BACAAC0&#39;)/ uwkc_uwkc_program_uwkc_opportunitydesignation $扩大= uwkc_opportunity_uwkc_opportunitydesignation&安培; $滤波器= uwkc_opportunity_uwkc_opportunitydesignation / EstimatedCloseDate%20GT%20DateTime %272016-07-01%27 子>
我可以过滤指定(字段+值)上的复杂值
...$filter=statecode/Value gt 0
<子> ... OrganizationData.svc / uwkc_programSet(GUID&#39; F0D75E9D-3A79-E611-80DA-C4346BACAAC0&#39;)?/ uwkc_uwkc_program_uwkc_opportunitydesignation $扩大= uwkc_opportunity_uwkc_opportunitydesignation&安培; $滤波器= statecode /值%20GT%200 子>
但是我无法对商机上的复杂值进行过滤(连接+字段+值)
...$filter=opp-oppdesig/statecode/Value gt 0
<子> ... OrganizationData.svc / uwkc_programSet(GUID&#39; F0D75E9D-3A79-E611-80DA-C4346BACAAC0&#39;)?/ uwkc_uwkc_program_uwkc_opportunitydesignation $扩大= uwkc_opportunity_uwkc_opportunitydesignation&安培; $滤波器= uwkc_opportunity_uwkc_opportunitydesignation / statecode /值%20GT %200 子>
没有财产&#39;州代码&#39;存在于类型&#39; Microsoft.Xrm.Sdk.Entity&#39;在 第45位。
如何过滤实体的状态,使其远离我所看到的?或者,如果有更好的方法,防止使用中程序被停用的最佳方法是什么?
答案 0 :(得分:0)
第一个问题是您应该使用属性的架构名称(StateCode
),而不是逻辑名称(statecode
)。
但是,我相信它只会返回另一条错误消息:
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>-2147220989</code>
<message xml:lang="en-US">attributeName</message>
</error>
出于某种原因,似乎对扩展实体中的复杂类型进行过滤对SOAP端点无效。根据我的测试,新的Web API在查询中也不支持这种深度。
您的问题的一个解决方案是只获取所有结果,然后在代码中手动执行过滤。如果你可以假设在这种查询中没有检索到太多相关实体,这当然最有效。另外,请务必使用$select
仅检索必要的属性,因为这会大大减少查询完成所需的时间。
另一种解决方案是使用FetchXML执行查询。这可以通过Web API完成,也可以作为您自己构建的SOAP请求来完成。
第三种解决方案是将您的查询拆分为多个查询,因此您不必在查询中过滤掉两个实体的状态。