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
rameshvpsgrameshvpsg 

SQL Error

I am using below trigger part of before update trigger on parent object to roll up amount from child object. This works fine for few records, but throws out too many soql queries error.

Please guide me  how i can bulkify this trigger.

 

Note: revenue_schedule__c is the parent object and training_sechedule__c is the child object.

 

for (revenue_schedule__c revenueschvar : trigger.new)
{
AggregateResult[] groupedResults = [SELECT SUM(amount__c)amt FROM training_schedule__c WHERE Revenue_Schedule__c = :revenueschvar.id];
revenueschvar.FTE_Revenue__c =(decimal)groupedResults[0].

get('amt');

}
jd123jd123

Hi

 

remove the SOQl inside for loop and write out side for by using IN Operator.

 

If you are not able to write please let me know i can help you out.

rameshvpsgrameshvpsg

Hi Mahi,

Yes please. I am not from coding background, please help me on this.

Thanks

jd123jd123

Ok no problem,

 

try this code

 

List<id> rsList=new List<id>();

for (revenue_schedule__c revenueschvar : trigger.new)
{
   rsList.add(revenueschvar.id);

}

 

Decimal result = [SELECT SUM(amount__c) FROM training_schedule__c WHERE Revenue_Schedule__c IN rsList];
 
 
if it is not working please let me know.
 
 
rameshvpsgrameshvpsg

Hi Mahi,

Thanks for your help. I used the below code provided by another member and it worked.

Thanks again.

 

Map<id,AggregateResult> aMap = new Map<id,AggregateResult>();
AggregateResult[] groupedResults = [SELECT Revenue_Schedule__c rid, SUM(amount__c)amt FROM training_schedule__c WHERE Revenue_Schedule__c = :trigger.newMap.Keyset() group by Revenue_Schedule__c];
for(AggregateResult arrtemp : groupedResults)
{
aMap.put( (Id)arrtemp.get('rid'), arrtemp);
}
for (revenue_schedule__c revenueschvar : trigger.new)
{
    AggregateResult arr = amap.get(revenueschvar.id);
    revenueschvar.totalamount__c = (decimal)arr.get('amt');
}