I have an apex class that creates campaigns based on mailings and then is supposed to add campaign members to the campaigns that were just created. The last step is done essentially by creating new Campaign Member objects with the campaign id and the mailing contact id they are associated with and then doing an upsert using the entire list of newly created campaign member objects.
For some reason, when I run the upsert while either implicitly or explicitly using the external id of the campaign member id, none of the objects are being inserted. While testing, I was able to see that immediately after a new campaign object is instantiated, it has a null value for the id field even though when the CampaignMember object is queried, all existing objects seem to have a randomly generated id. This could possibly be because the id might not actually get generated until after the insert operation is done.
If this is the case, should another field from the Campaign Member objects be used to do the upsert?
The code for the class method for adding campaign members is below:
public void addCampaignMembers(){
/*Add campaign members to mailings for contact
*/
//Test campaign objects
Campaign cm1 = new Campaign( Campaign_Key__c = 'key1', name = 'name1',Mailing_ID__c= 'mid1',Type = 'Content / White Paper');
Campaign cm2 = new Campaign(Campaign_Key__c = 'key2', name = 'name2',Mailing_ID__c= 'mid2',Type = 'Content / White Paper');
Campaign cm3 = new Campaign(Campaign_Key__c = 'key3', name = 'name3',Mailing_ID__c= 'mid3',Type = 'Content / White Paper');
List<Campaign> campaigns = new List<Campaign>();
campaigns.add(cm1);
campaigns.add(cm2);
campaigns.add(cm3);
List<CampaignMember> mems = new List<CampaignMember>();
List<Mailings__C> allMailings = new List<Mailings__C>();
Integer currList = 0;
List<List<CampaignMember>> setOfMembers = new List<List<CampaignMember>>();
setOfMembers.add(new List<CampaignMember>());
List<CampaignMember> allMembers = new List<CampaignMember>();
for(Campaign cmp : campaigns){ //Extract campaign keys from added campaigns so they can be matched with campaign ids
Campaign res = [SELECT Id FROM Campaign where Campaign_Key__c =: cmp.Campaign_Key__c];
cmp.Id = res.Id;
}
List<List<CampaignObj>> nullCampaigns = new List<List<CampaignObj>>(); //for testing
nullCampaigns.add(new List<CampaignObj>());
for(Campaign cmp : campaigns){
//match campaigns and members based on mailing id for each iterations
List<Mailings__C> members = [select Available_Mailing__C, Contact__C from Mailings__C where Available_Mailing__C =: cmp.Mailing_ID__c];
for(Mailings__C mc : members){
CampaignMember mem = new CampaignMember(CampaignId = cmp.id, ContactId= mc.Contact__C );
nullCampaigns[currList].add(camp2);
allMembers.add(mem);
}
}
List<CampaignMember> returnList = new List<CampaignMember>();
try{
Database.UpsertResult[] results = Database.upsert(allMembers);
for(Integer index = 0, size = results.size(); index < size; index++) {
if(results[index].isSuccess()) {
if(results[index].isCreated()) {
System.debug(allMembers[index].Id +' was created');
} else {
System.debug(allMembers[index].Id +' was updated');
}
}
}
}
catch (DmlException e) {
System.debug(e.getMessage());
}
}