애프터 트리거에서 오류가 발생하는 데 문제가 있습니다. 오류를 한 가지 방법으로 발생시킬 수는 있지만 다른 이유는 알 수 없습니다. 내가 한 가지 예를 들어 보겠다.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?');
}
첫 번째 오류가 발생한 이유와 두 번째 오류가 아닌 이유에 대한 설명. 또한, 이것을 구현하기위한 최선의 방법을 지적 해 주시면 큰 일이 될 것입니다. 감사!
삽입을 롤백하려고하지 않습니다. 이것은 오류를 발생시키고 스크립트의 실행을 중지하는 것입니다. 미안, 나는 아직 내가 꽤 이해하고 있다고 생각하지 않는다. 귀하의 스크립트는 이것이 대 광산에서 작동 할 수있게합니다. 'accountmap.get'함수가 오류를 적용 할 계정을 단순히 반환하지 않습니까? 나는 이것이 내가 포함하는 루프가하는 똑같은 일이라고 가정한다. 감사! – tchock
.addError는 삽입 전/후에 업데이트 트리거에서 Trigger.new에서, 그리고 삭제 전 목록에서는 Trigger.old에서 호출 할 수 있습니다. 이 값을 다른 sObject에 추가 할 수 없으므로 SObject 행에서 오류를 허용하지 않는다는 오류가 표시됩니다. 이것은 어려운 예입니다. 당신이 업데이트하는 모든 계정 하나 하나를 잘못 사용 했더라도, 당신이 테스트 한 것일 뿐이므로, 당신이 뭘하려고하는지 모릅니다. – EricSSH
나는 이것이 혼란이있는 곳이라고 생각합니다. 이 오류는 다른 sObject를 업데이트 할 수 없다는 것을 알려주지 만 한 sObject 만 업데이트하려고합니다. 나는 이것이 다른 Account 레코드를 참조하고 있다고 가정하고 있지만 이것은 트리거 (맵?)보다는 계정을 업데이트하려는 의미에서 다른 sObject를 나타낼 수 있습니까? 그게 나에게 더 의미가 있습니다. 나는 올바른 길을 가고 있는가? :) – tchock