如何通过自定义元数据检查Opportunity关联字段的变更情况
用自定义元数据实现Opportunity字段变更检查
步骤1:创建自定义元数据类型
- 新建自定义元数据类型,API名设为
Opportunity_Comparison_Field__mdt - 给该元数据类型添加一个文本类型的字段,API名
Field_API_Name__c(用于存储需要检查的Opportunity字段API名称,比如StageName、Amount等) - 在元数据类型中添加记录,每条记录对应一个需要检查的Opportunity字段
步骤2:改写Apex逻辑
替换原来依赖Field Set的代码,改为查询自定义元数据中的字段列表,再逐一对比新旧记录的字段值:
public static boolean isValuesChanged(List<Opportunity> newOpportunitiesList, Map<Id, Opportunity> oldOpportunityMap) { // 查询自定义元数据中配置的需要检查的字段 List<Opportunity_Comparison_Field__mdt> comparisonFields = [ SELECT Field_API_Name__c FROM Opportunity_Comparison_Field__mdt ]; // 遍历所有待检查的Opportunity记录 for (Opportunity oppNew : newOpportunitiesList) { Opportunity oppOld = oldOpportunityMap.get(oppNew.Id); // 保留原逻辑中的Amount大于0的判断条件 if (oppNew.Amount <= 0) continue; // 遍历自定义元数据配置的字段 for (Opportunity_Comparison_Field__mdt fieldMeta : comparisonFields) { String fieldApiName = fieldMeta.Field_API_Name__c; Object newValue = oppNew.get(fieldApiName); Object oldValue = oppOld.get(fieldApiName); // 处理值对比:注意null的情况,用equals方法适配所有数据类型 boolean isChanged = false; if (newValue == null && oldValue != null) { isChanged = true; } else if (newValue != null && !newValue.equals(oldValue)) { isChanged = true; } if (isChanged) { return true; } } } return false; }
关键改动说明
- 数据源替换:从Field Set改为查询自定义元数据记录,无需修改页面布局,直接在元数据中增删字段,灵活性更高
- 值对比优化:原代码用
!=处理复杂数据类型(如日期、Lookup字段)时可能不准确,改用equals方法并单独处理null值,确保对比逻辑严谨 - 逻辑一致性:保留了原代码中
Amount > 0的判断条件,以及"只要有一个字段变更就返回true"的核心逻辑
注意事项
- 确保自定义元数据中的
Field_API_Name__c字段值准确对应Opportunity的字段API名(区分大小写) - 若有性能顾虑,可以将自定义元数据的查询结果缓存(比如用静态变量或
@AuraEnabled(cacheable=true)),避免每次调用都查询数据库
内容的提问来源于stack exchange,提问作者unflagged.destination
相关产品推荐
相关产品推荐

