You need to sign in to do that
Don't have an account?
John Neilan
Illegal assignment from SObject to SOBJECT:Task
Hello,
I created a trigger that calls a class to count the number of tasks related to an Opportunity, who's Status is "Completed". The trigger works properly when tasks are inserted, moved to Completed, deleted, or un-deleted. However, nothing happens if a task is moved from Completed to another status and I would like the count to be decreased when this occurs. Can anyone help me figure this out? Thanks,
Trigger:
Class:
I created a trigger that calls a class to count the number of tasks related to an Opportunity, who's Status is "Completed". The trigger works properly when tasks are inserted, moved to Completed, deleted, or un-deleted. However, nothing happens if a task is moved from Completed to another status and I would like the count to be decreased when this occurs. Can anyone help me figure this out? Thanks,
Trigger:
trigger MainTriggerTask on Task (after insert, after update, after delete, after undelete) { IF(Trigger.IsInsert){ ClassRenewalTaskCount updater7 = new ClassRenewalTaskCount(); updater7.taskCountInsert(Trigger.new); } IF(Trigger.IsUpdate){ ClassRenewalTaskCount updater4 = new ClassRenewalTaskCount(); updater4.taskCountUpdate(Trigger.new,Trigger.old); } IF(Trigger.IsDelete){ ClassRenewalTaskCount updater2 = new ClassRenewalTaskCount(); updater2.taskCountDel(Trigger.old); } IF(Trigger.IsUndelete){ ClassRenewalTaskCount updater2 = new ClassRenewalTaskCount(); updater2.taskCountUpdate(Trigger.new, Trigger.old); } }
Class:
public class ClassRenewalTaskCount { Set<ID> OppIds = new Set<ID>(); String oppPrefix = Opportunity.SObjectType.getDescribe().getKeyPrefix(); public void taskCountInsert(List<Task> checkTasks) { for (Task t : checkTasks) { if (t.WhatId != null && t.Status == 'Completed' && t.RP_Prior_60__c <= t.ActivityDate && string.valueof(t.WhatId).startsWith(oppPrefix) ) { OppIds.add(t.WhatId); } } if (OppIds.size() > 0){ List<Opportunity> oppsWithTasks = [SELECT Id,RP_Customer_Engagement__c,(SELECT Id FROM Tasks) FROM Opportunity WHERE Id IN : OppIds]; List<Opportunity> oppsUpdatable = new List<Opportunity>(); for(Opportunity L : oppsWithTasks){ L.RP_Customer_Engagement__c = L.Tasks.size(); oppsUpdatable.add(L); } if(oppsUpdatable.size()>0){ update oppsUpdatable; } } } public void taskCountUpdate(List<Task> checkTasks, List<Task> oldTasks) { for (Task t : checkTasks) { for (Task prev : oldTasks){ if (t.WhatId != null && t.Status == 'Completed' && t.RP_Prior_60__c <= t.ActivityDate && string.valueof(t.WhatId).startsWith(oppPrefix) ) { OppIds.add(t.WhatId); } if (t.WhatId != null && ((prev.Status == 'Completed' && t.Status <> 'Completed') || t.RP_Prior_60__c > t.ActivityDate) && string.valueof(t.WhatId).startsWith(oppPrefix) ) { OppIds.remove(t.WhatId); } } } if (OppIds.size() > 0){ List<Opportunity> oppsWithTasks = [SELECT Id,RP_Customer_Engagement__c,(SELECT Id FROM Tasks) FROM Opportunity WHERE Id IN : OppIds]; List<Opportunity> oppsUpdatable = new List<Opportunity>(); for(Opportunity L : oppsWithTasks){ L.RP_Customer_Engagement__c = L.Tasks.size(); oppsUpdatable.add(L); } if(oppsUpdatable.size()>0){ update oppsUpdatable; } } } public void taskCountDel(List<Task> delTasks) { for (Task t2 : delTasks) { for (Task prev2 : (List<Task>)Trigger.Old){ if (t2.WhatId!= null && (t2.Status == 'Completed' || (prev2.Status == 'Completed' && t2.Status != 'Completed') || t2.RP_Prior_60__c > t2.ActivityDate) && string.valueof(t2.WhatId).startsWith(oppPrefix)){ OppIds.add(t2.WhatId); } } } if (OppIds.size() > 0){ List<Opportunity> oppsWithTasks = [SELECT Id,RP_Customer_Engagement__c,(SELECT Id FROM Tasks) FROM Opportunity WHERE Id IN : OppIds]; List<Opportunity> oppsUpdatable = new List<Opportunity>(); for(Opportunity L : oppsWithTasks){ L.RP_Customer_Engagement__c = L.Tasks.size(); oppsUpdatable.add(L); } if(oppsUpdatable.size()>0){ update oppsUpdatable; //update all the leads with activity count } } } }
All Answers
if (t.WhatId != null && ((prev.Status == 'Completed' && t.Status <> 'Completed') || t.RP_Prior_60__c > t.ActivityDate) && string.valueof(t.WhatId).startsWith(oppPrefix) )
The status check is in OR - I think it should be compared as an AND, could you please test this?
if (t.WhatId != null && ((prev.Status == 'Completed' && t.Status <> 'Completed') && t.RP_Prior_60__c > t.ActivityDate) && string.valueof(t.WhatId).startsWith(oppPrefix) )