You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动