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
Dev87Dev87 

Trigger -Too many SOQL queries: 101 

Hello, 
I have trigger before insert, et before update d'un objet 
trigger CampaignMemberupdate on CampaignMember (before insert,before update) {
List <campaignmember> Cmember = new List<campaignmember>();
     for(campaignmember cmb:Trigger.new){
	    {
         Cmember.add(cmb);	    
		}         
    if(!Cmember.isEmpty()){        
        id cmsourceid; 
        for (campaignmember cmemb:Cmember )
        {
        if (cmemb.CampaignId != null)
        {
            for (campaignmember cmemberold :[Select id,  name,ContactId, Registation_Date2__c,RegistrationDate__c, type__c, appel_telephonique_orga__c, Discount_Code__c, Type_d_inscription__c from CampaignMember where CampaignId  in (select  CampagneSource__c from Campaign where id =: cmemb.CampaignId) ])   
         {
             if(cmemb.ContactId == cmemberold.ContactId)
             {            
                 cmemb.Discountcodeold__c = cmemberold.Discount_Code__c;
                 cmemb.AppelTelephoniqueorgold__c = cmemberold.appel_telephonique_orga__c;
                 cmemb.Registrationdateold__c = cmemberold.RegistrationDate__c;
                 cmemb.TypeInscriptionOld__c = cmemberold.type__c;
            }             
         } 
        }
        }
      
             
                      }          
                                     }


}

When I deploy in Prod environnement, I have this error: 

Too many SOQL queries: 101 
Stack Trace: Trigger.CampaignMemberupdate: line 13, column 1

Can someone help me.
Shiva RajendranShiva Rajendran
Hi dev87,
You have an query and subquery inside fore loop. 
Unless you have heap issue dont use soql inside for query
In your current case ,even if you inserted or updated just around 200 campaign member too..(scenerio may be even more campaignMember records be inserted or updated ,that infact worsen the state further)
if CampaignMember records returned from the query is around than 10000 @line 13 ,then you will face the soql query limit exception.
since soql foreach will return only 200records and then for next 200 records another soql query will be made and so on and in your case ,since you have subquery as well,each soql execution counts for 2 soql query limit.

 
campaignmember cmemberold :[Select id,  name,ContactId, Registation_Date2__c,RegistrationDate__c, type__c, appel_telephonique_orga__c, Discount_Code__c, Type_d_inscription__c from CampaignMember where CampaignId  in (select  CampagneSource__c from Campaign where id =: cmemb.CampaignId) 
run this query and then do the processing

Hope this helps

Thanks,
Shiva RV
 
Niraj Kr SinghNiraj Kr Singh
Hi Dev87,

In your code For loop inside For loop, Where in Inner For loop your are doing SOQL (Line no: 13). That is causing of "Too many SOQL queries: 101". Means your outer for loop is running more than 100 times which not a good practice.
You have to keep all related records in a list before 1st loop and use that List in inner loop to iterate over records. I have tried to simplify your code plz try it and let me know if it has work for you and mark it of ur answer for other references.
trigger CampaignMemberupdate on CampaignMember(before insert, before update) {
    //List < campaignmember > Cmember = new List < campaignmember > ();
	Set<Id> campaignIdSet = new Set<Id>();
    
	for (campaignmember cmb: Trigger.new) {
		if (cmb.CampaignId != null) {
			//Cmember.add(cmb);
			campaignIdSet.add(cmb.CampaignId);
		}
	}
	
	if(!campaignIdSet.isEmpty()) {
		//Get your all existing campaign member related to campaigns.
		List<campaignmember> allExistingCMemberList = [Select id, name, ContactId, Registation_Date2__c, RegistrationDate__c, type__c, appel_telephonique_orga__c, Discount_Code__c, Type_d_inscription__c from CampaignMember Where CampaignId in campaignIdSet];
		
		if(allExistingCMemberList != null) {
			for(campaignmember cmemb: Trigger.new) {
				if(cmemb.CampaignId != null) {
					for (campaignmember cmemberold : allExistingCMemberList) { //Your code issue was here. You have made SOQL, which was running inside the above "for" loop.
                        if (cmemb.ContactId == cmemberold.ContactId) {
                            cmemb.Discountcodeold__c = cmemberold.Discount_Code__c;
                            cmemb.AppelTelephoniqueorgold__c = cmemberold.appel_telephonique_orga__c;
                            cmemb.Registrationdateold__c = cmemberold.RegistrationDate__c;
                            cmemb.TypeInscriptionOld__c = cmemberold.type__c;
                        }
                    }
				}
			}
		}
	}
}

Refer : https://developer.salesforce.com/page/Apex_Code_Best_Practices  for apex best practices.

Thanks
Niraj