使用SF Apex更新表兄弟对象的记录

时间:2013-05-28 19:46:06

标签: salesforce apex-code

我们有一个由几乎完全自定义的对象组成的应用程序。为我们的用户创建流畅的工作流程对于此应用至关重要。我是apex的新手,但熟悉基本的代码编写。

以下是对象之间的关系:( - < = 1到很多,M / D =主/细节)

Object_a - < Object_b --M / D - < Object_c; Object_a - M / D - < Object_d

当用户在Object_c上填充日期字段并保存时,我们希望Object_d上的所有相关记录上的日期字段(即该特定Object_a记录的所有Object_d记录)都要使用相同的值进行更新。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您需要在Object_c的插入/更新上编写触发器,因为工作流规则无法在更新多个对象时触发,汇总汇总字段也无济于事(主要细节未在任何地方设置) )。

在深入研究编码之前,请考虑如果您同时修改了多个Object__c会发生什么(例如,使用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;