You need to sign in to do that
Don't have an account?
Problem Dealing with Custom Relationships
I am having a (hopefully easy) problem creating new child objects. I have a custom object called Product Interest that has a master-detail relationship to Contact. In my trigger I simply want to create several new Product Interests and add them to the Contact's related list. However, when I call add on contact.Product_Interests__r, nothing is added (i.e. contact.Product_Interests__r.size() == 0). Can someone help me understand what is going on?
Thanks. Here is the code for the "test" case I started to write (currenlty it makes no assertions).
static testMethod void CreateContact() { Contact c = new Contact(); c.FirstName = 'Cameron'; c.LastName = 'Woodmansee'; c.MailingCity = 'Provo'; c.MailingCountry = 'USA'; c.MailingPostalCode = '84606'; c.MailingState = 'UT'; c.MailingStreet = '541 E 500 N'; c.Lead_Product_Interest__c = 'ELx50; ELx808; Eon; Epoch'; insert c; }
And here's the trigger code.
trigger CreateProductInterests on Contact (after insert) { Contact[] contacts = [ SELECT Id, Name, Account.Id, Lead_Campaign_Source__c, LeadSource, Lead_Product_Interest__c, Product_Interest_Notes__c, (SELECT Id, Name FROM Product_Interests__r) FROM Contact WHERE Id IN :Trigger.new ]; for(Contact c : contacts) { system.debug(c.Product_Interests__r); if(c.Product_Interests__r.size() == 0) { string[] interests = c.Lead_Product_Interest__c.split(';',0); if(interests.size() == 0) break; for(string interest : interests) { Product_Interest__c p = new Product_Interest__c(); p.Account__c = c.Account.Id; p.Campaign__c = (Id) c.Lead_Campaign_Source__c; p.Contact__c = c.Id; p.Product_Interest_Notes__c = c.Product_Interest_Notes__c; p.Product_Interest_Source__c = c.LeadSource; p.Contact__c = c.Id; try { insert p; c.Product_Interests__r.add(p); system.debug(c.Product_Interests__r.size()); } catch(DMLException e) { system.debug(e); } } //c.Product_Interests__r = pi; update c; } system.debug(c.Product_Interests__r.size()); }
Thanks again.
You will need to explicitly insert the records, rather than adding them to the 'related list' on Contact and updating the Contacts. (Also, never a good idea to query and / or update/insert stuff inside loops - you will exhaust your limits very quickly)
So
Product_Interest__c[] prodInterests = new Product_Interest[]{};
for(Contact c : ...
{
for (string interest : interests)
{
Product_Interest__c p = new Product_Interest();
......
prodInterests.add(p);
}//end product interests
}//end contacts
if(prodInterests != null && !prodInterests.isEmpty())
Database.insert(prodInterests);
Could you please do one thing
Update this catch block like this
Please let me know
One more thing why are you updateing c
This will not add anything in related list, size will always come as 0.
Thanks for your help, but why won't c.Product_Interests__r.add(p); add anything? Why allow that operation when it does nothing?
When you use relationship to fetch the related list , you can not add any item to this list. It is similar to that like if I fetch a related field of any object say
Contact c = [Select Account.Name from Contact where lastName = 'Test' limit 1];
now i can read the c.Account.name but can not update it like
c.Account.name = 'New Account';
update c;