Не в состоянии сделать перевоспитание в этом вопросе. Если возможность удаляется из учетной записи, ее следует удалить из поля поиска учетной записи. - PullRequest
0 голосов
/ 12 января 2020

проблема в переучивании. В этом вопросе мне нужно найти наибольшую возможность по сумме и поместить в поле поиска учетной записи, которое работает, но когда я меняю учетную запись возможности, она остается в поле поиска учетной записи. Может кто-нибудь, пожалуйста, исправьте это, если я ошибаюсь

public class TopOpportunityClass{
    public static boolean flag = true;
    public static void onTopOpportunity(List<Opportunity> opport){
        if(flag==true){
            List<Opportunity> uptOpp = new List<Opportunity>();

            Set<Id> accIds = new Set<Id>();
            for(Opportunity opp : opport){
                if(opp.AccountId != null){
                    accIds.add(opp.AccountId);
                }
            }

            Map<Id, List<Opportunity>> accOpportMap = new Map<Id, List<Opportunity>>();
            List<Account> accUpdateList = new List<Account>();
            for(Opportunity obj : [SELECT id,name, amount,accountId
                                   FROM Opportunity
                                   WHERE accountId IN :accIds ORDER BY amount DESC nulls last]){

                                       List<Opportunity> oppList;
                                       if(accOpportMap.containsKey(obj.accountId)){
                                           oppList = accOpportMap.get(obj.accountId);
                                       }else{
                                           oppList = new List<Opportunity>();
                                       }
                                       oppList.add(obj);
                                       accOpportMap.put(obj.accountId, oppList);
                                   }
            for(Id accId : accOpportMap.keySet()){
                if(accOpportMap.get(accId).size() > 1 ){
                    opportunity opp1 = new opportunity(id = accOpportMap.get(accId)[1].id , isTopOpportunityCheck__c = false);
                    uptOpp.add(opp1);
                    accUpdateList.add(new Account(id = accId, isTopOpportunity__c = accOpportMap.get(accId)[0].id));
                    opportunity opp = new opportunity(id = accOpportMap.get(accId)[0].id , isTopOpportunityCheck__c = true);
                    uptOpp.add(opp);

                }else if(accOpportMap.get(accId).size() == 1 ){
                    accUpdateList.add(new Account(id = accId, isTopOpportunity__c = accOpportMap.get(accId)[0].id));
                    opportunity opp = new opportunity(id = accOpportMap.get(accId)[0].id , isTopOpportunityCheck__c = true);
                    uptOpp.add(opp);


                }else if(accOpportMap.get(accId).size() == 0){
                    accUpdateList.add(new Account(isTopOpportunity__c = NULL, id = NULL));
                }
                flag = false;
            }
            if(!accUpdateList.isEmpty()){
                update accUpdateList;
                update uptOpp;
            }
        }
    }
}
//trigger
trigger OpportunityTrigger on Opportunity (after insert, after update){
    if(Trigger.isAfter){
        TopOpportunityClass.onTopOpportunity(Trigger.new);
    }   
}

1 Ответ

0 голосов
/ 13 января 2020

Вы используете 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 выполняются в одной транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...