You need to sign in to do that
Don't have an account?

Help with 'Read only field not editable' error
Hi Eveyone,
I have a trigger in which I update certain fields only if the values of some other fields are changed while updating a record.
trigger TStock_RStock on Inventory__c (after update) { for(Inventory__c inv : trigger.new) { Inventory__c oldValue = Trigger.oldMap.get(inv.ID); { if( inv.Number_1__c != oldValue.Number_1__c) { inv.Test_Stock__c = inv.Test_Stock__c + inv.Number_1__c; inv.Remaining_Stock__c = inv.Remaining_Stock__c + inv.Number_1__c; } if( inv.Number_2__c != oldValue.Number_2__c) { inv.Test_Stock__c = inv.Test_Stock__c + inv.Number_2__c; inv.Remaining_Stock__c = inv.Remaining_Stock__c + inv.Number_2__c; } if( inv.Number_3__c != oldValue.Number_3__c) { inv.Test_Stock__c = inv.Test_Stock__c + inv.Number_3__c; inv.Remaining_Stock__c = inv.Remaining_Stock__c + inv.Number_3__c; } } } }
But I get the following error
Error:Apex trigger TStock_RStock caused an unexpected exception, contact your administrator: TStock_RStock: execution of AfterUpdate caused by: System.FinalException: Record is read-only: Trigger.TStock_RStock: line 9, column 1
None of the fields used in this trigger are read only, I made sure of that. Can someone please help me with this.
Target records in after update trigger is readonly. If you want to modify target records use before update trigger instead.
trigger TStock_RStock on Inventory__c (before update)
{
for(Inventory__c inv : trigger.new)
{
Inventory__c oldValue = Trigger.oldMap.get(inv.ID);
{
if( inv.Number_1__c != oldValue.Number_1__c)
{
inv.Test_Stock__c = inv.Test_Stock__c + inv.Number_1__c;
inv.Remaining_Stock__c = inv.Remaining_Stock__c + inv.Number_1__c;
}
if( inv.Number_2__c != oldValue.Number_2__c)
{
inv.Test_Stock__c = inv.Test_Stock__c + inv.Number_2__c;
inv.Remaining_Stock__c = inv.Remaining_Stock__c + inv.Number_2__c;
}
if( inv.Number_3__c != oldValue.Number_3__c)
{
inv.Test_Stock__c = inv.Test_Stock__c + inv.Number_3__c;
inv.Remaining_Stock__c = inv.Remaining_Stock__c + inv.Number_3__c;
}
}
}
}
All Answers
Target records in after update trigger is readonly. If you want to modify target records use before update trigger instead.
trigger TStock_RStock on Inventory__c (before update)
{
for(Inventory__c inv : trigger.new)
{
Inventory__c oldValue = Trigger.oldMap.get(inv.ID);
{
if( inv.Number_1__c != oldValue.Number_1__c)
{
inv.Test_Stock__c = inv.Test_Stock__c + inv.Number_1__c;
inv.Remaining_Stock__c = inv.Remaining_Stock__c + inv.Number_1__c;
}
if( inv.Number_2__c != oldValue.Number_2__c)
{
inv.Test_Stock__c = inv.Test_Stock__c + inv.Number_2__c;
inv.Remaining_Stock__c = inv.Remaining_Stock__c + inv.Number_2__c;
}
if( inv.Number_3__c != oldValue.Number_3__c)
{
inv.Test_Stock__c = inv.Test_Stock__c + inv.Number_3__c;
inv.Remaining_Stock__c = inv.Remaining_Stock__c + inv.Number_3__c;
}
}
}
}
Hey Akram,
Thanks for the solution. I never used after update in my trigger before. Guess I won't have to in most cases.
Hi Nishan
This is not a rule of thumb. It depends on your requirement. Just keep in mind that before update means you can modify target record and in after update you cannot do this.