Triggers Visualforce Apex触发器更新错误记录

Triggers Visualforce Apex触发器更新错误记录,triggers,salesforce,apex-code,visualforce,Triggers,Salesforce,Apex Code,Visualforce,我不明白为什么这个触发器有时会更新不符合条件的记录。这个想法是,当一个帐户从“保留”变为活动服务时,任何被取消的任务都会返回到挂起。我不知道是什么触发了它,但似乎每个人在一段时间内,分配是取消的帐户,没有改变服务。代码如下: trigger cancelAssignments on Account (before update) { List<Assignment__c> masterListA = [select Id, Status__c, Practice__c fro

我不明白为什么这个触发器有时会更新不符合条件的记录。这个想法是,当一个帐户从“保留”变为活动服务时,任何被取消的任务都会返回到挂起。我不知道是什么触发了它,但似乎每个人在一段时间内,分配是取消的帐户,没有改变服务。代码如下:

trigger cancelAssignments on Account (before update) {
    List<Assignment__c> masterListA = [select Id, Status__c, Practice__c from Assignment__c where Practice__c IN :Trigger.newMap.keySet() and type_of_work__c != 'a0Qa000000G1WmVEAV' AND (status__c = 'Feedback Needed' OR status__c = 'Pending Review' OR status__c = 'Accepted')];    
    List<Assignment__c> masterListB = [select Id, Status__c, Practice__c from Assignment__c where Practice__c IN :Trigger.newMap.keySet() and type_of_work__c != 'a0Qa000000G1WmVEAV' AND (status__c = 'Canceled')]; 

    for (Account oAccount : trigger.new) {
        if (oAccount.current_services__c == null || oAccount.current_services__c == 'Hold'){
            for (Account oAcct : trigger.old){
                if (oAcct.current_services__c != null && oAcct.current_services__c != 'Hold'){
                    List<Assignment__c> assignmentsToUpdate = new List<Assignment__c>();
                    for (Assignment__c rd : masterListA){
                        if (rd.practice__c == oAccount.id){
                        rd.Status__c = 'Canceled';
                        assignmentsToUpdate.add(rd); 
                    }
                    }update assignmentsToUpdate;
                }
            }
        }
        else if (oAccount.current_services__c != 'Hold' && oAccount.current_services__c != null  ){
            for (Account oAcctB : trigger.old){
                if (oAcctB.current_services__c == 'Hold'){
                    List<Assignment__c> assignmentsToUpdateB = new List<Assignment__c>();
                    for (Assignment__c rdB : masterListB){
                        if (rdB.practice__c == oAccount.id){
                        rdB.Status__c = 'Pending Review';
                        assignmentsToUpdateB.add(rdB); 
                    }
                    }update assignmentsToUpdateB;
                }
            }    
        }
    }
}
触发取消帐户分配(更新前){
列出主列表A=[从作业c中选择Id、状态c、练习c,其中练习c在:Trigger.newMap.keySet()中,并键入工作类型c!='a0Qa000000G1WmVEAV'和(状态c='Feedback Needed'或状态c='Pending Review'或状态c='Accepted');
List masterListB=[从作业c中选择Id、状态c、练习c,其中练习c在:Trigger.newMap.keySet()中,并键入工作类型c!='a0Qa000000G1WmVEAV'和(状态c='cancelled');
对于(帐户OAAccount:trigger.new){
if(oAccount.current_services_uuc==null | | oAccount.current_services_uc==Hold'){
for(帐户oAcct:trigger.old){
if(oAcct.current\u services\uuu c!=null&&oAcct.current\u services\uu c!=Hold){
List assignmentsToUpdate=新列表();
用于(作业:主列表A){
if(rd.practice\uu c==oAccount.id){
rd.Status_uuuc='已取消';
assignmentsToUpdate.add(rd);
}
}更新任务更新;
}
}
}
else if(oAccount.current\u services\uuu c!='Hold'&&oAccount.current\u services\uu c!=null){
for(帐户oAcctB:trigger.old){
if(oAcctB.current_services_uuuc=='Hold'){
List assignmentsToUpdateB=新列表();
对于(作业c rdB:masterListB){
if(rdB.practice\uu c==oAccount.id){
rdB.Status_uuc='待审查';
assignmentsToUpdateB.add(rdB);
}
}更新分配至更新B;
}
}    
}
}
}

问题可能如下所示:

  • masterListB
    为多个帐户获取分配
  • for(Account oAcctB:trigger.old)
    循环中的代码从不检查处于“保持”状态的旧帐户是否为同一帐户
一种解决方案可能是进行以下编辑:

/* Old condition replaced:
   if (oAcctB.current_services__c == 'Hold') { */

if (oAcctB.current_services__c == 'Hold' and oAcctB.Id == oAccount.Id) {
为了证明这是否是正确的解决方案,我建议创建一个如下工作的单元测试:

  • 创建两个帐户,“Alpha公司”和“Beta公司”
  • 将Alpha Corp的当前服务设置为“保留”
  • 将Beta Corp的当前服务设置为“活动”
  • 向Alpha Corp添加状态为“已取消”的相关任务
  • 向Beta Corp添加状态为“已取消”的相关任务
  • 在一个DML操作中更新两个帐户,执行一些琐碎的操作,例如将计费国家从“美国”更改为“美国”
  • 断言阿尔法公司的相关分配仍然“取消”

  • 我怀疑您共享的代码无法通过单元测试,在这种情况下,您可以集中精力解决问题。

    虽然Marty的代码回答了我提出的问题,但我也遇到了一些“代码语句太多”错误。下面是最终的代码,它似乎解决了以下问题:

    trigger cancelAssignments on Account (before update) {
    List<account> quitingAccounts = new List<account>();
    List<account> returningAccounts = new List<account>();
    List<Assignment__c> assignmentsToCancel;
    List<Assignment__c> assignmentsToReturn;
    for (Account oAccount : trigger.new)
        {
        if (oAccount.current_services__c == null || oAccount.current_services__c == 'Hold')
            {
            for (Account oAcct : trigger.old)
                {
                if (oAcct.current_services__c != null && oAcct.current_services__c != 'Hold' && oAcct.Id == oAccount.Id)
                    {                    
                    quitingAccounts.add(oAcct);                                      
                    }
                }
            }
        else if (oAccount.current_services__c != 'Hold' && oAccount.current_services__c != null  )
            {
            for (Account oAcctB : trigger.old)
                {
                if (oAcctB.current_services__c == 'Hold'  && oAcctB.Id == oAccount.Id)
                    {
                    returningAccounts.add(oAcctB);
                    }
                }    
            }
        }        
    assignmentsToCancel = [select Id, Status__c, Practice__c from Assignment__c  where Practice__c IN :quitingAccounts and type_of_work__c != 'a0Qa000000G1WmVEAV' AND (status__c = 'Feedback Needed' OR status__c = 'Pending Review' OR status__c = 'Accepted')];
    assignmentsToReturn = [select Id, Status__c, Practice__c from Assignment__c  where Practice__c IN :returningAccounts and type_of_work__c != 'a0Qa000000G1WmVEAV' AND status__c = 'Canceled'];
    for (Assignment__c rd : assignmentsToCancel)
        {
        rd.Status__c = 'Canceled';
        }
    for (Assignment__c rd : assignmentsToReturn)
        {
        rd.Status__c = 'Pending Review';
        }
    update assignmentsToCancel;
    update assignmentsToReturn;
    
    触发取消帐户分配(更新前){
    List quitingAccounts=新列表();
    List returningAccounts=新列表();
    列表分配取消;
    列表分配StoreTurn;
    对于(帐户OAAccount:trigger.new)
    {
    if(oAccount.current_services_uuc==null | | oAccount.current_services_uc==Hold')
    {
    for(帐户oAcct:trigger.old)
    {
    if(oAcct.current\u services\uuuu c!=null&&oAcct.current\u services\uuuu c!='Hold'&&oAcct.Id==oAccount.Id)
    {                    
    退出账户。添加(oAcct);
    }
    }
    }
    else if(oAccount.current\u services\uuu c!='Hold'&&oAccount.current\u services\uu c!=null)
    {
    for(帐户oAcctB:trigger.old)
    {
    if(oAcctB.current_services_uuc='Hold'&&oAcctB.Id==oAccount.Id)
    {
    返回帐户。添加(oAcctB);
    }
    }    
    }
    }        
    assignmentsToCancel=[从Assignment_uuuc中选择Id、Status_uc、Practice_uc,其中Practice_uc IN:退出账户和工作类型_uc!='a0Qa000000G1WmVEAV'和(Status_uc='Feedback need'或Status_uc='Pending Review'或Status_uc='Accepted');
    assignmentsToReturn=[从Assignment_uC中选择Id、Status_uC、Practice_uC,其中Practice_uC IN:returningAccounts and type_of_work_uC!='A0QA0000000G1WMVEAV'和Status_uC='Cancelled'];
    对于(分配\uuu c rd:assignmentsToCancel)
    {
    rd.Status_uuuc='已取消';
    }
    对于(分配\ c路:分配StoreTurn)
    {
    rd.Status_uu_c='待审查';
    }
    更新分配以取消;
    更新assignmentsToReturn;
    

    }

    您是否检查过任何可能影响结果的验证规则或工作流规则?谢谢Marty,这似乎就是问题所在。不过,我有点不太明白。为什么if没有在最后一个for循环中完成这个任务<代码>用于(赋值\u c rdB:masterListB){if(rdB.practice\u c==oAccount.id){