Counting items in related list
Following on from my previous blog where I mentioned that some things in Salesforce.com look complicated at first but actually have a really easy solution this requirement sounded easy but required a trigger in the end to solve it.The problem
My customer wanted to count have many Activity Records with a given criteria were linked to a Case record up to the point where the case was closed.This count would be populated on a number field on the Case Object called: Number_of_Calls__c
This field would show how many interactions took place from Case Open to Case Close.
Unfortuantely, buried within the activity history on the case there were other non-relevant activities so a way to count specific tasks was required.
At this point, if Activity History was a Master Detail relationship under the Case then I could have added a Roll Up summary, but as it's a Lookup there's currently no easy way to do this out of the Salesforce.com box.
Your 2 options are to either install a 3rd party app like Rollup Helper or Code a custom trigger.
For complete flexibility I went down the trigger route - here's the code.
trigger CountCalls on Case (before update) { Set<Id> ids = new Set<Id>(); for (Case acc: Trigger.new) { if(trigger.isDelete){ //We don't want to add up calls in a delete operation ids.addAll(trigger.oldMap.keySet()); System.debug('Delete operation - removing IDs from Map'); } if (trigger.isUpdate && (Trigger.newMap.get(acc.id).Status == 'Closed' && Trigger.oldMap.get(acc.id).Status != 'Closed')) { //Only count calls if the case changed to close String oldStatus = Trigger.oldMap.get(acc.id).Status; String newStatus = Trigger.newMap.get(acc.id).Status; System.debug(oldStatus + ' and new status ' + newStatus); System.debug('Only cases that have just been closed should be counted'); ids.addAll(trigger.newMap.keySet()); Integer casesToUpdate = ids.size(); System.debug('Number of cases to update: ' + casesToUpdate); } } //end of For loop List<Task> taskCount = [SELECT ID from Task where (CallType = 'Inbound' OR CallType = 'Outbound') AND Status = 'Completed' AND WhatID In : ids]; //Amend to specify only Inbound/Outbound etc System.debug('TaskCount is ' + taskCount); //Query how many tasks have that Case linked to them for (Case acc: Trigger.new) { if (taskCount.size() > 0) { System.debug('Found tasks associated to this'); acc.Number_of_Calls__c = taskCount.size(); } else { System.debug('No tasks associated to this'); acc.Number_of_Calls__c = 0; } } } // end of trigger
Comments
Post a Comment