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
Patrick/ JamesPatrick/ James 

Trigger Issue - Rich Text Fields - Cross-object

Hi there,

I'm very new to Apex Triggers, so apologies I'm being a bit stupid here.

We have the following code to populate a Rich Text field on a Campaign Member with the contents of a Rich Text field on the corresponding Campaign (we obviously need to preserve the formatting).

Campaign Member RT field: Course_Email_Info_2__c

Campaign RT field: Extra_Info_for_Reminder__c​

 
trigger RichText1 on Campaign (after insert, after update) {
    List<CampaignMember> memberList=new List<CampaignMember>();
    Map<Id,Campaign> CampMemMap=new Map<Id,Campaign>([select id, (select id from CampaignMembers) from Campaign 
                                                  where id IN: Trigger.new]);

    for(Campaign c: Trigger.new){
        if(c.Extra_Info_for_Reminder__c!=null && CampMemMap.get(c.id).CampaignMembers.size()>0){
            memberList.addAll(CampMemMap.get(c.id).CampaignMembers);
                for(CampaignMember m: memberList){
                    m.Course_Email_Info_2__c​=c.Extra_Info_for_Reminder__c;
                }
        }
    }
    if(memberList.size()>0){
        update memberList;
    }
}

Unfortunately - the following error is appearing when we try and edit a Campaign record:

User-added image

If anyone is able to offer a simple solution that would be much appreciated.

Thanks very much.
Best Answer chosen by Patrick/ James
Patrick/ JamesPatrick/ James
Hi Manoj,

Thank you very much for your reply.

I had to tweak your code slightly (at the end it should be "(campMem.CampaignId)") but it works-
 
trigger RichText1 on CampaignMember (before insert, before update) {
Set<Id> camIdSet=new Set<Id>();
  for(CampaignMember camm: Trigger.new){
   camIdSet.add(camm.CampaignId);
 }
 Map<Id,Campaign> camMap=new Map<Id,Campaign>([SELECT Id,Extra_Info_for_Reminder__c FROM Campaign WHERE Id IN :camIdSet]);
 for(CampaignMember campMem: Trigger.new){
   if(campMem.CampaignId != null ){
     campMem.Course_Email_Info_2__c=camMap.get(campMem.CampaignId).Extra_Info_for_Reminder__c;
   }
 }
}

Might there be an option of the Trigger being in Campaign not CampaignMember? In some instances we would like to save the one Campaign record, not have to update each Campaign Member record.

Thanks again!

All Answers

ManojjenaManojjena
Hi Patrick,

Basically here the trigger should in campaignMember not in campaign .
Please try with belwo code and let me know if it helps .
 
trigger RichText1 on CampaignMember (before insert, before update) {
Set<Id> camIdSet=new Set<Id>();
  for(CampaignMember camm: Trigger.new){
   camIdSet.add(camm.CampaignId);
 }
 Map<Id,Campaign> camMap=new Map<Id,Campaign>([SELECT Id,Extra_Info_for_Reminder__c FROM Campaign WHERE Id IN :camIdSet]);
 for(CampaignMember campMem: Trigger.new){
   if(campMem.CampaignId != null ){
     campMem.Course_Email_Info_2__c=camMap.get(camm.CampaignId).Extra_Info_for_Reminder__c;
   }
 }
}
Let me know if it helps !!
Thanks
Manoj
 
Patrick/ JamesPatrick/ James
Hi Manoj,

Thank you very much for your reply.

I had to tweak your code slightly (at the end it should be "(campMem.CampaignId)") but it works-
 
trigger RichText1 on CampaignMember (before insert, before update) {
Set<Id> camIdSet=new Set<Id>();
  for(CampaignMember camm: Trigger.new){
   camIdSet.add(camm.CampaignId);
 }
 Map<Id,Campaign> camMap=new Map<Id,Campaign>([SELECT Id,Extra_Info_for_Reminder__c FROM Campaign WHERE Id IN :camIdSet]);
 for(CampaignMember campMem: Trigger.new){
   if(campMem.CampaignId != null ){
     campMem.Course_Email_Info_2__c=camMap.get(campMem.CampaignId).Extra_Info_for_Reminder__c;
   }
 }
}

Might there be an option of the Trigger being in Campaign not CampaignMember? In some instances we would like to save the one Campaign record, not have to update each Campaign Member record.

Thanks again!
This was selected as the best answer
ManojjenaManojjena
Hi Patrick,

I got your query you want some thing like if you will update campaign then related CampaignMember should update the same .

Then your event will only on update .

Try with below it will work !!
trigger RichText1 on Campaign (after update) {
	Set<Id> idSet=new Set<Id>();
	List<CampaignMember> memberList=new List<CampaignMember>();
	for(Campaign cam: Trigger.new){
		if(cam.Extra_Info_for_Reminder__c != Trigger.oldMap.get(cam.Id).Extra_Info_for_Reminder__c ){
		  idSet.add(cam.Id);
		}
	  }
	for(CampaignMember campMem : [SELECT Id,Course_Email_Info_2__c​,CampaignId FROM CampaignMember WHERE CampaignId IN: idSet ]){
		 campMem.Course_Email_Info_2__c​=Trigger.newMap.get(campMem.CampaignId).Extra_Info_for_Reminder__c;
		 memberList.add(campMem);
    }
	try{
	  update memberList;
	}catch(Exception ex){
	  System.debug(de);
	}
}
How ever if you will insert any new campainMember  after update of your Campaign above code wil not update for that .For that you need to write a trigger in CampaignMember before insert ,inthis case you use the above Campaignmember trigger .


Let me know if it helps !!
Thanks
Manoj

 
Patrick/ JamesPatrick/ James
This is great. Thanks Manoj!