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
SSK9SSK9 

Apex Error:CustomerPricingModifier: System.LimitException: Too many SOQL queries: 101" error

Hi ,
Can you help me fix this error .CustomerPricingModifier: System.LimitException: Too many SOQL queries: 101" error
I get this error when Data is sent from Orcale to Salesforce via Mulesoft.

trigger CustomerPricingModifier on Customer_Pricing_Modifiers__c (after insert)
{
    for(Customer_Pricing_Modifiers__c cp:Trigger.New){
        integer i=[Select count() from Customer_Pricing_Modifiers__c WHERE External_Unique_ID__c=:cp.External_Unique_ID__c];
        if(i>1){
        CustomerDupTriggHandler.DuplicateHandler(trigger.new);
        }
    }
}
SSK9SSK9
This is the Apex Class. Can you fix it.
public class CustomerDupTriggHandler {

    static Map<decimal, Customer_Pricing_Modifiers__c> getExistingDuplicates(List<Customer_Pricing_Modifiers__c> exp)
        {
            Set<decimal> keys = new Set<decimal>();
            
            for (Customer_Pricing_Modifiers__c e : exp)
            {
                keys.add(e.External_Unique_ID__c);   
            } 
            
            Map<decimal, Customer_Pricing_Modifiers__c> existing = new Map<decimal, Customer_Pricing_Modifiers__c>();
            for (Customer_Pricing_Modifiers__c record : [SELECT id,External_Unique_ID__c FROM Customer_Pricing_Modifiers__c WHERE External_Unique_ID__c IN:keys])   
            {
                existing.put(record.External_Unique_ID__c, record);
            }
            return existing;
        }
    
    
    public static void DuplicateHandler(List<Customer_Pricing_Modifiers__c> records){
        
        //integer i=[Select count() from Customer_Pricing_Modifiers__c WHERE External_Unique_ID__c=:records[0].External_Unique_ID__c];
        
        //if(i>1){
            
            List<Id> duplicateIds = new List<Id>();
            Map<decimal, Customer_Pricing_Modifiers__c> existing = getExistingDuplicates(records);
            for (Customer_Pricing_Modifiers__c record : records)
            {
                decimal key = record.External_Unique_ID__c;
                if (existing.containsKey(key))
                {
                    duplicateIds.add(record.Id);
                    Customer_Pricing_Modifiers__c clone = record.clone();
                    clone.Id = existing.get(key).Id;
                    existing.put(key, clone);
                }
            }
            update existing.values();
            Database.delete(duplicateIds);
            // error handling and transaction control recommended
        //}
    }

}

 
Arun MKArun MK
Hi,

You should not have a query inside a for loop. You are querying 2 times for each trigger records. try the following code
trigger CustomerPricingModifier on Customer_Pricing_Modifiers__c (after insert)
{
	Map<decimal, Customer_Pricing_Modifiers__c> externalIdToRecordMap = new Map<decimal, Customer_Pricing_Modifiers__c>();
    for(Customer_Pricing_Modifiers__c cp:Trigger.New){
    	if(cp.External_Unique_ID__c != null){
    		externalIdToRecordMap.put(cp.External_Unique_ID__c, cp);
    	}
    }

    List<Id> duplicateIds = new List<Id>();
    Map<decimal, Customer_Pricing_Modifiers__c> updateMap = new Map<decimal, Customer_Pricing_Modifiers__c>();
    for(Customer_Pricing_Modifiers__c existingCpm : [SELECT Id, External_Unique_ID__c FROM Customer_Pricing_Modifiers__c WHERE External_Unique_ID__c IN :externalIdToRecordMap.keySet() AND Id NOT IN :trigger.new]){
    	if(externalIdToRecordMap.containsKey(existingCpm.External_Unique_ID__c)){
    		Customer_Pricing_Modifiers__c newCpm = externalIdToRecordMap.get(existingCpm.External_Unique_ID__c);
    		duplicateIds.add(newCpm.id
);
    		Customer_Pricing_Modifiers__c clone = newCpm.clone();
    		clone.Id = existingCpm.Id;
    		updateMap.put(key, clone);
    	}
    }

    update updateMap.values();
    Database.delete(duplicateIds);

}