Hey everyone,
I’m here to share a trigger code that demonstrates how to tally the number of open and closed tasks associated with an account. To implement this, create two custom fields on the Account object:
- Open Task field.
- Closed Task field.
Apex Trigger snippet –
trigger countOpenAndClosedTask on Task (after insert, after undelete, after delete, after update) { Set<Id> setOpenTaskAccountIds = new Set<Id>(); Set<Id> setClosedTaskAccountIds = new Set<Id>(); List<Account> listAccountUpdate = new List<Account>(); List<Account> listOpenTaskAccounts = new List<Account>(); List<Account> listClosedTaskAccounts = new List<Account>(); if(Trigger.IsAfter){ if(Trigger.IsInsert || Trigger.IsUndelete || Trigger.isUpdate) { for(Task t: Trigger.new) { if(String.valueOf(t.WhatId).startsWithIgnoreCase('001')) { if(t.Status.equalsIgnoreCase('Completed')){ setClosedTaskAccountIds.add(t.WhatId); System.debug('@@@@Inside Completed@@@'+setClosedTaskAccountIds); } else { setOpenTaskAccountIds.add(t.WhatId); System.debug('@@@@Inside Open@@@'+setOpenTaskAccountIds); } if(Trigger.IsUpdate){ if(Trigger.oldMap.get(t.Id).WhatId != t.WhatId){ if(t.Status.equalsIgnoreCase('Completed')){ setClosedTaskAccountIds.add(Trigger.oldMap.get(t.Id).WhatId ); System.debug('@@@Inside Update Closed@@@'+setClosedTaskAccountIds); } else { setOpenTaskAccountIds.add(Trigger.oldMap.get(t.Id).WhatId ); System.debug('@@@Inside Update Open@@@'+setOpenTaskAccountIds); } } } } } } if(Trigger.IsDelete){ for(Task t : Trigger.Old){ if(String.valueOf(t.WhatId).startsWithIgnoreCase('001')) { if(t.Status.equalsIgnoreCase('Completed')){ setClosedTaskAccountIds.add(t.WhatId); System.debug('@@@@Inside Deleted Completed'); } else { setOpenTaskAccountIds.add(t.WhatId); System.debug('@@@@Inside Deleted Open'); } } } } listOpenTaskAccounts =[SELECT Id, Name, Open_Task__c,(Select Status From Tasks Where Status != 'Completed' ) FROM Account WHERE Id =:setOpenTaskAccountIds]; listClosedTaskAccounts =[SELECT Id, Name, Closed_Task__c,(Select Status From Tasks Where Status = 'Completed' ) FROM Account WHERE Id =:setClosedTaskAccountIds]; System.debug('@@@@ListOpenTaskAccounts'+listOpenTaskAccounts ); System.debug('@@@@ListClosedTaskAccounts'+listClosedTaskAccounts ); for(Account acc:listOpenTaskAccounts) { List<Task> listTask = acc.Tasks; acc.Open_Task__c = listTask.size(); listAccountUpdate.add(acc); } for(Account acc:listClosedTaskAccounts) { List<Task> listTask = acc.Tasks; acc.Closed_Task__c = listTask.size(); listAccountUpdate.add(acc); } try{ System.debug('@@@@listAccountUpdate'+listAccountUpdate); update listAccountUpdate; }catch(System.Exception e){ System.debug('@@@error'+e.getMessage()); } } }
Thanks.
Enjoy coding.