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
sfdc18sfdc18 

CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY

Hi,

I am getting below error in Apex trigger which updates field on parent obj based on value in child obj record

first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, updateRegion: maximum trigger depth exceeded SampleMasterObject

Apex Trigger Code

trigger updateRegion on SampleMasterObject__c (after insert, after update) {

ID smoId;
String country;
//String region;

for(SampleMasterObject__c s : Trigger.New){

smoId = s.Id;
system.debug('@@@@@@smoId@@@@@@@@@@ : '+smoId);
}

List<SampleChild1__c> lsc = new List<SampleChild1__c>();
lsc = [Select Id, Country__c from SampleChild1__c where SampleMasterObject__c =: smoId];
system.debug('@@@@@@lsc@@@@@@@@@@ : '+lsc);

for(SampleChild1__c sc : lsc) {

country = sc.Country__c;
system.debug('@@@@@@country@@@@@@@@@@ : '+country);
}

If(country == 'IN') {
SampleMasterObject__c sm = new SampleMasterObject__c(Id=smoId, Region__c = 'APAC');

//sm.Id = smoId;
//sm.Region__c = 'APAC';
system.debug('@@@@@@sm.Region__c@@@@@@@@@@ : '+sm.Region__c);
update sm;
}




}
Full Error Statement

Error: Invalid Data.
Review all error messages below to correct your data.
Apex trigger updateRegion caused an unexpected exception, contact your administrator: updateRegion: execution of AfterUpdate caused by: System.DmlException: Update failed. First exception on row 0 with id a0b90000009eu9JAAQ; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, updateRegion: maximum trigger depth exceeded SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J] SampleMasterObject trigger event AfterUpdate for [a0b90000009eu9J]: []: Trigger.updateRegion: line 31, column 1
Information:


Best Answer chosen by sfdc18
Shashikant SharmaShashikant Sharma
Your trigger is called recursively, you need to create a StopRecursion class .

public class stopRecursion {

private static Boolean stopRecursiveTriggerRun = false;

}
Change your trigger to add this on the top
trigger updateRegion on SampleMasterObject__c (after insert, after update) {

if( stopRecusion.stopRecursiveTriggerRun ) {
return;
}
stopRecusion.stopRecursiveTriggerRun = true;

ID smoId;
String country;

All Answers

Shashikant SharmaShashikant Sharma
Your trigger is called recursively, you need to create a StopRecursion class .

public class stopRecursion {

private static Boolean stopRecursiveTriggerRun = false;

}
Change your trigger to add this on the top
trigger updateRegion on SampleMasterObject__c (after insert, after update) {

if( stopRecusion.stopRecursiveTriggerRun ) {
return;
}
stopRecusion.stopRecursiveTriggerRun = true;

ID smoId;
String country;
This was selected as the best answer
Shashikant SharmaShashikant Sharma
just one thing that private static Boolean stopRecursiveTriggerRun = false
should be public otherwise you can not access it in trigger :)
sfdc18sfdc18
Hi Shashikant,

Thanks a lot.
What will happen if the child object has multiple records.
Shashikant SharmaShashikant Sharma
Your code is not bulkified you need to take Set<ID> in this 
for(SampleMasterObject__c s : Trigger.New){
smoId = s.Id;
system.debug('@@@@@@smoId@@@@@@@@@@ : '+smoId);
}

similarly you need to have List<SampleMasterObject__c> when you update.
HelloSanHelloSan
Shashikant Sharma how the below code works can u brief it clearly. I could unable to undertstood how does it really works
if( stopRecusion.stopRecursiveTriggerRun ) { return; }
stopRecusion.stopRecursiveTriggerRun = true;