【问题标题】:Apex trigger firing on dynamically referenced fields from Custom MetadataApex 触发器触发来自自定义元数据的动态引用字段
【发布时间】:2022-01-04 17:36:52
【问题描述】:

我在尝试这个当前问题时遇到了技能墙。我有一个自定义对象 (Acq__c),其中包含一系列对用户的查找字段。当这些字段更新时,特定的相关子对象会更新以反映新的关联用户。这个初始部分很好。但是,需要能够扩展此功能适用的字段。因此,如果构建了一个新的 LookUp 字段 - 它可以很容易地被授予相同的功能。我希望通过使用自定义元数据类型来做到这一点。在这种情况下,控制更新功能的触发器将查询自定义元数据类型记录,查找 Acq__c 对象上应具有此更新功能的所有字段,测试它们是否已在 DML 语句中更新,然后适当地触发基于哪些已更新。这将允许任何用户在未来创建新的查找,将它们添加到 Acq__c 对象,然后更新元数据以将触发器扩展到新字段。

触发器、更新等的直接部分 - 我没有任何问题。一旦我查询自定义元数据并有一个记录列表,每个记录都包含 Acq__c 对象上一个字段的 API - 我不确定如何使用此记录列表来查看哪些字段已更新,然后相应地需要触发子对象更新。

我希望所有这些都是有道理的 - 任何帮助都将不胜感激。

没有

【问题讨论】:

    标签: triggers salesforce apex


    【解决方案1】:

    自定义元数据可能有点矫枉过正,看看fieldsets?它们现在有点像遗物了(它们在 Visualforce 页面中非常有用,在 LWC 中没有那么多)但仍然 - 它们会“更靠近”被更改的对象,管理员更有可能不会忘记更改它们。

    获得字段 API 名称列表(或集合)后,您可以遍历您的 trigger.new。类似的东西

    Set<String> watchedFields = new Set<String>();
    for(Schema.FieldSetMember fsm : sObjectType.Acq__c.FieldSets.MyFieldsetNameHere.getFields()){
        watchedFields.add(fsm.getFieldPath());
    }
    System.debug(watchedFields);
    Map<Id, Acq__c> recordsWithKeyFieldsChanged = new Map<Id, Acq__c>();
    
    for(Acq__c acq : trigger.new){
        Acq__c old = trigger.oldMap.get(acq.Id);
        for(String field : watchedFields){
            if(acq.get(field) != old.get(field)){
                recordsWithKeyFieldsChanged.add(acq);
                break;
            }
        }
    }
    System.debug(recordsWithKeyFieldsChanged);
    if(!recordsWithKeyFieldsChanged.isEmpty()){
        doSomething(recordsWithKeyFieldsChanged);
    }
    

    它是一个循环中的循环,所以不是很好,但如果不制作一个巨大的硬编码 if 语句,这样做会很棘手。最坏的情况是,200 条记录乘以多少字段? 〜10?限制是 40 个“自定义关系字段”,所以不是世界末日。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 2014-12-04
      • 2012-08-12
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多