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
Steven Wellman 28Steven Wellman 28 

Bulkifying Apex Class

I wrote this trigger and it works great. I just don't think it's bulkified very well. Any ideas on how best to combine the 2 soql query's into 1?
 
public class OnboardingsComplete {
    String accId;

    public OnboardingsComplete(String accFromTrigger){
        accId = accFromTrigger;
    }

    public void onboardingsCompleteCheck(){
        List<Onboarding__c> onbList = [SELECT Id FROM Onboarding__c WHERE Account__c = :accId 
                                                                      AND Status__c != 'Onboarded'
                                                                      AND Status__c != 'Partially Onboarded'
                                                                      AND Status__c != 'Canceled'
                                                                      LIMIT 1];
        if(onbList.isEmpty()){
            Account acc = [SELECT Id, Onboarding_Completed__c, Onboarding_Status__c FROM Account WHERE Id = :accId];
            if(acc.Onboarding_Completed__c == null){
                acc.Onboarding_Completed__c = Date.today();
            }
            if(acc.Onboarding_Status__c != 'Onboarding Complete'){
                acc.Onboarding_Status__c = 'Onboarding Complete';
            }
            update acc;
        }
    }
}

 
Raj VakatiRaj Vakati
You can make one change .. instead of getting the Id into the code you can get the account directly  

like beow 
 
public class OnboardingsComplete {
    Account accId;

    public OnboardingsComplete(Account accFromTrigger){
        accId = accFromTrigger;
    }

    public void onboardingsCompleteCheck(){
        List<Onboarding__c> onbList = [SELECT Id FROM Onboarding__c WHERE Account__c = :accId.Id
                                                                      AND Status__c != 'Onboarded'
                                                                      AND Status__c != 'Partially Onboarded'
                                                                      AND Status__c != 'Canceled'
                                                                      LIMIT 1];
        if(onbList.isEmpty()){
            if(accId.Onboarding_Completed__c == null){
                accId.Onboarding_Completed__c = Date.today();
            }
            if(accId.Onboarding_Status__c != 'Onboarding Complete'){
                accId.Onboarding_Status__c = 'Onboarding Complete';
            }
            update accId;
        }
    }
}

 
Raj VakatiRaj Vakati
try this 
 
public class OnboardingsComplete {
    Map<Id,Account> accId;

    public OnboardingsComplete(    Map<Id,Account> accFromTrigger){
        accId = accFromTrigger;
    }

    public void onboardingsCompleteCheck(){
        List<Onboarding__c> onbList = [SELECT Id FROM Onboarding__c WHERE Account__c IN :accId.keySet()
                                                                      AND Status__c != 'Onboarded'
                                                                      AND Status__c != 'Partially Onboarded'
                                                                      AND Status__c != 'Canceled'];
																	  
																	  Map<Id, Onboarding__c > accToOn = new Map<Id,Onboarding__c>();
																	  for(Onboarding__c cc:onbList){
																		  accToOn.put(cc.Account__c , cc) ;
																	  }
																	  
     
	 List<Account> accUp = new List<Account>():
for(Account a : accId.values()){
if(	accToOn.contains(a.Id)){
	        if(a.Onboarding_Completed__c == null){
                a.Onboarding_Completed__c = Date.today();
            }
            if(a.Onboarding_Status__c != 'Onboarding Complete'){
                a.Onboarding_Status__c = 'Onboarding Complete';
            }
}
            accUp.add( a);
        }
    
	update accUp;
	}

}