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
相关产品推荐
相关产品推荐

