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
irwanrjirwanrj 

Error using aggregate result

Hi everyone, 

I am newbie in apex, then I am having a trouble with function aggregate result,
I have created apex class below : 
public class AdvanceRequestClass 
{
    /*public static void isActiveValidation(Advance_Request__c[] AdvRequest)
    {
        for(Advance_Request__c adv : AdvRequest)
        {
            if(adv.Is_Active__c == false)
            {
                adv.addError('You cannot update or delete this advance request, it has been used in expense request.');
            }
        }
        
    }*/
	
	List<Work__c> works ;
  Utilities util;
  public AdvanceRequestClass(List<Advance_Request__c> triggerNew, List<Advance_Request__c> triggerOld, Boolean deleteFlag){
    Set<String> InvoiceId = new Set<String>();
        Set<String> WorkIds = new Set<String>();
        List<Advance_Request__c> AdvanceRequest;
        if(deleteFlag){
          AdvanceRequest = triggerOld;
        }else{
          AdvanceRequest = triggerNew;
        }
        for (Advance_Request__c advanceReq: AdvanceRequest) 
        {           
            WorkIds.add(advanceReq.Work_Id__c);
        }
        works = new List<Work__c>([SELECT Id, Name, Total_Invoice_Amount__c,  Project_Code__c, BAST_Submit_Term_I__c, Work_Status__c, Invoice_Date_Term_I__c, Invoice_Date_Term_II__c, Invoice_Date_DP_II__c, Invoice_Date_DP_III__c FROM Work__c WHERE Id in :WorkIds]);
    util = new Utilities();
    
  }
  
	
	
	
}
 
 public void setWorkAmount(List<Advance_Request__c> AdvanceRequest){
    system.debug('works --------------'+ works);
    AggregateResult[] advReq = 
                [select Work_Id__c, SUM(Converted_Amount__c)totalAdvance FROM Advance_Request__c    
                 where Work_Id__c IN :works AND Status__c != 'Rejected' GROUP BY Work_Id__c];
                 system.debug('advReq ---------'+advReq +'------');
        Map<Id, AggregateResult> advMap = new Map <Id, AggregateResult>();
        for(AggregateResult ar : advReq){
            advMap.put((Id)ar.get('Work_Id__c'), ar);
        }
    
        //List <Work__c> workList = [SELECT Id, Name, Total_Advance_Request__c FROM Work__c WHERE Id IN :workIdSet  ];
        
        for(Work__c wid : works ){
          if(advMap.get(wid.Id) != null){
              AggregateResult ar = advMap.get(wid.Id);
              wid.Total_Advance_Request__c = (Decimal)ar.get('totalAdvance');
            }
        }
        
        
  }

then I get error : Error: Compile Error: unexpected token: public at line 40 column 1


could you please help me?

Thanks in advance.
Best Answer chosen by irwanrj
Ashish Dev 3Ashish Dev 3
You methods setWorkAmount is out of class defination just keep it inside. like below.
public class AdvanceRequestClass 
{
    /*public static void isActiveValidation(Advance_Request__c[] AdvRequest)
    {
        for(Advance_Request__c adv : AdvRequest)
        {
            if(adv.Is_Active__c == false)
            {
                adv.addError('You cannot update or delete this advance request, it has been used in expense request.');
            }
        }
        
    }*/
	
	List<Work__c> works ;
  Utilities util;
  public AdvanceRequestClass(List<Advance_Request__c> triggerNew, List<Advance_Request__c> triggerOld, Boolean deleteFlag){
    Set<String> InvoiceId = new Set<String>();
        Set<String> WorkIds = new Set<String>();
        List<Advance_Request__c> AdvanceRequest;
        if(deleteFlag){
          AdvanceRequest = triggerOld;
        }else{
          AdvanceRequest = triggerNew;
        }
        for (Advance_Request__c advanceReq: AdvanceRequest) 
        {           
            WorkIds.add(advanceReq.Work_Id__c);
        }
        works = new List<Work__c>([SELECT Id, Name, Total_Invoice_Amount__c,  Project_Code__c, BAST_Submit_Term_I__c, Work_Status__c, Invoice_Date_Term_I__c, Invoice_Date_Term_II__c, Invoice_Date_DP_II__c, Invoice_Date_DP_III__c FROM Work__c WHERE Id in :WorkIds]);
    util = new Utilities();
    
  }
  public void setWorkAmount(List<Advance_Request__c> AdvanceRequest){
    system.debug('works --------------'+ works);
    AggregateResult[] advReq = 
                [select Work_Id__c, SUM(Converted_Amount__c)totalAdvance FROM Advance_Request__c    
                 where Work_Id__c IN :works AND Status__c != 'Rejected' GROUP BY Work_Id__c];
                 system.debug('advReq ---------'+advReq +'------');
        Map<Id, AggregateResult> advMap = new Map <Id, AggregateResult>();
        for(AggregateResult ar : advReq){
            advMap.put((Id)ar.get('Work_Id__c'), ar);
        }
    
        //List <Work__c> workList = [SELECT Id, Name, Total_Advance_Request__c FROM Work__c WHERE Id IN :workIdSet  ];
        
        for(Work__c wid : works ){
          if(advMap.get(wid.Id) != null){
              AggregateResult ar = advMap.get(wid.Id);
              wid.Total_Advance_Request__c = (Decimal)ar.get('totalAdvance');
            }
        }
        
        
  }
	
	
	
}

 

