Вы используете after update
, поэтому вы получаете новые значения в каждом sObject. Если вы хотите повлиять на старую учетную запись, назначенную для какой-либо заново отобранной возможности, вам также нужно взглянуть на значение в Trigger.old
или Trigger.oldMap
.
. Способ сделать это добавьте здесь чек:
for(Opportunity opp : opport){
if(opp.AccountId != null){
accIds.add(opp.AccountId);
}
}
, чтобы найти переопределенную возможность (opp.AccountId != Trigger.oldMap.get(opp.Id).AccountId
) и повлиять на эту учетную запись.
Ниже приведена отдельная проблема: эта логическая ветвь явно неправильно.
}else if(accOpportMap.get(accId).size() == 0){
accUpdateList.add(new Account(isTopOpportunity__c = NULL, id = NULL));
}
Вы не можете update
и Account
, чей Id
равен null
, и это приведет к исключению.
Вам также необходимо выполнить сброс flag
до true
после выполнения обновлений, иначе у вашего триггера будут очень запутанные и трудные для отладки крайние случаи, когда несколько операций DML выполняются в одной транзакции.