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
Varun TejaVarun Teja 

how to populate Map<id,Account> i want to map account with list of Cases associated to that account,the below code is not working,how can we achieve this

Best Answer chosen by Varun Teja
Raj VakatiRaj Vakati
Use the below code
@isTest
public class OpenAndCloseCasesOnTrigger_Test {
    public static testMethod void testBulkContactsGetCreated() {
        Account acc = new Account() ;
        acc.Name='Demo' ;
        insert acc ; 
        
        Account acc1 = new Account() ;
        acc1.Name='Demo' ;
        insert acc1 ; 
        
        Contact cnt1 = new Contact(FirstName = 'John',
                                   LastName = 'Doe',AccountId =acc.Id ,
                                   Email='jdoe_test_test@doe.com');
        
        insert cnt1;
        
        
        
        List<Case> newCases = new List<Case>();
        for (Integer i = 0; i<10; i++) {
            Case c = new Case(SuppliedEmail='jdoe_test_test@doe.com' + i,Status='Open',
                              SuppliedName='John Doe' + i,AccountId =acc.Id ,ContactId =cnt1.Id ,
                              Subject='Feedback - Something' + i);
            newCases.add(c);
        }
        insert newCases;
        Case c1 = [Select id,Subject,Status,AccountId from Case Limit 1 ] ; 
        c1.Status='Closed';
        c1.AccountId =acc1.Id ;
        c1.Subject ='Updaet' ;
        update c1 ; 
        
        
        List<Case> newCases1 = new List<Case>();
        for (Integer i = 0; i<10; i++) {
            Case c = new Case(SuppliedEmail='jdoe_test_test@doe.com' + i,Status='Closed',
                              SuppliedName='John Doe' + i,AccountId =acc.Id ,ContactId =cnt1.Id ,
                              Subject='Feedback - Something' + i);
            newCases1.add(c);
        }
        insert newCases1;
        
        Case c1Temp = [Select id,Subject,Status,AccountId from Case where status='Closed' Limit 1 ] ; 
        c1Temp.Status='Open';
        c1Temp.AccountId =acc1.Id ;
        c1Temp.Subject ='Updaet' ;
        update c1Temp ; 
        
        
    }
    
}

 

All Answers

Raj VakatiRaj Vakati
Use the code as shown below 
 
Map<Id, List<Case>> casetoAccoutnId = new Map<Id, List<Case>>();

for(Case cases : [SELECT Id,AccountId FROM Case ]) {
	if(casetoAccoutnId.containsKey(cases.AccountId)) {
		List<Case> casesList = casetoAccoutnId.get(cases.AccountId);
		casesList.add(cases);
		casetoAccoutnId.put(cases.AccountId, casesList);
	} else {
		casetoAccoutnId.put(cases.AccountId, new List<Case> { cases });
	}
}

 
Varun TejaVarun Teja
Thanks Raj for reply. But here is Account object is having Number of Open Cases and Number of closed Cases as fields. If Case status is not closed ,in Account object Number of Open Cases  should increment by 1. If status is closed then Account object Number of Closed Cases  should increment by 1..This is the requirement. Below is my code.Could you please suggest                                                                               trigger OpenAndCloseCasesOnTrigger on Case (After insert) {
    
    Set<Id> AccountIds = new Set<Id>();   
    for (Case cs: Trigger.new) {
         if (cs.AccountId != null) {
             AccountIds.add(cs.AccountId);
          }
    }
     List<Account> acctList = new List<Account>();
     Map<Id, Account> accountMap = new Map<Id, Account>([select id, Number_of_Open_Cases__c, Number_Of_Closed_Cases__c from Account where id IN: AccountIds]);

    if (Trigger.isInsert){
     for (Case caseRec : Trigger.new) {
         if(caseRec.Status!='Closed'){
         accountMap.get(caseRec.AccountId).Number_of_Open_Cases__c++;
             
         }else{
            accountMap.get(caseRec.AccountId).Number_Of_Closed_Cases__c++; 
         }
    }
   if (acctList.size() > 0) {
        insert acctList;
    }
  }
}
                                                                                     
Raj VakatiRaj Vakati
Use code . You need to update accountMap .values() insted of acctList
 
Set<Id> AccountIds = new Set<Id>();   
    for (Case cs: Trigger.new) {
         if (cs.AccountId != null) {
             AccountIds.add(cs.AccountId);
          }
    }
   List<Account> acctList = new List<Account>();
    
Map<Id, Account> accountMap = new Map<Id, Account>([select id, Number_of_Open_Cases__c, Number_Of_Closed_Cases__c from Account where id IN: AccountIds]);

	 
	 
    if (Trigger.isInsert){
     for (Case caseRec : Trigger.new) {
         if(caseRec.Status!='Closed'){
         accountMap.get(caseRec.AccountId).Number_of_Open_Cases__c++;
             
         }else{
            accountMap.get(caseRec.AccountId).Number_Of_Closed_Cases__c++; 
         }
    }
   if (accountMap.size() > 0) {
        update accountMap.values();
    }
  }
}

 
Varun TejaVarun Teja
Thank you so much Raj.
Varun TejaVarun Teja
Could you please tell how to write a test class for below code

