0

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

以下是对象之间的关系:(--< = 1 to many, M/D = Master/Detail)

Object_a --< Object_b --M/D--< Object_c; 对象_a --M/D--< 对象_d

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

任何帮助表示赞赏。

4

1 回答 1

0

您需要在插入/更新时编写触发器,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;
于 2013-05-28T22:29:50.450 回答