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
sivapriyaa maniam sivakumarsivapriyaa maniam sivakumar 

Apex Trigger : CPU Time Limit exceed

Hi,
I am getting an error  as CPU Time Limit Exceed. 

Trigger Code : Its Update a Distributor Value from  Account  To Quote,QuoteLineItem & OpportunityLineItem Based on Product or Service.
trigger DistributorDiscountChangeTrigger on Account (after update) {
    System.debug('Trigger Entered');
    Map<Id, Account> accByIds = new Map<Id, Account>();
    Map<Id, Account> accsByIds = new Map<Id, Account>();
    
    for ( Account acc: Trigger.NEW) 
    {
        
        if ( acc.Distributor_Discount_Service__c != Trigger.oldMap.get(acc.Id).Distributor_Discount_Service__c || acc.Distributor_Discount_Product__c != Trigger.oldMap.get(acc.Id).Distributor_Discount_Product__c ) {
            accByIds.put( acc.Id, acc);
         
        }
    }

    if ( !accByIds.isEmpty() ) {
 
        
        Map<Id, Opportunity> oppByIds = new Map<Id,Opportunity>( [ SELECT Id, Distributor__c FROM Opportunity WHERE Distributor__c IN: accByIds.keySet() AND IsClosed = FALSE]);        
 
        List<OpportunityLineItem> oppProds = [ SELECT Id, Distributor_Discount_Product_HIDDEN__c,Distributor_Discount_Service_HIDDEN__c,Opportunity.Distributor__c, PricebookEntry.Product2.Family, Distributor_Discount_1__c, Opportunity.Distributor__r.Distributor_Discount_Service__c, Opportunity.Distributor__r.Distributor_Discount_Product__c FROM OpportunityLineItem WHERE OpportunityId IN: oppByIds.keySet()];
      
        List<QuoteLineItem> qlis = [ SELECT Id, Distributor_Discount_1__c, Quote.Opportunity.Distributor__c, PricebookEntry.Product2.Family, Quote.Opportunity.Distributor__r.Distributor_Discount_Service__c, Quote.Opportunity.Distributor__r.Distributor_Discount_Product__c FROM QuoteLineItem WHERE Quote.OpportunityId IN: oppByIds.keySet()];
       
        List<Quote> oppqt = [ SELECT Id, Distributor_Service_Discount_Temp__c,Opportunity.Distributor__c,Distributor_Product_Discount_Temp__c,Distributor__c FROM Quote WHERE Quote.OpportunityId IN: oppByIds.keySet()];
       
         for ( Quote qt: oppqt ) 
         {
              System.debug('Enter For Loop-Quote');
            if ( qt.Opportunity.Distributor__c == null ) {
                qt.Distributor_Product_Discount_Temp__c  = 0;
                qt.Distributor_Service_Discount_Temp__c=0;
                continue;
            }
            if ( qt.Opportunity.Distributor__c != null) {
                qt.Distributor_Product_Discount_Temp__c = accByIds.get( qt.Opportunity.Distributor__c ).Distributor_Discount_Product__c;
                 qt.Distributor_Service_Discount_Temp__c= accByIds.get( qt.Opportunity.Distributor__c ).Distributor_Discount_Service__c;
            }       
         }

        for ( QuoteLineItem qli: qlis ) {
     
            if ( qli.Quote.Opportunity.Distributor__c == null ) {
                qli.Distributor_Discount_1__c = 0;
                continue;
            }
            if ( qli.PricebookEntry.Product2.Family == 'Service') {
                   
                qli.Distributor_Discount_1__c = accByIds.get(qli.Quote.Opportunity.Distributor__c).Distributor_Discount_Service__c;
            } else if ( qli.PricebookEntry.Product2.Family != 'Non-Discount' ) {
                    
                qli.Distributor_Discount_1__c = accByIds.get(qli.Quote.Opportunity.Distributor__c).Distributor_Discount_Product__c;
            } else {

                qli.Distributor_Discount_1__c = 0;
            }
           } 
        
        for ( OpportunityLineItem oli: oppProds ) {
            System.debug('Enter For Loop-OpportunityLineItem');
            if ( oli.Opportunity.Distributor__c == null ) {
                oli.Distributor_Discount_1__c  = 0;
               oli.Distributor_Discount_Product_HIDDEN__c=0;
                oli.Distributor_Discount_Service_HIDDEN__c=0;
                continue;
            }
            if ( oli.PricebookEntry.Product2.Family == 'Service') {
                oli.Distributor_Discount_1__c = accByIds.get( oli.Opportunity.Distributor__c ).Distributor_Discount_Service__c;
                oli.Distributor_Discount_Service_HIDDEN__c=accByIds.get( oli.Opportunity.Distributor__c ).Distributor_Discount_Service__c;
            } else if ( oli.PricebookEntry.Product2.Family != 'Non-Discount' ) {
                oli.Distributor_Discount_1__c = accByIds.get( oli.Opportunity.Distributor__c ).Distributor_Discount_Product__c;
                oli.Distributor_Discount_Product_HIDDEN__c=accByIds.get( oli.Opportunity.Distributor__c ).Distributor_Discount_Product__c;
            } else {
                oli.Distributor_Discount_1__c = 0;
            }
        }
    
         update qlis; 
        update oppqt;
        update oppProds;
  
        }

}

Please suggest a solution.

Thanks
Sivapriyaa M S
pconpcon
What this means is something in your transaction is taking a long time and the runtime govenor is killing your trigger.  I suggest you load the logs for your trigger when you get this error and see what the flow is and what is taking the most time [1].  This may also be caused by a loop that you have not accoutned for in your trigger.  For example, you update an Account that updates your Opportunity.  There is a trigger on the Opportunity that updates the Account.  Now your stuck in a loop that will only be killed by the govenor.

[1] http://salesforce.stackexchange.com/a/119540/198