0

I am trying to create Order Delivery Method and Order Delivery group for each Order Item when Order Item record is created. After that I need to update Order item with Order Delivery Group. But when I create an Order Item record am getting this error

AfterInsert caused by: System.FinalException: Record is read-only ()

Below is my code:

trigger CreateOrderSummary on OrderItem (after insert,after update)
{
    List<OrderDeliveryMethod> odmList=new List<OrderDeliveryMethod>();
    List<OrderDeliveryGroup> odgList=new List<OrderDeliveryGroup>();
    list<OrderItem> otList=new List<OrderItem>();
    List<Id> otId=new List<Id>();
    for(OrderItem ot: trigger.new){
        if(ot.SBQQ__Status__c=='Draft'){
            OrderDeliveryMethod odm=new OrderDeliveryMethod();
            odm.Name=ot.OrderItemNumber;
            odm.IsActive=True;
            odm.ProductId=ot.Product2Id;
            odmList.add(odm);
      
            OrderDeliveryGroup odg=new OrderDeliveryGroup();
            odg.DeliverToName='Shipping Address';
            odg.OrderId=ot.OrderId;
            odg.Product__c=ot.Product2Id;
            odg.Order_Product__c=ot.Id;
            odgList.add(odg); 
            otList.add(ot);
            otId.add(ot.Id);
        }
    }
    insert odmList;
    insert odglist;
    for(OrderDeliveryMethod od:odmList) {
        for(OrderDeliveryGroup og: odgList){
            if(od.ProductId==og.Product__c){
               og.OrderDeliveryMethodId=od.Id; 
            }
        }
    }
    update odgList;
    for(OrderDeliveryGroup og: odgList){
        for(OrderItem ot:otList) {
            if(ot.Id==og.Order_Product__c){
               ot.OrderDeliveryGroupId=og.Id; 
            }
        }
    }
    update otList; 
}

It works fine if I remove below code. But I want to update Order Item with OrderDeliveryGroup after created.

for(OrderDeliveryGroup og: odgList){
    for(OrderItem ot:otList) {
        if(ot.Id==og.Order_Product__c){
            ot.OrderDeliveryGroupId=og.Id; 
        }
    }
}
update otList;

I tried with trigger.isBefore, when I used that I am not getting an error but OrderDeliveryGroup is not updated on Order Item.

Kindly let me know if missed something

1 Answer 1

2

The records that cause a trigger to run are read-only in the after context. In order to update those records in the after context, you'll need to create a copy of them. See below:

    for(OrderItem ot: trigger.new){
        if(ot.SBQQ__Status__c=='Draft'){
            OrderDeliveryMethod odm=new OrderDeliveryMethod();
            odm.Name=ot.OrderItemNumber;
            odm.IsActive=True;
            odm.ProductId=ot.Product2Id;
            odmList.add(odm);
      
            OrderDeliveryGroup odg=new OrderDeliveryGroup();
            odg.DeliverToName='Shipping Address';
            odg.OrderId=ot.OrderId;
            odg.Product__c=ot.Product2Id;
            odg.Order_Product__c=ot.Id;
            odgList.add(odg); 
            // add a copy of the OrderItem instead of the original
            otList.add(new OrderItem(Id = ot.Id));
            otId.add(ot.Id);
        }
    }

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .