You need to sign in to do that
Don't have an account?
Gabe Rothman 8
Can someone help me bulkify this class?
I've been trying to do a bulk update of records using the data loader and I keep getting the following error:
"rfp: execution of BeforeInsert
caused by: System.QueryException: List has more than 1 row for assignment to SObject
Class.setRfpOwner.setOwners: line 15, column 1
Trigger.rfp: line 4, column 1 "
After looking at my code and the records I'm querying, I the query in line 15 of my service class should only yield one result, which leads me to believe that my service class is somehow not bulk safe. Can anyone point me in the right direction:
Trigger:
Class:
"rfp: execution of BeforeInsert
caused by: System.QueryException: List has more than 1 row for assignment to SObject
Class.setRfpOwner.setOwners: line 15, column 1
Trigger.rfp: line 4, column 1 "
After looking at my code and the records I'm querying, I the query in line 15 of my service class should only yield one result, which leads me to believe that my service class is somehow not bulk safe. Can anyone point me in the right direction:
Trigger:
trigger rfp on RFP_Response__c (before insert, before update) { if(trigger.isBefore && trigger.isInsert){ setRfpOwner.setOwners(trigger.new); rfpKwBuilder.buildKeyWords(Trigger.new); } if(trigger.isBefore && trigger.isUpdate){ if(checkRecursive.flag == true){ rfpKwBuilder.buildKeyWords(Trigger.new); for(RFP_Response__c rfp : Trigger.new){ RFP_Response__c oldRfp = Trigger.oldMap.get(rfp.Id); if(oldRfp.Response__c != rfp.Response__c){ setResponseToggle.toggleResponse(trigger.new); } } for(RFP_Response__c rfp : Trigger.new){ RFP_Response__c oldRfp = Trigger.oldMap.get(rfp.Id); if(oldRfp.Category__c != rfp.Category__c){ setRfpOwner.setOwners(trigger.new); } } } checkRecursive.flag = false; } }
Class:
public class setRfpOwner { public static void setOwners(list<RFP_Response__c> rfpUpdateList){ List<String> listCategories = new List<String>(); for (RFP_Response__c rfp : rfpUpdateList) { if(rfp.Category__c == null){ return; } if(rfp.Category__c != null){ listCategories.add(rfp.Category__c); } } RFP_Owner_Mappings__c mapping = [SELECT Name, RFP_Category_Owner__c, RFP_Category_Backup_Owner__c,RFP_Category_Owner__r.Email__c,RFP_Category_Backup_Owner__r.Email__c FROM RFP_Owner_Mappings__c WHERE Name IN :listCategories]; for (RFP_Response__c rfp2 : rfpUpdateList){ if(rfp2.Category__c == mapping.Name ){ rfp2.RFP_Category_Owner__c = mapping.RFP_Category_Owner__c; rfp2.RFP_Category_Backup_Owner__c = mapping.RFP_Category_Backup_Owner__c ; rfp2.Category_Owner_Email__c = mapping.RFP_Category_Owner__r.Email__c; rfp2.Category_Backup_Owner_Email__c = mapping.RFP_Category_Backup_Owner__r.Email__c ; } } } }
All Answers
This code works perfectly when processing one record at a time -- further evidence that it's not bulk safe.
Thanks for the response! I've updated the class below per your suggestion , and it works on single record processing, but I'm the getting the following error in bulk processing:
"rfp: execution of BeforeInsert caused by: System.NullPointerException: Attempt to de-reference a null object
Class.setRfpOwner.setOwners: line 24, column 1
Trigger.rfp: line 4, column 1"
Any suggestions?