2016-08-10 3 views
1

애프터 트리거에서 오류가 발생하는 데 문제가 있습니다. 오류를 한 가지 방법으로 발생시킬 수는 있지만 다른 이유는 알 수 없습니다. 내가 한 가지 예를 들어 보겠다.After 트리거에서 오류 발생 문제

다음 트리거가 실패하고 다음과 같은 오류가 발생합니다 :

Error:Apex trigger tstTrigger2 caused an unexpected exception, contact your administrator: tstTrigger2 : execution of AfterUpdate caused by: System.FinalException: SObject row does not allow errors: Trigger.tstTrigger2 : line 19, column 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'); 

    }  

} 

그러나 오류를 제기 이런 식으로 작동합니다. 적어도이 테스트 시나리오에서는 항상 키 집합에 오직 하나의 레코드 만 있다는 점에 유의하십시오.

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

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'); 
    } 
} 

첫 번째 코드 싹둑 해결됩니다 오류가에 플래그를 허용하지 않습니다 그들은 이미 데이터베이스에 커밋 된 그 시간에 의해 records

+0

삽입을 롤백하려고하지 않습니다. 이것은 오류를 발생시키고 스크립트의 실행을 중지하는 것입니다. 미안, 나는 아직 내가 꽤 이해하고 있다고 생각하지 않는다. 귀하의 스크립트는 이것이 대 광산에서 작동 할 수있게합니다. 'accountmap.get'함수가 오류를 적용 할 계정을 단순히 반환하지 않습니까? 나는 이것이 내가 포함하는 루프가하는 똑같은 일이라고 가정한다. 감사! – tchock

+0

.addError는 삽입 전/후에 업데이트 트리거에서 Trigger.new에서, 그리고 삭제 전 목록에서는 Trigger.old에서 호출 할 수 있습니다. 이 값을 다른 sObject에 추가 할 수 없으므로 SObject 행에서 오류를 허용하지 않는다는 오류가 표시됩니다. 이것은 어려운 예입니다. 당신이 업데이트하는 모든 계정 하나 하나를 잘못 사용 했더라도, 당신이 테스트 한 것일 뿐이므로, 당신이 뭘하려고하는지 모릅니다. – EricSSH

+0

나는 이것이 혼란이있는 곳이라고 생각합니다. 이 오류는 다른 sObject를 업데이트 할 수 없다는 것을 알려주지 만 한 sObject 만 업데이트하려고합니다. 나는 이것이 다른 Account 레코드를 참조하고 있다고 가정하고 있지만 이것은 트리거 (맵?)보다는 계정을 업데이트하려는 의미에서 다른 sObject를 나타낼 수 있습니까? 그게 나에게 더 의미가 있습니다. 나는 올바른 길을 가고 있는가? :) – tchock

관련 문제