在 salesforce 中,如何创建两个具有相似字段的同步对象

问题描述 投票:0回答:2

如何创建两个对象 Obj1 和 Obj2 具有相似的字段。在创建 Obj1 记录时,应创建关联的 Obj2 记录,反之亦然。此外,更新也应该同步,即更新 Obj1 应反映在 Obj2 中,反之亦然。

apex salesforce-lightning
2个回答
0
投票

创建具有相似字段的对象 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:

  • 使用主详细信息关系字段将一个 obj1 作为父级,将 obj2 作为子级。

0
投票

如果没有必要的预防措施,两个对象上都有两个触发器将导致触发器递归(无限循环),并且您将收到 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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.