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) {
为了证明这是否是正确的解决方案,我建议创建一个如下工作的单元测试:
我怀疑您共享的代码无法通过单元测试,在这种情况下,您可以集中精力解决问题。虽然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){