列举一些比较重要的点,有新增会更新:
1.更新对象本身时使用注意事项:
案例需求:对象ObjA与对象ObjeB,对想ObjA在新增记录时会与ObjB进行匹配,然后更新ObjB的状态与ObjA的状态。
对于以上需求,我们定然需要通过已有的A对象的匹配值作为条件去查询B对象的所有记录,我在编写改代码的时候最终对对象A与B都执行了Update ,使用的是before触发器。
//更新对象A
if(ObjAs.size()>0){
update ObjAs;
}
//更新对象B
if(ObjBs.size()>0){
update ObjBs;
}
于是乎就报错了,提示无法更新。于是我更换成after触发器,给出了相同的报错信息。于是我就觉得很奇怪,为什么无法更新?
那么问题在于我这里不应该去对对象A再次执行DML操作,于是我查阅了相关资料,发现,before触发器中,可以通过重新赋值直接更新,不需要进行DML操作。于是注释掉 update ObjAs;于是就没有报错了,对象A也可以正常得到更新。
2.对于问题1,如果我将before替换为after,如何更新呢
测试:
更新CustomsDeclaration__c
public static void selfUp(List<CustomsDeclaration__c> newList){
List<CustomsDeclaration__c> ccds = new List<CustomsDeclaration__c>();
if(Trigger.isUpdate){
for(CustomsDeclaration__c cd:newList){
cd.Name = 'test2';
ccds.add(cd);
}
update ccds;
}
}
报错:
更改代码:
public static void selfUp(List<CustomsDeclaration__c> newList){
//List<CustomsDeclaration__c> ccds = new List<CustomsDeclaration__c>();
if(Trigger.isUpdate){
for(CustomsDeclaration__c cd:newList){
cd.Name = 'test2';
}
}
}
将beforeTrigger更改为afterTrigger
执行以上代码,仍然不会报错。
所以Trigger.new 这与Before和after并无关系,只是在Trigger.new中对对象本身是不需要使用DML操作的。
3.避免trigger的触发
可以新建复选框字段CheckBox ,判断TRUE OR FALSE 的方式去控制是否触发Trigger