You need to sign in to do that
Don't have an account?

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;
}
}
}
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;
}
}
}
Hey Meera,
the code you have written seems to be correct. What is the thing you want to change here?
Regards,
Priya Ranjan
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
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.
Thanks for replying . But I keep getting the below error