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
ckellieckellie 

Cannot Bulk Update Field

I am writing a trigger to bulk update campaign records with the lead/contact owner name in a text field. I am trying to bulkify this trigger, but I am not updating more than one record at a time. How can i write the trigger to bulk update? Below is my trigger:

 

 

trigger CampaignOwner on CampaignMember (after insert, after update) {

    Set<Id> UserIds = new Set<Id>();
    for (CampaignMember ca: Trigger.new){
    System.debug('**** 0 userids id : '+ca.ownerid__c);
    
            UserIds.add(ca.ownerId__c);
     System.debug('**** 1 ca id : '+ca.id);
     
     }
    
    Map<Id, User> entries = new Map<Id, User>();
    List<user> us = [select Id, LastName, FirstName, Phone, Fax, Email from User where id in :UserIds];
    
    string txt = '';
    for(CampaignMember camp: [select id, Ownerid__c from CampaignMember]) {
        System.debug('**** 100 *********************us[0].Us.FirstName: '+us[0].FirstName);
    if(camp.Ownerid__c<> null){
       camp.Owner_Name__c = us[0].FirstName + ' ' + us[0].LastName;
        }
    update camp;
    }
}

 

Thank you

 

 

 

Best Answer chosen by Admin (Salesforce Developers) 
kritinkritin

You can use before insert, In this you are not required to use any DML update statement otherwise it becomes recursive. See the below example :

 

trigger CampaignOwner2 on CampaignMember (Before insert) {

    Set<Id> UserIds = new Set<Id>();
    for (CampaignMember ca: Trigger.new){
    System.debug('**** 0 userids id : '+ca.ownerid__c);
   
            UserIds.add(ca.ownerId__c);
     System.debug('**** 1 ca id : '+ca.id);
    
     }
   
  Map<Id, String> entries = new Map<Id, User>();
for(User usr:[select Id, LastName, FirstName, Phone, Fax, Email from User where id in :UserIds]){
 String FullName=usr.FirstName + ' ' + usr.LastName;
 entries.put(id,FullName) 
}

    for (CampaignMember campMember: Trigger.new){
         campMember.Full_Name__c= entries.get(campMember.id);       

 }

   
  
}

All Answers

ckellieckellie

I have continued to work on the proble. Below is my error message:

 

SELF_REFERENCE_FROM_TRIGGER, Object (id = 00vP0000000FMRF) is currently in trigger CampaignOwner, therefore it cannot recursively update itself: []
22:58:06.265|FATAL_ERROR|System.DmlException: Update failed. First exception on row 0 with id 00vP0000000FMRFIA4; first error: SELF_REFERENCE_FROM_TRIGGER, Object (id = 00vP0000000FMRF) is currently in trigger CampaignOwner, therefore it cannot recursively update itself: []

 

 

And the trigger:

 

 

trigger CampaignOwner2 on CampaignMember (Before insert, Before update) {

    Set<Id> UserIds = new Set<Id>();
    for (CampaignMember ca: Trigger.new){
    System.debug('**** 0 userids id : '+ca.ownerid__c);
    
            UserIds.add(ca.ownerId__c);
     System.debug('**** 1 ca id : '+ca.id);
     
     }
    
  Map<Id, User> entries = new Map<Id, User>();
    List<user> us = [select Id, LastName, FirstName, Phone, Fax, Email from User where id in :UserIds];
    
    
    string txt = '';
    for(CampaignMember camp : [select id, Contactid, leadid, Ownerid__c from CampaignMember] ) {
        System.debug('**** 2*********************us[0].FirstName: '+ us[0].FirstName);
    if(camp.leadid <> null){
       Trigger.new[0].Owner_Name__c = camp.leadid;
        }
    update camp;
    }
}

 

I am trying to update the ownerid on the campaignmemeber records.  How do I do this?

 

kritinkritin

You can use before insert, In this you are not required to use any DML update statement otherwise it becomes recursive. See the below example :

 

trigger CampaignOwner2 on CampaignMember (Before insert) {

    Set<Id> UserIds = new Set<Id>();
    for (CampaignMember ca: Trigger.new){
    System.debug('**** 0 userids id : '+ca.ownerid__c);
   
            UserIds.add(ca.ownerId__c);
     System.debug('**** 1 ca id : '+ca.id);
    
     }
   
  Map<Id, String> entries = new Map<Id, User>();
for(User usr:[select Id, LastName, FirstName, Phone, Fax, Email from User where id in :UserIds]){
 String FullName=usr.FirstName + ' ' + usr.LastName;
 entries.put(id,FullName) 
}

    for (CampaignMember campMember: Trigger.new){
         campMember.Full_Name__c= entries.get(campMember.id);       

 }

   
  
}

This was selected as the best answer
ckellieckellie

This has been a big help. Thank you