You need to sign in to do that
Don't have an account?
trigger field update in related object
Hi All,
I'm trying to have a trigger run when I create a new Tickets object. When you create a Tickets object you define a related Contact object, and I'd like to change the value of a field (ticketsTest__c) of the Contact.
This is all done on the front-end, and only one Tickets obj will ever be created at a time so I didn't use a list. I'm sure that's bad form, just a heads-up. I'm trying to select the Contact record where the ID is equal to the related Contact object ID of the newly created Tickets obj. In my test class I create a Contact and set the value of ticketsTest__c to 'blah', and the system.assert result says that the actual result of the field is still 'blah' rather than 'testPopulated'. Also, I'm getting a "Save error: unexpected token: 'tixID'". Can anyone please help? It would be much appreciated.
Here's the code I've got right now for the trigger:
trigger TicketCreatePopulateContact on Tickets__c (before insert, before update) {
for(Tickets__c ticket: Trigger.New) {
Id tixID = ticket.Contact__c;
Contact s = [select Id, ticketsTest__c from Contact where Id = tixID];
s.ticketsTest__c = 'testPopulated';
update s;
}
}
It's because you need to requery that record before checking it's value. Since the value was updated in a trigger when you inserted it, the new value for that field is in the database but not in your local variable. So if you add this line before your assertation it should succeed:
c = [SELECT ticketsTest__c FROM Contact WHERE Id = :c.Id LIMIT 1];
When you insert a record the only field that is automatically updated in your local variable(s) is the Id field.
All Answers
The variable in your contact query needs a colon in front of it, that's causing your error and preventing your update. Try this:
All variables inside a SOQL query like that need to be prepended with a colon to indicate they're variables and not a literal part of the query.
Thanks very much, that helps get ride of that error. Sorry if I'm being thick- do you have any idea why the system.assertEquals('testPopulated', c.ticketsTest__c); still fails?
Here's a snippet of the test code:
test.startTest();
Account a = new Account (Name = 'Company');
insert a;
Contact c = new Contact (Account = a, LastName = 'LName', ticketsTest__c = 'blah');
insert c;
System.assertEquals('LName', c.LastName);
Tickets__c ticket = new Tickets__c (Contact__c = c.Id);
insert ticket;
System.assertEquals(c.Id, ticket.Contact__c);
System.assertEquals('testPopulated', c.ticketsTest__c);
test.stopTest();
It's because you need to requery that record before checking it's value. Since the value was updated in a trigger when you inserted it, the new value for that field is in the database but not in your local variable. So if you add this line before your assertation it should succeed:
c = [SELECT ticketsTest__c FROM Contact WHERE Id = :c.Id LIMIT 1];
When you insert a record the only field that is automatically updated in your local variable(s) is the Id field.
Ah, you are the man, I owe you a beer whenever you are in NYC.