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
iKnowSFDCiKnowSFDC 

Too Many SOQL Queries Error

I'm calling a static method from a trigger. I had all the of the methods in one originally, but had to change it to support bulk processing.  I'm using a design pattern I've used elsewhere successfully, however for some reason, I'm not getting past the initial queries in the method. I'm not seeing why that's happening and am hoping someone has a suggestion. 

 

Thanks!

JoAnn

 

Trigger: 

trigger notifyPtnrOfNewLead on Lead (after insert, after update) {
    	List<Lead> leadsInTrigger = new List<Lead>();
    	String[] ptnrs= new List<String>();

    
    if(!controlTriggerRecursion.hasAlreadyLooped()){
        
        for(Lead l: trigger.new){
               if(l.Preferred_Partner_for_Tech_Purchases__c.length()>0){
                   leadsIntrigger.add(l);
                   ptnrs.add(l.Preferred_Partner_for_Tech_Purchases__c);
                    }
        }
    }
    		controlTriggerRecursion.setHasAlreadyLooped();
        	ptrCampaignHandling.findPtrCampaign(leadsInTrigger,ptnrs);
       
}

 

 

Class & Method: 

 

public class ptrCampaignHandling{
    
    public static void findPtrCampaign(List<Lead> ptrLead, String[] cmpaignPtr){

Map<String, Campaign> ptnrCampaignMap = new Map<String, Campaign>(); //This Query and the one for Accounts below are looping, but I'm not understanding why...
List<Campaign> camps = [SELECT id, Name, Campaign_Partner__c, Primary_Partner_Contact__c, Email_Template_Name__c, isActive, StartDate, EndDate, Type, Primary_Partner_Contact__r.Email FROM Campaign WHERE Type = 'Partners' AND IsActive = True]; for(Campaign cmp : camps){ ptnrCampaignMap.put(cmp.Name,cmp); } Map<String, Id> cmpPartnerId = new Map<String, Id>(); List<Account> ptrAccts = [SELECT id, Name FROM Account WHERE Type = 'Partner' AND Partner_Status__c = 'Agreement Signed' ORDER by CreatedDate DESC]; for(Account pa: ptrAccts){ cmpPartnerId.put(pa.Name, pa.id); } Map<Lead, Id> cmsToCreate = new Map<Lead, Id>(); List<Lead> newCampaignsToCreate = new List<Lead>(); for(Lead newLead : ptrLead){ String campName = newLead.pi_campaign__c + ' - ' + newLead.Preferred_Partner_for_Tech_Purchases__c; Campaign ptnrCampaign = ptnrCampaignMap.get(campName); if(ptnrCampaign != NULL){ cmsToCreate.put(newLead, ptnrCampaign.id); } else { newCampaignsToCreate.add(newLead); } } insertCamp(newCampaignsToCreate, cmpPartnerId); createNewCampMembers(cmsToCreate); } public static void insertCamp(Lead[] newCampsToCreate, Map<String, Id> cmptrList){ List<Campaign> newCampsToInsert = new List<Campaign>(); String[] CampaignPartners; for(Lead l : newCampsToCreate){ String campName = l.pi_campaign__c + ' - ' + l.Preferred_Partner_for_Tech_Purchases__c; Campaign newPtnrCampaign = new Campaign(); newPtnrCampaign.Name = campName; newPtnrCampaign.Type = 'Partners'; newPtnrCampaign.StartDate = date.today(); newPtnrCampaign.EndDate = date.today().addMonths(3); newPtnrCampaign.Campaign_Partner__c = newPtnrCampaign.Primary_Partner_Contact__c = cmptrList.get(l.Preferred_Partner_for_Tech_Purchases__c); newPtnrCampaign.isActive = true; newPtnrCampaign.Email_Template_Name__c = l.pi_campaign__c + ' - Lead Notification'; newcampsToInsert.add(newPtnrCampaign); campaignPartners.add(cmptrList.get(l.Preferred_Partner_for_Tech_Purchases__c)); } insert newCampsToInsert; findPtrCampaign(newCampsToCreate, campaignPartners); } public static void createNewCampMembers(Map<Lead, Id> newCM){ CampaignMember cm = new CampaignMember(); List<CampaignMember> cmsToInsert = new List<CampaignMember>(); for(Lead l : newCM.keySet()){ cm.CampaignId = newCM.get(l); cm.LeadId = l.id; cm.Status = 'Responded'; cmsToInsert.add(cm); } insert cmsToInsert; } }

 

Best Answer chosen by Admin (Salesforce Developers) 
Kiran  KurellaKiran Kurella

 

I think the issue is with the following line in insertCamp function. This line is recursively calling the parent function and hence you are running into this issue. Try commenting the line and run your process and hopefully it will resolve the issue.

 

If you need to call the parent function again then have another static set to store the processed ids so that you can end the loop once you processed all possible combinations.

 

findPtrCampaign(newCampsToCreate, campaignPartners);

 

If this post solves your problem kindly mark it as solution. if this post is helpful please throw Kudos.

All Answers

Avidev9Avidev9

I think you have miss placed brackets @ trigger.

 

Try this 

 

trigger notifyPtnrOfNewLead on Lead(after insert, after update) {
    List < Lead > leadsInTrigger = new List < Lead > ();
    String[] ptnrs = new List < String > ();


    if (!controlTriggerRecursion.hasAlreadyLooped()) {

        for (Lead l: trigger.new) {
            if (l.Preferred_Partner_for_Tech_Purchases__c.length() > 0) {
                leadsIntrigger.add(l);
                ptnrs.add(l.Preferred_Partner_for_Tech_Purchases__c);
            }
        }
        controlTriggerRecursion.setHasAlreadyLooped();
        ptrCampaignHandling.findPtrCampaign(leadsInTrigger, ptnrs);
    }
    

}

 

iKnowSFDCiKnowSFDC

Hi Avi,

 

Thanks for the feedback - moved the bracket as suggested, however still getting the same error.  I'm still looping on the same two queries.  

 

 

Kiran  KurellaKiran Kurella

 

I think the issue is with the following line in insertCamp function. This line is recursively calling the parent function and hence you are running into this issue. Try commenting the line and run your process and hopefully it will resolve the issue.

 

If you need to call the parent function again then have another static set to store the processed ids so that you can end the loop once you processed all possible combinations.

 

findPtrCampaign(newCampsToCreate, campaignPartners);

 

If this post solves your problem kindly mark it as solution. if this post is helpful please throw Kudos.

This was selected as the best answer
Rajesh SriramuluRajesh Sriramulu

Hi,


Yes, CodeWizard said right one.

Try to call the static boolean variable from class and try to avoid it from recursive calling.

Regards,

Rajesh.

iKnowSFDCiKnowSFDC

Thank you all that had suggestions - it was a recursiveness issue.  Fixing that solved this issue and another one I has having with a similiar development pattern.

 

JoAnn