You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Model-driven应用:计算多数关联项对应的Lookup值实现方案咨询

实现方案(Dataverse/模型驱动应用端JavaScript)

1. 触发时机说明

代码需要绑定到Routine表单的两个触发节点:

  • 表单OnLoad事件:打开已保存的Routine记录时自动计算等级
  • 关联Dancers子网格的OnRecordAssociated、OnRecordDisassociated事件:添加/移除舞者时实时触发重算

2. 核心实现代码

// 计算Routine关联舞者的多数等级并赋值给Routine Level lookup字段
async function calculateRoutineLevel(executionContext) {
    const formContext = executionContext.getFormContext();
    const routineId = formContext.data.entity.getId().replace(/[{}]/g, "");
    // 下方配置项请替换为你环境中对应实体、字段、关系的逻辑名称
    const CONFIG = {
        ROUTINE_ENTITY_NAME: "crxxx_routine",
        DANCER_ENTITY_NAME: "crxxx_dancer",
        LEVEL_ENTITY_NAME: "crxxx_level",
        ROUTINE_LEVEL_FIELD_NAME: "crxxx_routinelevel",
        N_N_RELATIONSHIP_NAME: "crxxx_crxxx_routine_crxxx_dancer"
    };

    try {
        // 查询当前Routine关联的所有舞者及对应等级信息
        const query = `?$expand=${CONFIG.N_N_RELATIONSHIP_NAME}($select=crxxx_levelid;$expand=crxxx_levelid($select=crxxx_name,crxxx_levelid))`;
        const result = await Xrm.WebApi.retrieveRecord(CONFIG.ROUTINE_ENTITY_NAME, routineId, query);
        
        const levelCountMap = {};
        let maxCount = 0;
        let majorityLevel = null;

        // 统计各等级出现次数,筛选占比最高的等级
        result[CONFIG.N_N_RELATIONSHIP_NAME].forEach(dancer => {
            if (!dancer.crxxx_levelid) return; // 跳过未设置等级的舞者
            const levelId = dancer.crxxx_levelid.crxxx_levelid;
            const levelName = dancer.crxxx_levelid.crxxx_name;
            
            levelCountMap[levelId] = (levelCountMap[levelId] || 0) + 1;
            if (levelCountMap[levelId] > maxCount) {
                maxCount = levelCountMap[levelId];
                majorityLevel = {
                    id: levelId,
                    name: levelName,
                    entityType: CONFIG.LEVEL_ENTITY_NAME
                };
            }
        });

        // 赋值给Routine Level字段,无符合条件时清空字段
        formContext.getAttribute(CONFIG.ROUTINE_LEVEL_FIELD_NAME).setValue(majorityLevel ? [majorityLevel] : null);
    } catch (error) {
        console.error("计算Routine等级失败: ", error.message);
    }
}

3. 环境配置说明

  • 先替换代码中CONFIG对象的所有值为你环境对应的实际逻辑名,逻辑名可在Power Apps Maker门户的实体属性页查询
  • 表单绑定步骤:
    • 打开Routine实体的主表单编辑器,上传包含上述代码的JS Web资源并添加到表单库
    • 绑定表单「OnLoad」事件,调用calculateRoutineLevel函数,勾选「将执行上下文作为第一个参数传递」
    • 选中Dancers关联子网格,分别配置「记录关联时」「记录取消关联时」事件,均调用calculateRoutineLevel函数,同样传递执行上下文
    • 保存并发布表单、Web资源的所有更改
  • 特殊逻辑说明:如果多个等级出现次数相同,代码默认取最先达到最高次数的等级,你可以根据业务需求调整平局规则,比如默认取等级更高的Level值。

内容的提问来源于stack exchange,提问作者Tor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:39:04