2017-10-05 134 views
0

我已经创建了更新后触发以下,但我无法把它保存,我不太undetstand为什么它不工作Salesforce的更新后触发

trigger Adhoc_Approval_process_trigger on Ad_Hoc_Approval__c (after update) { 

    list<Ad_Hoc_Approval__c> ladh= new list<Ad_Hoc_Approval__c>(); 
    list<Ad_Hoc_Approval__c> query=[select Status__c,Submitted_for_Approval_Date__c from Ad_Hoc_Approval__c]; 
    for(Ad_Hoc_Approval__c adh : query) 
    { 
     if(adh.Status__c =='Submitted for Approval') 
     { 
      adh.Submitted_for_Approval_Date__c=Date.today(); 
      ladh.add(adh); 
     } 

    } 

    update ladh; 

} 

我也它转换成更新触发之前,它的做工精细,任何人都可以请帮助我了解为什么,

trigger Adhoc_Approval_process_trigger on Ad_Hoc_Approval__c (before update) { 

     for(Ad_Hoc_Approval__c adh : trigger.new) 
     { 
      if(adh.Status__c =='Submitted for Approval') 
      { 
       adh.Submitted_for_Approval_Date__c=Date.today(); 

      } 

     } 



    } 

非常感谢

回答

1

你的意思是无法保存,因为它不编译?呃,看起来很好看,有什么错误?

你的第一个版本最终会成为一个永无止境的循环:)更新 - >更新 - >更新...更不用说查询没有任何WHERE子句,所以它最终会爆炸,一旦你达到10,0001记录...

第二个版本更好:)只适用于当前触发器的范围和“更新前”,你可以免费保存到数据库。

+0

感谢您的回应,如果我错了,请纠正我,您不能在同一对象的后触发器中使用更新DML,但是如果DML更新其他对象,我们应该很好,正确吗? – Sam

+0

通常情况下,您无法获得“无法锁定行”错误。如果你真的需要它,那么有一个窍门,但是确保它不会进入无限循环并最终因违反州长限制而终止是你的工作。但是你可以自由地插入,更新,删除不在'trigger.new'范围内的任何其他对象。 – eyescream

+0

现在有道理,非常感谢 – Sam