You need to sign in to do that
Don't have an account?
alynlin
Error: Field is not writeable--for Master-Detail relationship.
Hi all.
I am writing an apex trigger,
trigger LatestEvaluationHistory on Evaluation_History__c (after delete, after insert,
after undelete, after update) {
// this is the child object.
//then I want to update the parant object when the child is delete/insert/update
List<Job_Evaluation__c> dateToUpdate = new List <Job_Evaluation__c>{};
}
then I got the error: Field is not writeable
Any body can help me on this? cause I am totally new in apex :)
trigger LatestEvaluationHistory on Evaluation_History__c (after delete, after insert,
after undelete, after update) {
if(!test1.contextTriggerExecuting){ //check that the trigger isnt already executing
test1.contextTriggerExecuting = true; //set to true so it doesnt go in a recursive loop
Set<Id> emtoupdate = new Set<Id> ();
if (Trigger.isInsert || Trigger.isUpdate ) {
for (Evaluation_History__c c: Trigger.New) {
emtoupdate.add(c.Job_Name__c);
}
}
if (Trigger.isDelete) {
for (Evaluation_History__c c: Trigger.Old) {
emtoupdate.add(c.Job_Name__c);
}
}
List<Evaluation_History__c> ctxsToUpdate = new List<Evaluation_History__c>{};
boolean firstRecord = true;
for(Evaluation_History__c ctx : [Select Id, Most_Recent_Record__c, Effective_Date__c
from Evaluation_History__c where Job_Name__c =: emtoupdate ORDER BY Effective_Date__c DESC])
{
if(firstRecord)
{
ctx.Most_Recent_Record__c = true;
firstRecord = false;
}
else
ctx.Most_Recent_Record__c = false;
ctxsToUpdate.add(ctx);
}
if(ctxsToUpdate != null && !ctxsToUpdate.IsEmpty())
update ctxsToUpdate;
List<Job_Evaluation__c> dateToUpdate = new List <Job_Evaluation__c>{};
for (Job_Evaluation__c dateTo : [Select LatestEvaluationDate__c From Job_Evaluation__c
where Name =: emtoupdate])
{
for (Evaluation_History__c dateFrom : [Select Effective_Date__c from Evaluation_History__c
where Job_Name__c =: emtoupdate and Most_Recent_Record__c = TRUE])
{
dateTo.LatestEvaluationDate__c = dateFrom.Effective_Date__c;
}
}
}
}
// this is my code. and the last few lines got error.
Yes You can not update a master reference in master detail relationship. thats not allowed in salesforce , either you have to delete this record and create new one LIke
get a clone of cuurent
DetailObject__c objInstanceNew = objInstanceOld.clone(false); //This will remove id from this record
objInstanceNew.MasterRefFields__c = 'NewRefID"; // Add id of new master
insert objInstanceNew;
delete objInstanceOld;
Do it for bulk using collections.
Easier way is to use lookup relationship, then you can modfy references.
Thanks.
So, when writing trigger on the child object, can read-only its parent object?
And, may I ask, if I am writing a trigger on the parent object. Can I read or write it's child object?
No read only is only the reference field on detail (child obj) , if relationship is master detail,
Like if you have
Object1
Object2
Object2 has a Field referenceToObject1 Master detail relationship field
then referenceToObject__c field can only be set in an insert call. It can not be modified later. If you write any statement like
obj2.referenceToObject1 = 'newID';
it will give error Field is not writeable--for Master-Detail relationship if obj2.id != null bcoz obj.id != null means that object has been inserted earlier thats why it has id.
Other than Master Detail reference You can always change other field values.
If you allow reparenting on the master-detail relationship the id is writeable.