function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
NishanNishan 

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.

Best Answer chosen by Admin (Salesforce Developers) 
SarfarajSarfaraj

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

SarfarajSarfaraj

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;
}

}
}
}

This was selected as the best answer
NishanNishan

Hey Akram,

                    Thanks for the solution. I never used after update in my trigger before. Guess I won't have to in most cases.

SarfarajSarfaraj

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.