function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Linda 98Linda 98 

Trigger to count won cases,lost and all cases

Hi

I am trying to write a trigger to update account custom fields with total,won and lost cases.unable to get won and lost cases number.(I had tried to write soql for won and lost cases.but not sure how can i update them?do i need to update individual list?Is there any other way)

Also when i delete a case,how can i update the count.

please help!!
trigger counttrigger on Case (after insert, after update,after delete) {
    List<Case> lstCase = [select id, AccountId from Case where id in: trigger.newmap.keyset()];
    set<Id> sAccId = new set<Id>();
        for(Case cs: lstCase)
        {
            if(cs.AccountId != null)
            {
            sAccId.add(cs.AccountId);
            }
        }
            
    if(sAccId != null && sAccId.size() > 0){
        List<Account> lstAccount = [select id,Totalcases_c,Woncases__c,Iostcases__c, (select id,Status from Cases ) from Account where id in: sAccId];

            for(Account acc:lstAccount ){
                acc.Totalcases__c = lstAccount.Cases.size();
            }
          }  
       }
}

 
Saurabh BSaurabh B
Hi Linda,
Please use below code. It calculates Totalcases_c,Woncases__c,Iostcases__c values from cases to Accounts. Also, I`m assumiung you have 'Lost' and 'Won' status values on your Case Object.
 
trigger countTotalContactInAccount on Case (after insert,after update,after delete) {
    set<id> accId =new set<id>();
    List<Account> TotalCases = new List<Account>();
    List<Account> LostCases = new List<Account>();
    List<Account> WonCases = new List<Account>();
    
    if(trigger.isInsert){
        for(Case c:trigger.new){
            accId.add(c.accountID);
        }
    }
    if(trigger.isUpdate|| trigger.isDelete){
        for(Case c:trigger.old){
            accId.add(c.accountID);
        }
    }
    Map<Id,Account> accountMap =new Map<Id,Account>([select id,name,Totalcases__c,Iostcases__c,Woncases__c from  Account where Id IN: accId ]);
    
    // Count Total Cases
    for(Account acc:[select id,name,Totalcases__c,(Select id from cases) from Account where Id IN: accId]){
        accountMap.get(acc.id).Totalcases__c = acc.cases.size();
        TotalCases.add(accountMap.get(acc.id));
    }
 
    // Count Lost Cases
    for(Account acc:[select id,name,Iostcases__c,(Select id from cases WHERE Status = 'Lost') from Account where Id IN: accId]){
        accountMap.get(acc.id).Iostcases__c = acc.cases.size();
        LostCases.add(accountMap.get(acc.id));
    }
    
    // Count Won Cases
    for(Account acc:[select id,name,Woncases__c,(Select id from cases WHERE Status = 'Won') from Account where Id IN: accId]){
        accountMap.get(acc.id).Woncases__c = acc.cases.size();
        WonCases.add(accountMap.get(acc.id));
    }
    
    update TotalCases;
    update LostCases;
    update WonCases;
    
}



Please mark this as Best Answer if it helps!
 
Linda 98Linda 98
Thanks for that . You helped me through the gate. But you are using soql in for loop.That might hit limits.Am I wrong? We can't also use soql outside loop like. List total =[query]; For(account acc:total){ accountMap.get(acc.id).Totalcases__c ; // Add to list; }. this way causes error in this after trigger :cannot modify a collection while it is being iterated.How to handle such? PS:If I don't add to list,the value will not change. Update total; }