All Answers

Ashish Dev 3Ashish Dev 3
You methods setWorkAmount is out of class defination just keep it inside. like below.
public class AdvanceRequestClass 
{
    /*public static void isActiveValidation(Advance_Request__c[] AdvRequest)
    {
        for(Advance_Request__c adv : AdvRequest)
        {
            if(adv.Is_Active__c == false)
            {
                adv.addError('You cannot update or delete this advance request, it has been used in expense request.');
            }
        }
        
    }*/
	
	List<Work__c> works ;
  Utilities util;
  public AdvanceRequestClass(List<Advance_Request__c> triggerNew, List<Advance_Request__c> triggerOld, Boolean deleteFlag){
    Set<String> InvoiceId = new Set<String>();
        Set<String> WorkIds = new Set<String>();
        List<Advance_Request__c> AdvanceRequest;
        if(deleteFlag){
          AdvanceRequest = triggerOld;
        }else{
          AdvanceRequest = triggerNew;
        }
        for (Advance_Request__c advanceReq: AdvanceRequest) 
        {           
            WorkIds.add(advanceReq.Work_Id__c);
        }
        works = new List<Work__c>([SELECT Id, Name, Total_Invoice_Amount__c,  Project_Code__c, BAST_Submit_Term_I__c, Work_Status__c, Invoice_Date_Term_I__c, Invoice_Date_Term_II__c, Invoice_Date_DP_II__c, Invoice_Date_DP_III__c FROM Work__c WHERE Id in :WorkIds]);
    util = new Utilities();
    
  }
  public void setWorkAmount(List<Advance_Request__c> AdvanceRequest){
    system.debug('works --------------'+ works);
    AggregateResult[] advReq = 
                [select Work_Id__c, SUM(Converted_Amount__c)totalAdvance FROM Advance_Request__c    
                 where Work_Id__c IN :works AND Status__c != 'Rejected' GROUP BY Work_Id__c];
                 system.debug('advReq ---------'+advReq +'------');
        Map<Id, AggregateResult> advMap = new Map <Id, AggregateResult>();
        for(AggregateResult ar : advReq){
            advMap.put((Id)ar.get('Work_Id__c'), ar);
        }
    
        //List <Work__c> workList = [SELECT Id, Name, Total_Advance_Request__c FROM Work__c WHERE Id IN :workIdSet  ];
        
        for(Work__c wid : works ){
          if(advMap.get(wid.Id) != null){
              AggregateResult ar = advMap.get(wid.Id);
              wid.Total_Advance_Request__c = (Decimal)ar.get('totalAdvance');
            }
        }
        
        
  }
	
	
	
}

 
This was selected as the best answer
irwanrjirwanrj
Thank you Ashish Dev 3.. you're the best!
irwanrjirwanrj
Dear Ashish Dev 3, recently i facing new error like this : 
Error: Compile Error: Entity is not api accessible at line 1 column 8
public class AdvanceRequestClass
{
    /*public static void isActiveValidation(Advance_Request__c[] AdvRequest)
    {
        for(Advance_Request__c adv : AdvRequest)
        {
            if(adv.Is_Active__c == false)
            {
                adv.addError('You cannot update or delete this advance request, it has been used in expense request.');
            }
        }
        
    }*/
    
    List<Work__c> works ;
  Utilities util;
  public AdvanceRequestClass(List<Advance_Request__c> triggerNew, List<Advance_Request__c> triggerOld, Boolean deleteFlag){
    Set<String> InvoiceId = new Set<String>();
        Set<String> WorkIds = new Set<String>();
        List<Advance_Request__c> AdvanceRequest;
        if(deleteFlag){
          AdvanceRequest = triggerOld;
        }else{
          AdvanceRequest = triggerNew;
        }
        for (Advance_Request__c advanceReq: AdvanceRequest) 
        {           
            WorkIds.add(advanceReq.Work_Id__c);
        }
        works = new List<Work__c>([SELECT Id, Name, Total_Invoice_Amount__c,  Project_Code__c, BAST_Submit_Term_I__c, Work_Status__c, Invoice_Date_Term_I__c, Invoice_Date_Term_II__c, Invoice_Date_DP_II__c, Invoice_Date_DP_III__c FROM Work__c WHERE Id in :WorkIds]);
    util = new Utilities();
    
  }
  public void setWorkAmount(List<Advance_Request__c> AdvanceRequest){
    system.debug('works --------------'+ works);
    AggregateResult[] advReq = 
                [select Work_Id__c, SUM(Total_amount_advance__c)totalAdvance FROM Advance_Request__c    
                 where Work_Id__c IN :works AND Status__c != 'Rejected' GROUP BY Work_Id__c];
                 system.debug('advReq ---------'+advReq +'------');
        Map<Id, AggregateResult> advMap = new Map <Id, AggregateResult>();
        for(AggregateResult ar : advReq){
            advMap.put((Id)ar.get('Work_Id__c'), ar);
        }
    
        //List <Work__c> workList = [SELECT Id, Name, Total_Advance_Request__c FROM Work__c WHERE Id IN :workIdSet  ];
        
        for(Work__c wid : works ){
          if(advMap.get(wid.Id) != null){
              AggregateResult ar = advMap.get(wid.Id);
              wid.Total_Advance_Request__c = (Decimal)ar.get('totalAdvance');
            }
        }
        
        
  }
    
    
    
}


Could you please help me?
Thank you