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
MohiniMohini 

Need help with the trigger to calculate average.

Scenario : I have written a trigger to update average of cost , amount and probability of child object product at parent object sub opportunity level (Actual Cost , Actual Amount and Actual Probability ) fields. I have written three separate methods for the same , Please help me to write inside one method.
Apex Trigger:


trigger AvgCalculateTrigger on Sub_Opportunity_Product__c (after insert, after update, after delete) {
    
    if( Trigger.isInsert || Trigger.isAfter || Trigger.isDelete ){
        if( Trigger.isAfter ){
           AvgCalculate.avgCalculate();
           AvgCalculate.avgCalculate1();
            AvgCalculate.avgCalculate2();
           
           
        }
    }
        
}





Apex Class

public class AvgCalculate {

    public static void avgCalculate (){
        Set<Id> subopptyIds = new Set<Id>();
        List<Sub_Opportunity__c> subopptyToUpdate = new List<Sub_Opportunity__c>();
      
        List< Sub_Opportunity_Product__c> sub = Trigger.isInsert || Trigger.isUpdate ? Trigger.New : Trigger.Old;
        for(Sub_Opportunity_Product__c  ct : sub ){
            subopptyIds.add( ct.Sub_Opportunity__c /*lookup field value of utilityrecord */ );
        }

        for( AggregateResult ag : [ SELECT Sub_Opportunity__c, AVG( Cost__c ) avg FROM Sub_Opportunity_Product__c
                                    GROUP BY Sub_Opportunity__c ] ){
             subopptyToUpdate.add( new Sub_Opportunity__c( 
                Id = (Id)ag.get('Sub_Opportunity__c'), 
                 Actual_Cost2__c = (Decimal)ag.get('avg') ) );                            
        }
         
      
         
         
              if(subopptyToUpdate.size() > 0 ){
            update  subopptyToUpdate;
        }
        
       
    }
    public static void avgCalculate1 (){
        Set<Id> subopptyIds1= new Set<Id>();
        List<Sub_Opportunity__c> subopptyToUpdate1 = new List<Sub_Opportunity__c>();
      
        List< Sub_Opportunity_Product__c> sub1 = Trigger.isInsert || Trigger.isUpdate ? Trigger.New : Trigger.Old;
        for(Sub_Opportunity_Product__c  ct : sub1 ){
            subopptyIds1.add( ct.Sub_Opportunity__c /*lookup field value of utilityrecord */ );
        }

        for( AggregateResult ag1 : [ SELECT Sub_Opportunity__c, AVG( Amount__c ) avg FROM Sub_Opportunity_Product__c
                                    GROUP BY Sub_Opportunity__c ] ){
             subopptyToUpdate1.add( new Sub_Opportunity__c( 
                Id = (Id)ag1.get('Sub_Opportunity__c'), 
                 Actual_Revenue2__c = (Decimal)ag1.get('avg') ) );                            
        }
         
         if(subopptyToUpdate1.size() > 0 ){
            update  subopptyToUpdate1;
        }
       
    }  
      public static void avgCalculate2 (){
        Set<Id> subopptyIds2= new Set<Id>();
        List<Sub_Opportunity__c> subopptyToUpdate2 = new List<Sub_Opportunity__c>();
      
        List< Sub_Opportunity_Product__c> sub2 = Trigger.isInsert || Trigger.isUpdate ? Trigger.New : Trigger.Old;
        for(Sub_Opportunity_Product__c  ct : sub2 ){
            subopptyIds2.add( ct.Sub_Opportunity__c /*lookup field value of utilityrecord */ );
        }

        for( AggregateResult ag2 : [ SELECT Sub_Opportunity__c, AVG( Probability__c ) avgprob FROM Sub_Opportunity_Product__c
                                    GROUP BY Sub_Opportunity__c ] ){
             subopptyToUpdate2.add( new Sub_Opportunity__c( 
                Id = (Id)ag2.get('Sub_Opportunity__c'), 
                 Probability__c = (Decimal)ag2.get('avgprob') ) );                            
        }
         
         if(subopptyToUpdate2.size() > 0 ){
            update  subopptyToUpdate2;
        }
       
    }  
  
 }
 
PriyaPriya (Salesforce Developers) 

Hey Meera,

the code you have written seems to be correct. What is the thing you want to change here?

Regards,

Priya Ranjan

MohiniMohini
Hi Priya , 
I want to achieve the average of all three fields using a single  method and not have three separately written which makes it lengthy . Is there a way to reduce my code size
IqbalIqbal
Hi Meera,

Please try the below code in your apex trigger handler. Let me know incase you get any error

public class AvgCalculate {

    public static void avgCalculate (){
        Set<Id> subopptyIds = new Set<Id>();
        List<Sub_Opportunity__c> subopptyToUpdate = new List<Sub_Opportunity__c>();
      
        List< Sub_Opportunity_Product__c> sub = Trigger.isInsert || Trigger.isUpdate ? Trigger.New : Trigger.Old;
        for(Sub_Opportunity_Product__c  ct : sub ){
            subopptyIds.add( ct.Sub_Opportunity__c /*lookup field value of utilityrecord */ );
        }
        
        subopptyToUpdate.addAll(calculatesubOpptyList(subopptyIds));
        if(subopptyToUpdate.size() > 0 ){
            update  subopptyToUpdate;
        }
        
       
    }
    
    public static List<Sub_Opportunity__c> calculatesubOpptyList(Set<Id> subOpptyIds){
        List<Sub_Opportunity__c> subopptyToUpdate = new List<Sub_Opportunity__c>();
        for( AggregateResult ag : [ SELECT Sub_Opportunity__c, AVG( Cost__c ) avg FROM Sub_Opportunity_Product__c
                                    GROUP BY Sub_Opportunity__c ] ){
             subopptyToUpdate.add( new Sub_Opportunity__c( 
                Id = (Id)ag.get('Sub_Opportunity__c'), 
                 Actual_Cost2__c = (Decimal)ag.get('avg') ) );                            
        }
        for( AggregateResult ag1 : [ SELECT Sub_Opportunity__c, AVG( Amount__c ) avg FROM Sub_Opportunity_Product__c
                                    GROUP BY Sub_Opportunity__c ] ){
             subopptyToUpdate.add( new Sub_Opportunity__c( 
                Id = (Id)ag1.get('Sub_Opportunity__c'), 
                 Actual_Revenue2__c = (Decimal)ag1.get('avg') ) );                            
        }
        for( AggregateResult ag2 : [ SELECT Sub_Opportunity__c, AVG( Probability__c ) avgprob FROM Sub_Opportunity_Product__c
                                    GROUP BY Sub_Opportunity__c ] ){
             subopptyToUpdate.add( new Sub_Opportunity__c( 
                Id = (Id)ag2.get('Sub_Opportunity__c'), 
                 Probability__c = (Decimal)ag2.get('avgprob') ) );                            
        }
        
        return subopptyToUpdate;
    }
     
 }

Please mark this answer if it solve your query and close this request.
MohiniMohini
Hi Iqbal,

Thanks for replying . But I keep getting the below error error