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
MasieMasie 

Help Bulkify my apex trigger

Hi

I need some help with the following trigger- it creates a record in my asset history table should certain conditions be met. I need to add another condition and I am already running into apex governor limits when I do mass updates. 

trigger AssetHistoryTracking on Asset(after update){
 
  String AccId = null;
  String AccName = null;
  Integer index = 0;  
  String OldAccName = null;
 
 
 
  //create a list to hold the new record(s) to create
  List<Asset_History__c> historyObjList = new List<Asset_History__c>();
  
   for(Asset ass : Trigger.New){
    String OldAccId = Trigger.Old[index].AccountId;
    AccId = ass.AccountId;
   
  List <Account> acclist = [select name, id from Account where id = :AccId ];
    Accname = acclist[0].name;
   
    List <Account> oldacclist = [select name, id from Account where id = :OldAccId ];
    OldAccname = oldacclist[0].name;
       
     //If status changes
     if(ass.Status != Trigger.Old[index].Status){
               
     Asset_History__c objAssetH = new Asset_History__c();
     objAssetH.Asset__c = ass.id;
     objAssetH.Old_Value__c = Trigger.Old[index].Status;
     objAssetH.New_value__c = ass.Status;
     objAssetH.Date_Changed__c = system.today();
     objAssetH.Field_Changed__c = 'Status';
     objAssetH.Changed_By__c = UserInfo.getUserId();
                   
                         //Trigger Action Logic
                        // Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
    historyObjList.add(objAssetH);
   
   // index++;
     }
      //when Account changes
    if(ass.AccountId != Trigger.Old[index].AccountId){
                   
     Asset_History__c objAssetH = new Asset_History__c();
     objAssetH.Asset__c = ass.id;
     objAssetH.Old_Value__c = OldAccname ;
//    objAssetH.Old_Value__c = Trigger.Old[index].AccountId;
     objAssetH.New_value__c = AccName ;
     objAssetH.Date_Changed__c = system.today();
     objAssetH.Field_Changed__c = 'Company Name';
     objAssetH.Changed_By__c = UserInfo.getUserId();
                   
    //Trigger Action Logic
    // Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
    historyObjList.add(objAssetH);
   
//   index++;
     }
     //when install date changes
    if(ass.InstallDate != Trigger.Old[index].InstallDate){
                   
     Asset_History__c objAssetH = new Asset_History__c();
     objAssetH.Asset__c = ass.id;
     objAssetH.Old_Value__c = String.valueof(Trigger.Old[index].InstallDate);
     objAssetH.New_value__c = string.valueof(ass.InstallDate);
     objAssetH.Date_Changed__c = system.today();
     objAssetH.Field_Changed__c = 'Install Date';
     objAssetH.Changed_By__c = UserInfo.getUserId();
                   
      //Trigger Action Logic
     // Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
    historyObjList.add(objAssetH);
   
   // index++;
         }
     //when Usage End Date changes
    if(ass.UsageEndDate != Trigger.Old[index].UsageEndDate){
                   
     Asset_History__c objAssetH = new Asset_History__c();
     objAssetH.Asset__c = ass.id;
     objAssetH.Old_Value__c = String.valueof(Trigger.Old[index].UsageEndDate);
     objAssetH.New_value__c = string.valueof(ass.UsageEndDate);
     objAssetH.Date_Changed__c = system.today();
     objAssetH.Field_Changed__c = 'Usage End Date';
     objAssetH.Changed_By__c = UserInfo.getUserId();
  
                         //Trigger Action Logic
                        // Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
    historyObjList.add(objAssetH);
   
    //index++;
}
     //when Stock is For Show Devices
    if(ass.Show_Device__c != Trigger.Old[index].Show_Device__c){

     Asset_History__c objAssetH = new Asset_History__c();
     objAssetH.Asset__c = ass.id;
     objAssetH.Old_Value__c = String.valueof(Trigger.Old[index].Show_Device__c);
     objAssetH.New_value__c = string.valueof(ass.Show_Device__c);
     objAssetH.Date_Changed__c = system.today();
     objAssetH.Field_Changed__c = 'Show Device';
     objAssetH.Changed_By__c = UserInfo.getUserId();
  
                         //Trigger Action Logic
                        // Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
    historyObjList.add(objAssetH);
       
    index++;
     }
  }
       
   if(historyObjList.size() > 0){
    insert historyObjList;
 
   }
}
Best Answer chosen by Masie
Vatsal KothariVatsal Kothari
Hi Masie,