trigger OpenAndCloseCasesOnTrigger on Case (after insert,after update,before delete) {
    
     Map<Id,Account> accMap= new Map<Id,Account>();
      List<Case> caseList = (trigger.isDelete)? trigger.old : trigger.new;
      set<Id> accid = new set<Id>();
       for(Case cs: caseList){
            if(cs.AccountId != null){
                accid.add(cs.AccountId);
            }
           if(trigger.isUpdate && cs.AccountId != trigger.oldMap.get(cs.Id).AccountId){
               accid.add(trigger.oldMap.get(cs.Id).AccountId);
               
           }
       }
        List<Account> listAccount = [select id, Number_of_Open_Cases__c, Number_Of_Closed_Cases__c from Account where id IN: accid];
             for(Account acc: listAccount)
               { 
                accMap.put(acc.Id, acc);
                if(acc.Number_of_Open_Cases__c == null){
                   acc.Number_of_Open_Cases__c = 0;
               }
                if(acc.Number_Of_Closed_Cases__c == null){
                    acc.Number_Of_Closed_Cases__c = 0;
                }
            }                 
                     if(Trigger.isInsert){
                  for(Case newCase : Trigger.New) {                
                         if(newCase.Status !='Closed')
                      accMap.get(newCase.AccountId).Number_of_Open_Cases__c++;
                            else if(newCase.Status =='Closed') 
                            accMap.get(newCase.AccountId).Number_Of_Closed_Cases__c++;
                        }
                   }
      
                     if (Trigger.isUpdate) {        
                         for(Case CaseUpdate : Trigger.New) {
                            Case oldCaseRecord = Trigger.OldMap.get(CaseUpdate.Id);
                             
                             if(CaseUpdate.AccountId == oldCaseRecord.AccountId){
                             
                            if(oldCaseRecord.Status != 'Closed' && CaseUpdate.Status =='Closed'){
                                
                                accMap.get(CaseUpdate.AccountId).Number_Of_Closed_Cases__c++;
                                
                                accMap.get(CaseUpdate.AccountId).Number_of_Open_Cases__c--;
                          }
                             else if(oldCaseRecord.Status == 'Closed' && CaseUpdate.Status !='Closed'){
                                accMap.get(CaseUpdate.AccountId).Number_of_Open_Cases__c++;
                                accMap.get(CaseUpdate.AccountId).Number_Of_Closed_Cases__c--;
                          }
                             }else{
                                 Account acct= accMap.get(oldCaseRecord.AccountId);
                                 
                                 if(oldCaseRecord.Status == 'Closed') {
                                        accMap.get(acct.Id).Number_Of_Closed_Cases__c--;  
                                        accMap.get(CaseUpdate.AccountId).Number_Of_Closed_Cases__c++;
                                            }
                                 else {
                                      accMap.get(acct.Id).Number_of_Open_Cases__c--;
                                         accMap.get(CaseUpdate.AccountId).Number_of_Open_Cases__c++;
                                        }
                              }
                          }
                   }
                         if(Trigger.isDelete) { 
                            for(Case caseDelete: Trigger.Old) {                
                                if(caseDelete.Status !='Closed')
                                    accMap.get(caseDelete.AccountId).Number_of_Open_Cases__c--;
                                else if(caseDelete.Status =='Closed')
                                    accMap.get(caseDelete.AccountId).Number_Of_Closed_Cases__c--;
                            }
                        }
               if(listAccount.size() > 0){
                update accMap.values(); 
                }
  
   }
 
Raj VakatiRaj Vakati
Use the below code
@isTest
public class OpenAndCloseCasesOnTrigger_Test {
    public static testMethod void testBulkContactsGetCreated() {
        Account acc = new Account() ;
        acc.Name='Demo' ;
        insert acc ; 
        
        Account acc1 = new Account() ;
        acc1.Name='Demo' ;
        insert acc1 ; 
        
        Contact cnt1 = new Contact(FirstName = 'John',
                                   LastName = 'Doe',AccountId =acc.Id ,
                                   Email='jdoe_test_test@doe.com');
        
        insert cnt1;
        
        
        
        List<Case> newCases = new List<Case>();
        for (Integer i = 0; i<10; i++) {
            Case c = new Case(SuppliedEmail='jdoe_test_test@doe.com' + i,Status='Open',
                              SuppliedName='John Doe' + i,AccountId =acc.Id ,ContactId =cnt1.Id ,
                              Subject='Feedback - Something' + i);
            newCases.add(c);
        }
        insert newCases;
        Case c1 = [Select id,Subject,Status,AccountId from Case Limit 1 ] ; 
        c1.Status='Closed';
        c1.AccountId =acc1.Id ;
        c1.Subject ='Updaet' ;
        update c1 ; 
        
        
        List<Case> newCases1 = new List<Case>();
        for (Integer i = 0; i<10; i++) {
            Case c = new Case(SuppliedEmail='jdoe_test_test@doe.com' + i,Status='Closed',
                              SuppliedName='John Doe' + i,AccountId =acc.Id ,ContactId =cnt1.Id ,
                              Subject='Feedback - Something' + i);
            newCases1.add(c);
        }
        insert newCases1;
        
        Case c1Temp = [Select id,Subject,Status,AccountId from Case where status='Closed' Limit 1 ] ; 
        c1Temp.Status='Open';
        c1Temp.AccountId =acc1.Id ;
        c1Temp.Subject ='Updaet' ;
        update c1Temp ; 
        
        
    }
    
}

 
This was selected as the best answer
Varun TejaVarun Teja
Its working Raj,
 
Varun TejaVarun Teja
I am new to apex, but giving hard tasks to me.I counld not able to do.You are helping so much.Could you please have a look and help me on this.

https://developer.salesforce.com/forums/ForumsMain?id=9060G0000005cilQAA
Kanchan MishraKanchan Mishra
Hi Raj..please help me with this code-
Map<ID,Map<id, list<Case>>> 
1st account ID
2nd Contact ID
List of Cases= 1000 Cases
Accountid (12222244541) - (Contact id- 231)-        case 1
                                                                                Case 2
                                                                                Case 3

                                           contactid-232-          Case 1
                                                                           Case 2
                                                                           Case 3
i want to query cases and also get contact id and account id from there. It should be look like above senerio. Please help