Triggers 在这个问题上,我不能再做父母了。如果从帐户中删除了opportunity,则应将其从帐户查找字段中删除

Triggers 在这个问题上,我不能再做父母了。如果从帐户中删除了opportunity,则应将其从帐户查找字段中删除,triggers,salesforce,apex,Triggers,Salesforce,Apex,在重新教育中的问题,在这个问题中,我必须找到数量最大的opportunity,并将其放入Account lookup(帐户查找)字段,该字段正在工作,但当我更改opportunity的帐户时,它将保留在Account lookup(帐户查找)字段中。如果我错了,有人能纠正一下吗 public class TopOpportunityClass{ public static boolean flag = true; public static void onTopOpportuni

在重新教育中的问题,在这个问题中,我必须找到数量最大的opportunity,并将其放入Account lookup(帐户查找)字段,该字段正在工作,但当我更改opportunity的帐户时,它将保留在Account lookup(帐户查找)字段中。如果我错了,有人能纠正一下吗

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);
    }   
}
公共类TopOpportunityClass{
公共静态布尔标志=true;
公共静态端口(列表端口){
如果(标志==真){
List uptpp=新列表();
Set accIds=new Set();
for(Opportunity opp:opport){
如果(opp.AccountId!=null){
accIds.add(opp.AccountId);
}
}
Map AccupportMap=新地图();
列表AccupDataList=新列表();
对于(Opportunity obj:[选择id、名称、金额、帐户id
来自机遇
其中accountId IN:accIds按金额排序DESC nulls last]){
名单;
if(accOpportMap.containsKey(对象帐户ID)){
oppList=accountportmap.get(obj.accountId);
}否则{
oppList=新列表();
}
添加(obj);
accOpportMap.put(obj.accountId,oppList);
}
对于(Id accId:AccupportMap.keySet()){
if(AccountMap.get(accId.size()>1){
opportunity opp1=新opportunity(id=AccupportMap.get(accId)[1].id,isTopOpportunityCheck\uu c=false);
uppp.add(opp1);
accUpdateList.add(新帐户(id=accId,IstoPopOpportunity\uuu c=accOpportMap.get(accId)[0].id));
opportunity opp=new opportunity(id=AccupportMap.get(accId)[0].id,isTopOpportunityCheck\uu c=true);
uptp.add(opp);
}else if(accountportmap.get(accId.size()=1){
accUpdateList.add(新帐户(id=accId,IstoPopOpportunity\uuu c=accOpportMap.get(accId)[0].id));
opportunity opp=new opportunity(id=AccupportMap.get(accId)[0].id,isTopOpportunityCheck\uu c=true);
uptp.add(opp);
}else if(accountportmap.get(accId.size()=0){
accUpdateList.add(新帐户(isTopOpportunity_uuC=NULL,id=NULL));
}
flag=false;
}
如果(!accUpdateList.isEmpty()){
更新accUpdateList;
更新uptp;
}
}
}
}
//触发
触发机会触发机会(插入后、更新后){
if(Trigger.isAfter){
TopOpportunityClass.onTopOpportunity(Trigger.new);
}   
}

更新后运行的是
,因此在每个sObject中都会得到新的值。如果要影响分配给某个重新租用的Opportunity的旧帐户,还需要查看
Trigger.old
Trigger.oldMap
中的值

方法是在此处添加一个复选框:

        for(Opportunity opp : opport){
            if(opp.AccountId != null){
                accIds.add(opp.AccountId);
            }
        }
查找重新租用的Opportunity(
opp.AccountId!=Trigger.oldMap.get(opp.Id).AccountId
)并影响该帐户

下面还有一个单独的问题:这个逻辑分支显然是错误的

            }else if(accOpportMap.get(accId).size() == 0){
                accUpdateList.add(new Account(isTopOpportunity__c = NULL, id = NULL));
            }
您不能
更新
Id
null
帐户,这将产生异常


执行更新后,您还需要将
标志
重置为
,否则,当在一个事务中执行多个DML操作时,触发器将出现一些非常混乱且难以调试的边缘情况。

嗨,David,感谢您的回答,我还有一个问题要问。请检查下面的语句“for(Id accId:AccupportMap.keySet())”,所有代码都没有被放大,请告诉我该怎么做。