I have remove the queries which are inside the for loop:

trigger AssetHistoryTracking on Asset(after update){

	String AccId = null;
	String AccName = null;
	Integer index = 0;  
	String OldAccName = null;

	//create a list to hold the new record(s) to create
	List<Asset_History__c> historyObjList = new List<Asset_History__c>();
	Map<Id,String> accMap = new Map<Id,String>();
	
	for(Account acclist = [select name, id from Account]){
		accMap.put(acc.Id,acc.Name);
	}
	
	
	for(Asset ass : Trigger.New){
		String OldAccId = Trigger.Old[index].AccountId;
		AccId = ass.AccountId;

		if(accMap.containsKey(AccId) && accMap.get(AccId) != null){
			AccName = accMap.get(AccId);		
		}
		
		if(accMap.containsKey(AccId) && accMap.get(AccId) != null){
			OldAccname = accMap.get(AccId);		
		}
		   
		 //If status changes
		if(ass.Status != Trigger.Old[index].Status){
				   
			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = Trigger.Old[index].Status;
			 objAssetH.New_value__c = ass.Status;
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Status';
			 objAssetH.Changed_By__c = UserInfo.getUserId();
						   
								 //Trigger Action Logic
								// Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);

			// index++;
		 }
		  //when Account changes
		if(ass.AccountId != Trigger.Old[index].AccountId){
						   
			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = OldAccname ;
			//    objAssetH.Old_Value__c = Trigger.Old[index].AccountId;
			 objAssetH.New_value__c = AccName ;
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Company Name';
			 objAssetH.Changed_By__c = UserInfo.getUserId();
						   
			//Trigger Action Logic
			// Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);

			//   index++;
		 }
		 //when install date changes
		if(ass.InstallDate != Trigger.Old[index].InstallDate){
						   
			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = String.valueof(Trigger.Old[index].InstallDate);
			 objAssetH.New_value__c = string.valueof(ass.InstallDate);
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Install Date';
			 objAssetH.Changed_By__c = UserInfo.getUserId();
						   
			  //Trigger Action Logic
			 // Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);

			// index++;
		}
		 //when Usage End Date changes
		if(ass.UsageEndDate != Trigger.Old[index].UsageEndDate){
					   
			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = String.valueof(Trigger.Old[index].UsageEndDate);
			 objAssetH.New_value__c = string.valueof(ass.UsageEndDate);
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Usage End Date';
			 objAssetH.Changed_By__c = UserInfo.getUserId();

								 //Trigger Action Logic
								// Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);

			//index++;
		}
		 //when Stock is For Show Devices
		if(ass.Show_Device__c != Trigger.Old[index].Show_Device__c){

			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = String.valueof(Trigger.Old[index].Show_Device__c);
			 objAssetH.New_value__c = string.valueof(ass.Show_Device__c);
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Show Device';
			 objAssetH.Changed_By__c = UserInfo.getUserId();

								 //Trigger Action Logic
								// Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);
			   
			index++;
		}
	}
	   
	if(historyObjList.size() > 0){
		insert historyObjList;
	}
}

If this solves your problem, kindly mark it as the best answer.

Thnaks,
Vatsal

All Answers

Vatsal KothariVatsal Kothari
Hi Masie,

I have remove the queries which are inside the for loop:

trigger AssetHistoryTracking on Asset(after update){

	String AccId = null;
	String AccName = null;
	Integer index = 0;  
	String OldAccName = null;

	//create a list to hold the new record(s) to create
	List<Asset_History__c> historyObjList = new List<Asset_History__c>();
	Map<Id,String> accMap = new Map<Id,String>();
	
	for(Account acclist = [select name, id from Account]){
		accMap.put(acc.Id,acc.Name);
	}
	
	
	for(Asset ass : Trigger.New){
		String OldAccId = Trigger.Old[index].AccountId;
		AccId = ass.AccountId;

		if(accMap.containsKey(AccId) && accMap.get(AccId) != null){
			AccName = accMap.get(AccId);		
		}
		
		if(accMap.containsKey(AccId) && accMap.get(AccId) != null){
			OldAccname = accMap.get(AccId);		
		}
		   
		 //If status changes
		if(ass.Status != Trigger.Old[index].Status){
				   
			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = Trigger.Old[index].Status;
			 objAssetH.New_value__c = ass.Status;
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Status';
			 objAssetH.Changed_By__c = UserInfo.getUserId();
						   
								 //Trigger Action Logic
								// Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);

			// index++;
		 }
		  //when Account changes
		if(ass.AccountId != Trigger.Old[index].AccountId){
						   
			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = OldAccname ;
			//    objAssetH.Old_Value__c = Trigger.Old[index].AccountId;
			 objAssetH.New_value__c = AccName ;
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Company Name';
			 objAssetH.Changed_By__c = UserInfo.getUserId();
						   
			//Trigger Action Logic
			// Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);

			//   index++;
		 }
		 //when install date changes
		if(ass.InstallDate != Trigger.Old[index].InstallDate){
						   
			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = String.valueof(Trigger.Old[index].InstallDate);
			 objAssetH.New_value__c = string.valueof(ass.InstallDate);
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Install Date';
			 objAssetH.Changed_By__c = UserInfo.getUserId();
						   
			  //Trigger Action Logic
			 // Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);

			// index++;
		}
		 //when Usage End Date changes
		if(ass.UsageEndDate != Trigger.Old[index].UsageEndDate){
					   
			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = String.valueof(Trigger.Old[index].UsageEndDate);
			 objAssetH.New_value__c = string.valueof(ass.UsageEndDate);
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Usage End Date';
			 objAssetH.Changed_By__c = UserInfo.getUserId();

								 //Trigger Action Logic
								// Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);

			//index++;
		}
		 //when Stock is For Show Devices
		if(ass.Show_Device__c != Trigger.Old[index].Show_Device__c){

			 Asset_History__c objAssetH = new Asset_History__c();
			 objAssetH.Asset__c = ass.id;
			 objAssetH.Old_Value__c = String.valueof(Trigger.Old[index].Show_Device__c);
			 objAssetH.New_value__c = string.valueof(ass.Show_Device__c);
			 objAssetH.Date_Changed__c = system.today();
			 objAssetH.Field_Changed__c = 'Show Device';
			 objAssetH.Changed_By__c = UserInfo.getUserId();

								 //Trigger Action Logic
								// Asset_History__c historyObj = new Asset_History__c(Old_Value__c = Trigger.Old[index].Status, New_value__c = ass.Status);
			historyObjList.add(objAssetH);
			   
			index++;
		}
	}
	   
	if(historyObjList.size() > 0){
		insert historyObjList;
	}
}

If this solves your problem, kindly mark it as the best answer.

Thnaks,
Vatsal
This was selected as the best answer
MasieMasie
Hi Vatsal

Firstly thank you very much for your help, I am getting an error on line 12 where it is expecting a semi-colon. 


Vatsal KothariVatsal Kothari
Replace 12 line with below code :

for(Account acc : [select name, id from Account]){
        accMap.put(acc.Id,acc.Name);
    }

Thanks,
Vatsal