Triggers 在这个问题上,我不能再做父母了。如果从帐户中删除了opportunity,则应将其从帐户查找字段中删除
在重新教育中的问题,在这个问题中,我必须找到数量最大的opportunity,并将其放入Account lookup(帐户查找)字段,该字段正在工作,但当我更改opportunity的帐户时,它将保留在Account lookup(帐户查找)字段中。如果我错了,有人能纠正一下吗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
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())”,所有代码都没有被放大,请告诉我该怎么做。