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
bhanu_prakashbhanu_prakash 

trigger handler design for trigger

I have designed trigger of Asset__c object , I was stucked it need to be use with trigger handler and with test class need help on that
 
trigger AssetTrigger on Asset__c (after insert, after update, after delete) {
    
    Set<Id> acctIds = new Set<Id>();
    if(trigger.isAfter){
        if(Trigger.isInsert || Trigger.isUpdate)
        for(Asset__c assetItem : Trigger.new){
            if(assetItem.Name != Trigger.oldMap.get(assetItem.Id).Name && assetItem.BillToAcc__c != null)
                acctIds.add(assetItem.BillToAcc__c);
        }

        if(Trigger.isDelete)
        for(Asset__c assetItem : Trigger.old){
            if(assetItem.BillToAcc__c != null)
            acctIds.add(assetItem.BillToAcc__c);
        }

        if(!acctIds.isEmpty()){
            
            List<Account> acctList = [Select Id, Count__c, (Select Id from BillToItem__c) from Account where Id in: acctIds];
            for(Account acc : acctList ){
                acc.Count__c= acc.BillToItem__c.size();                
            }
            system.debug('acctList'+acctList);
            update acctList;
        
        }

    }else if(trigger.isBefore){

    }       
    
}

 
Best Answer chosen by bhanu_prakash
bhanu_prakashbhanu_prakash
got modified. Issue resloved

All Answers

arpit vijayvergiyaarpit vijayvergiya
Hello Bhanu,
Here I made some changes in your code regarding Handler class.
trigger AssetTrigger on Asset__c (after insert, after update, after delete) {
    
    Set<Id> acctIds = new Set<Id>();
    if(trigger.isAfter){
        if(Trigger.isInsert || Trigger.isUpdate)
        for(Asset__c assetItem : Trigger.new){
            if(assetItem.Name != Trigger.oldMap.get(assetItem.Id).Name && assetItem.BillToAcc__c != null)
                acctIds.add(assetItem.BillToAcc__c);
        }

        if(Trigger.isDelete)
        for(Asset__c assetItem : Trigger.old){
            if(assetItem.BillToAcc__c != null)
            acctIds.add(assetItem.BillToAcc__c);
        }

        if(!acctIds.isEmpty()){
            
           updateAccount.AssetTriggerHandler(acctIds);
        
        }

    }else if(trigger.isBefore){

    }       
    
}

public class AssetTriggerHandler{
	public static void updateAccount(Set<String> setOfAccIds){
		if(!setOfAccIds.isEmpty()){
			List<Account> acctList = [Select Id, Count__c, (Select Id from BillToItem__c) from Account where Id in: setOfAccIds];
            for(Account acc : acctList ){
                acc.Count__c= acc.BillToItem__c.size();                
            }
            system.debug('acctList'+acctList);
            update acctList;
		}
	}
}

 
bhanu_prakashbhanu_prakash
Thanks for code arpit, but I don't want to add extra logic into trigger apart from trigger handler class 
 
for(Asset__c assetItem : Trigger.new){
            if(assetItem.Name != Trigger.oldMap.get(assetItem.Id).Name && assetItem.BillToAcc__c != null)
                acctIds.add(assetItem.BillToAcc__c);
        }

and
for(Asset__c assetItem : Trigger.old){
            if(assetItem.BillToAcc__c != null)

above logic need to be in ​handler class only 
sfdcMonkey.comsfdcMonkey.com
Hi Bhanu, use below code :
trigger AssetTrigger on Asset__c (after insert, after update, after delete) {
    
    Set<Id> acctIds = new Set<Id>();
    if(trigger.isAfter){
        if(Trigger.isInsert || Trigger.isUpdate){
           AssetTriggerHandler.afterInsertUpdate(trigger.new);
	    }
        if(Trigger.isDelete){
           AssetTriggerHandler.afterDelete(trigger.old);
		}
    }else if(trigger.isBefore){
    }       
}
trigger handler :
public class AssetTriggerHandler{  
   
	public static void afterInsertUpdate(List<Asset__c> TriggerNew){
		Set<Id> acctIds = new Set<Id>();
	   for(Asset__c assetItem : TriggerNew){
            if(assetItem.Name != Trigger.oldMap.get(assetItem.Id).Name && assetItem.BillToAcc__c != null)
                acctIds.add(assetItem.BillToAcc__c);
          }
		  finalUpdate();
	}
	
	public static void afterDelete(List<Asset__c> TriggerOld){
	    for(Asset__c assetItem : TriggerOld){
            if(assetItem.BillToAcc__c != null){
            acctIds.add(assetItem.BillToAcc__c);
			}
         }
		 
		finalUpdate();
	}
	
    public static void finalUpdate(){	
	if(!acctIds.isEmpty()){
		
		List<Account> acctList = [Select Id, Count__c, (Select Id from BillToItem__c) from Account where Id in: acctIds];
		for(Account acc : acctList ){
			acc.Count__c= acc.BillToItem__c.size();                
		}
		system.debug('acctList'+acctList);
		update acctList;
	
	 }
	}
}
Thanks, let us know if it helps you


 
bhanu_prakashbhanu_prakash
Hi Piyush,

Thanks for update. still bugs on code

Asset Trigger error 
line 6 : Method does not exist or incorrect signature: void afterInsertUpdate(List<Asset__c>) from the type AssetTriggerHandler
line 9 : Method does not exist or incorrect signature: void afterDelete(List<Asset__c>) from the type AssetTriggerHandler

AssetTriggerHandler error 
line 6 : Variable does not exist: Name 

 
bhanu_prakashbhanu_prakash
got modified. Issue resloved
This was selected as the best answer