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
Gaurav  PuranikGaurav Puranik 

Error in After Update Event Trigger for Case Object

Hi,

There is a custom checkbox field Auto_Close_Reopen__c for case object. For after update event if the Auto_Close_Reopen__c checkbox checked I want to create new case and want to update Auto_Close_Reopen__c checkbox field value to false. We can achieve it by before update case but I want it to make for after update event. I wrote a trigger for it. but I am getting this error message

Error: Invalid Data. 
Review all error messages below to correct your data.
Apex trigger CaseTrigger caused an unexpected exception, contact your administrator: CaseTrigger: execution of AfterUpdate caused by: System.DmlException: Update failed. First exception on row 0 with id 5009000000mId8xAAC; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, CaseTrigger: maximum trigger depth exceeded Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x] Case trigger event AfterUpdate for [5009000000mId8x]: []: Class.CaseHandler.AfterUpdateCase: line 26, column 1

The code of my trigger is 
trigger CaseTrigger on Case (after update) {
    CaseHandler objCase = new CaseHandler();
    
    if(Trigger.isAfter && Trigger.isUpdate){
        objCase.AfterUpdateCase(Trigger.New);
    }
}

Code for Handler class of trigger

public with sharing class CaseHandler {
    list<Case> lstCloneCase = new list<Case>();
    map<Id,Case> mapCase = new map<Id,Case>();
    list<Case> lstUpdateCase = new list<Case>();
    
    public void AfterUpdateCase(list<Case> lstCase){
        for(Case objCase : lstCase){
            mapCase.put(objCase.Id,objCase);
            
            if(objCase.Auto_Close_Reopen__c == true){
                Case objCaseNew = new Case();
                objCaseNew.Status = 'Open';
                ObjCaseNew.Origin = 'Web';
                lstCloneCase.add(ObjCaseNew);
            }
        }
        insert lstCloneCase;
        
        for(Id idd : mapCase.keyset()){
            Case objCase = new Case(Id = idd);
            objCase.Auto_Close_Reopen__c = false; 
            lstUpdateCase.add(objCase);   
        }
        update lstUpdateCase;  
    }
}
Best Answer chosen by Gaurav Puranik
sandeep sankhlasandeep sankhla
Hi,

Please refer below link for more details...how we should use recurssion helper to avoid recurssion
 
In trigger we will use recusrssion helper like this 

		 
*/
trigger Case on Case (after insert, before update) {
	

	Case_Handler handler = new Case_Handler();
	
	// will be called on after insert of a case object.
	if(Trigger.isInsert && Trigger.isAfter && Case_RecursionHelper.getisInsert())
	{
		
		Case_RecursionHelper.setisInsert(false);
		// call the handler method
		handler.onAfterInsert(Trigger.New); 
	}
	
	//will be called on after insert of a case object.
	if(Trigger.isUpdate && Trigger.isBefore && Case_RecursionHelper.getisUpdate())
	{
		
		Case_RecursionHelper.setisUpdate(false);
		// call the handler method
		handler.onBeforeUpdate(Trigger.NewMap, Trigger.OldMap);
	}

}



helper class for boolena variable


public with sharing class Case_RecursionHelper {

    public static boolean isInsert = true;
    public static boolean isUpdate = true;
    
 
    // for After Insert
    public static boolean getisInsert()
    {
        return isInsert;
    }

    public static void setisInsert(boolean t)
    {
        isInsert = t;
    }
 
	// for Before Update
	public static boolean getisUpdate()
	{
		return isUpdate;
	}
	
	public static void setisUpdate(boolean t)
	{
		isUpdate = t;
	}
}

Please refer the above code as reference and male use of reurssion helper to avod it..

P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.

Thanks,
Sandeep
Salesforce Certified Developer 

All Answers

sandeep sankhlasandeep sankhla
Hi

This error is due to recurssion, As your trigger is firing on after update and yhen again inside trigger you are updating the cases, then again trigger will fire and then again you will update teh case, and so on..so it will go in recurssion..

You need to use a recurssion handler to solve this error..

Thanks,
Sandeep
sandeep sankhlasandeep sankhla
Hi,

Please refer below link for more details...how we should use recurssion helper to avoid recurssion
 
In trigger we will use recusrssion helper like this 

		 
*/
trigger Case on Case (after insert, before update) {
	

	Case_Handler handler = new Case_Handler();
	
	// will be called on after insert of a case object.
	if(Trigger.isInsert && Trigger.isAfter && Case_RecursionHelper.getisInsert())
	{
		
		Case_RecursionHelper.setisInsert(false);
		// call the handler method
		handler.onAfterInsert(Trigger.New); 
	}
	
	//will be called on after insert of a case object.
	if(Trigger.isUpdate && Trigger.isBefore && Case_RecursionHelper.getisUpdate())
	{
		
		Case_RecursionHelper.setisUpdate(false);
		// call the handler method
		handler.onBeforeUpdate(Trigger.NewMap, Trigger.OldMap);
	}

}



helper class for boolena variable


public with sharing class Case_RecursionHelper {

    public static boolean isInsert = true;
    public static boolean isUpdate = true;
    
 
    // for After Insert
    public static boolean getisInsert()
    {
        return isInsert;
    }

    public static void setisInsert(boolean t)
    {
        isInsert = t;
    }
 
	// for Before Update
	public static boolean getisUpdate()
	{
		return isUpdate;
	}
	
	public static void setisUpdate(boolean t)
	{
		isUpdate = t;
	}
}

Please refer the above code as reference and male use of reurssion helper to avod it..

P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.

Thanks,
Sandeep
Salesforce Certified Developer 
This was selected as the best answer
Gaurav  PuranikGaurav Puranik
Thanks Sandeep!!