Dynamics 365 CRM自定义实体子网格多查找字段过滤实现咨询
解决CRM子网格多查找字段OR过滤的两种方案
你遇到的这个问题很常见,CRM默认的子网格过滤确实只支持单字段,但我们有两种可靠的方式实现你要的field1=*** OR field2=*** OR field3=***逻辑,下面给你详细拆解:
方案一:表单加载JavaScript实现(推荐,无需导出导入解决方案)
这种方式灵活度高,不用折腾解决方案打包导入,直接在表单的加载事件里写代码就能实现:
步骤说明:
- 编写过滤逻辑的JS函数,获取当前记录ID,构建包含OR条件的Fetch XML
- 将函数绑定到表单的
OnLoad事件 - 发布自定义项生效
示例代码(适配Unified Interface):
function filterMultiFieldSubgrid(executionContext) { // 获取表单上下文(新版UI必须用这个) const formContext = executionContext.getFormContext(); // 获取当前表单记录的ID(去掉大括号) const currentRecordId = formContext.data.entity.getId().replace(/[{}]/g, ""); // 获取目标子网格控件 const subgridControl = formContext.getControl("your_subgrid_logical_name"); if (subgridControl) { // 构建带OR条件的Fetch XML,替换成你的实体和字段逻辑名 const fetchXml = ` <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"> <entity name="your_sub_entity_logical_name"> <!-- 保留子网格原本的列配置,这里只加过滤条件 --> <attribute name="sub_entity_field1" /> <attribute name="sub_entity_field2" /> <!-- 你的OR过滤条件 --> <filter type="or"> <condition attribute="field1_logical_name" operator="eq" value="${currentRecordId}" /> <condition attribute="field2_logical_name" operator="eq" value="${currentRecordId}" /> <condition attribute="field3_logical_name" operator="eq" value="${currentRecordId}" /> </filter> </entity> </fetch> `; // 设置子网格的Fetch XML并刷新 subgridControl.setParameter("fetchXml", fetchXml); subgridControl.refresh(); } }
使用注意:
- 替换代码中的
your_subgrid_logical_name(子网格的逻辑名称,在表单设计里查看)、your_sub_entity_logical_name(子实体的逻辑名)、field1_logical_name等三个查找字段的逻辑名 - 在表单设计器中绑定
OnLoad事件时,一定要勾选传递执行上下文的选项 - 如果是旧版经典界面,可把
executionContext相关代码换成Xrm.Page,但更推荐适配新版UI的写法
方案二:修改Fetch XML后导入解决方案
如果不想用JS,也可以直接修改子网格的Fetch XML,通过导出导入解决方案实现:
步骤说明:
- 导出包含该表单的未托管解决方案(一定要选未托管,方便后续修改)
- 解压下载的解决方案压缩包,找到
customizations.xml文件 - 在文件中搜索子网格的名称,找到对应的
<grid>节点,替换里面的<fetch>内容为带OR条件的XML - 重新把解决方案文件打包成ZIP(注意保持原目录结构)
- 导入回CRM,然后发布所有自定义项
示例Fetch XML片段:
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"> <entity name="your_sub_entity_logical_name"> <attribute name="sub_entity_field1" /> <attribute name="sub_entity_field2" /> <filter type="or"> <condition attribute="field1_logical_name" operator="eq" value="{entityLogicalName(id)}" /> <condition attribute="field2_logical_name" operator="eq" value="{entityLogicalName(id)}" /> <condition attribute="field3_logical_name" operator="eq" value="{entityLogicalName(id)}" /> </filter> </entity> </fetch>
使用注意:
- 这里的
{entityLogicalName(id)}是CRM的占位符,会自动替换为当前父记录的ID,替换成你的父实体逻辑名即可(比如{account(id)}) - 修改XML时要注意格式正确,避免语法错误导致导入失败
总结
- 优先选方案一,开发和维护都更简单,不需要动解决方案
- 如果是需要固定过滤规则且不想依赖JS,再用方案二
内容的提问来源于stack exchange,提问作者Morteza




