您需要在插入/更新时编写触发器,Object_c
因为工作流规则无法在更新多个对象时触发,并且汇总汇总字段无济于事(并非在所有地方设置主详细信息)。
在深入研究编码之前,请考虑如果您Object__c
同时修改超过 1 个会发生什么(例如,使用 Data Loader,通过与某些外部系统或其他代码段集成)。如果您有 2 条记录都与同一条记录相关,Object_A
并且一条记录为“今天”,而另一条记录为“今天 + 7”,那么哪个值应该“获胜”?
解决它的一种方法是从Object_A
要设置的 ID 和日期值的映射开始。我将构建地图的方式意味着我将继续覆盖重复 id 的值,这不是您可能需要的(可能选择稍后的日期?)。
Map<Id, Date> datesToSet = new Map<Id, Date>(); // you could make it Map<Id, Object_C__c> too, principle would be similar
for(Object_C__c c : [SELECT Id, Date_Field__c, Object_B__r.Object_A__c FROM Object_C__c WHERE Id IN :trigger.new AND Object_B__r.Object_A__c != null]){
datesToSet.put(c.dObject_B__r.Object_A__c, c.Date_Field__c);
}
System.debug(datesToSet);
现在我们有了唯一的 A id 和值的映射,我们应该将其应用于所有子 D 记录。
List<Object_D__c> childsToUpdate = [SELECT Id, Some_Other_Date_Field__c, Object_A__c FROM Object_D__c WHERE Object_A__c IN :datesToSet.keyset()];
System.debug('BEFORE: ' + childsToUpdate);
for(Object_D__c d : childsToUpdate){
d.Some_Other_Date_Field__c = datesToSet.get(d.Object_A__c);
}
System.debug('AFTER: ' + childsToUpdate);
update childsToUpdate;