在触发后发出错误的问题

时间:2016-08-10 18:20:35

标签: error-handling triggers salesforce

我在后触发器中出现错误问题,而且我没有看到任何可以单向提出错误的原因,而不是另一方面。我举个例子。

以下触发器将失败并引发以下错误:

  

错误:Apex触发器tstTrigger2导致意外异常,联系   您的管理员:tstTrigger2:执行AfterUpdate导致:   System.FinalException:SObject行不允许错误:   Trigger.tstTrigger2:第19行,第1列

trigger tstTrigger2 on Account (after update) 
{  


    Set<Id> AccountIds = Trigger.newMap.keySet();


    List<Account > accountsToProcess = [Select Id, Name from Account Where Id IN : AccountIds];


    for(Account act: accountsToProcess)
    {

        act.addError('doesn't work');

    }    

}

然而,以这种方式引发错误是有效的。请注意,密钥集中始终只有1条记录,至少在此测试场景中是这样。

trigger tstTrigger on Account (after update) 
{  


    Set<Id> AccountIds = Trigger.newMap.keySet();


    List<Account > accountsToProcess = [Select Id, Name from Account Where Id IN : AccountIds];


    Trigger.new[0].addError('However, this works?');

}

对于为什么第一个失败而第二个失败的任何解释都非常感谢。同样,如果你能指出我实现这一目标的最佳方式,那么它将被批量化,这将是非常好的。谢谢!

1 个答案:

答案 0 :(得分:1)

addError()不会回滚您的插入,只会阻止脚本的进一步执行,因此如果您在UI上抛出错误,则永远不会插入数据。

通过这样做

Trigger.new[0].addError('However, this works?');

你只是在列表中的第一条记录上抛出错误,从而停止任何处理。

这样的东西将解决你的第一个代码片段

trigger tstTrigger2 on Account (after update) 
{
   Map<ID, Account> accountMap = Trigger.newMap;

   for(ID act: accountMap.keySet())
   {
      accountMap.get(act).addError('doesnt work');
   }   
}

您正在查询帐户ID并且到那时他们已经提交到数据库,这将不允许在记录上标记错误