-2

I have a before insert and before update trigger with helpers and helper for these helpers. In both helpers I get the 'Too many SOQL queries: 101' error because of queries in loops. How do I get SOQLs out of the loop correctly? P.S. I use the BurgerHelper class in 2 helpers but show just one of them for example.

Trigger:

trigger BurgerTrigger on Burger__c (before insert, before update) {
        SpecialBurgerHelper specialBurgerHelper = new SpecialBurgerHelper();

        if(Trigger.isBefore && Trigger.isInsert) {
            specialBurgerHelper.burgerSetup(Trigger.new);
        }
        if(Trigger.isBefore && Trigger.isUpdate) {
            specialBurgerHelper.burgerSetup(Trigger.new);
        }
    }

Trigger Helper:

public class SpecialBurgerHelper{
        public void burgerSetup(List<Burger__c> newBurgers){
            BurgerHelper burgerHelper = new BurgerHelper();
            for(Burger__c burger : newBurgers){
                //end here I get the 'Too many SOQL queries: 101' error:
                burger.EditablePrice__c = burgerHelper.getPrice(burger);
            }
        }
    }

Helper of Trigger Helper:

public class BurgerHelper {
        public Decimal getPrice(Burger__c newBurger){
            Decimal price = newBurger.EditablePrice__c;

            if(newBurger.Opportunity__c != null && newBurger.CreatedDate >= Date.TODAY()-5){
                oppIds.add(newBurger.Opportunity__c);
            }
            if(newBurger.FoodOrder__c != null && newBurger.CreatedDate >= Date.TODAY()-5){
                //1st query:
                FoodOrder__c foodOrder = [SELECT Id, Opportunity__c FROM FoodOrder__c WHERE Id =: newBurger.FoodOrder__c];
                oppIds.add(foodOrder.Opportunity__c);
            }

            //2nd query:
            Map<Id,Opportunity> helpMapForOpps = new Map<Id,Opportunity>([SELECT Id, SpecialID__c FROM Opportunity WHERE Id IN : oppIds]);
            if(newBurger.EditablePrice__c == null && helpMapForOpps.get(newBurger.Opportunity__c).SpecialID__c == '44445'){
                price = 25;
            } else{
                price = 45;
            }
            return price;
        }
    }
1
  • 1
    You need to Bukifly getPricemethod to accept List<Burger__c> and return collection. Feb 12, 2020 at 15:29

1 Answer 1

2

You need to bulkify it. Did litle tweak your code. Below might help you,

 public class SpecialBurgerHelper{
            public void burgerSetup(List<Burger__c> newBurgers){
            set<id> set_OppIds = new set<id>();
            set<id> set_Burger = new set<id>();
            BurgerHelper burgerHelper = new BurgerHelper();
            for(Burger__c burger : newBurgers){
                if(newBurger.FoodOrder__c != null && newBurger.CreatedDate >= Date.TODAY()-5){
                    set_Burger.add(newBurger.FoodOrder__c);
                }
                 if(newBurger.Opportunity__c != null && newBurger.CreatedDate >= Date.TODAY()-5){
                    set_OppIds.add(newBurger.Opportunity__c);
                }
            }
            for( FoodOrder__c foodOrder : [SELECT Id, Opportunity__c FROM FoodOrder__c WHERE Id in: set_Burger]){
                set_OppIds.add(foodOrder.Opportunity__c);
            }
            Map<Id,Opportunity> helpMapForOpps = new Map<Id,Opportunity>([SELECT Id, SpecialID__c FROM Opportunity WHERE Id IN : set_OppIds]);
             if(newBurger.EditablePrice__c == null && helpMapForOpps.containskey(newBurger.Opportunity__c)){
               burger.EditablePrice__c =  helpMapForOpps.get(newBurger.Opportunity__c).SpecialID__c == '44445' ? 25 : 45;
            }
        }
    }
2
  • Thank you. But I wrote that I use the BurgerHelper class in 2 helpers :) That's why I made it as a separated class. Feb 12, 2020 at 15:46
  • 1
    So you need to take this sort of approach and refactor the helpers to match
    – Phil W
    Feb 12, 2020 at 15:54

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .