如何创建两个对象 Obj1 和 Obj2 具有相似的字段。在创建 Obj1 记录时,应创建关联的 Obj2 记录,反之亦然。此外,更新也应该同步,即更新 Obj1 应反映在 Obj2 中,反之亦然。
创建具有相似字段的对象 obj1 和 obj2。 现在使用插入后和更新后事件在两个对象上创建 Apex 触发器,如下所示。
trigger Obj1Trigger on obj1__c (after insert, after update) {
list<obj2__c> recList = new list<obj2__c>();
if(trigger.isAfter){
if(trigger.isInsert || trigger.isUpdate){
for(obj1__c ob : Trigger.new){
obj2__c obj2Rec = new obj2__c();
obj2Rec.name = ob.name;
obj2Rec.field1 = ob.field1;
obj2Rec.field2 = ob.field2;
obj2Rec.field3 = ob.field3;
recList.add(obj2Rec);
}
}
}
}
同样为obj2创建触发器。
您还需要一种将两个对象的记录相互关联的方法。 有两种方式关联相关记录。
方式1:
方式2:
如果没有必要的预防措施,两个对象上都有两个触发器将导致触发器递归(无限循环),并且您将收到 System.LimitException:超出 Apex CPU 时间限制。
为了避免这种情况,我们可以使用带有标志的处理程序类,该标志检查触发器之一是否已启动同步逻辑。这里的想法是,我们只需在 DML 上触发一次触发器,并防止另一个触发器触发,直到同步完成。
首先,创建一个处理程序类,并将静态布尔值初始化为 false。该类还将具有执行同步的方法。每个方法都会将标志设置为 true,以便其他触发器不会尝试同步。
public class HandleSync {
public static Boolean recursion = false;
public static void insert1(List<Obj2__c> newList) {
List<Obj1__c> collectObj1 = new List<Obj1__c>();
for (Obj2__c obj2 : newList) {
Obj1__c obj1 = new Obj1__c();
obj1.aField = obj2.aField;
collectObj1.add(obj1);
}
//Raise the flag before the DML
recursion = true;
insert collectObj1;
}
public static void insert2(List<Obj1__c> newList) {
List<Obj2__c> collectObj2 = new List<Obj2__c>();
for (Obj1__c obj1 : newList) {
Obj2__c obj2 = new Obj2__c();
obj2.aField = obj1.aField;
collectObj2.add(obj2);
}
//Raise the flag before the DML
recursion = true;
insert collectObj2;
}
}
接下来,创建两个触发器。检查是否没有递归,然后调用相应的同步方法。
trigger Obj1Trigger on Obj1__c (after insert) {
if (!HandleSync.recursion) {
HandleSync.insert2(trigger.new);
}
}
trigger Obj2Trigger on Obj2__c (after insert) {
if (!HandleSync.recursion) {
HandleSync.insert1(trigger.new);
}
}