Updating PartPlant through PartSvc

I’m trying to clear/default some values after a part has been duplicated.

I created a post-processing bpm on Duplicate, loading up an instance of the PartSvc contract, making my changes, setting appropriate RowMod and calling update at the end. Most of it is going fine except for the PartPlant records. Those aren’t being changed for some reason. Has anyone tried something similar?

using (Erp.Contracts.PartSvcContract partSvc =  Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.PartSvcContract>(Db)) {

    var part = partSvc.GetByID(targetPartNum);
    part.Part[0]["BarcodeChecked_c"] = false;
    part.Part[0]["MSBarcode_c"] = "";
    part.Part[0].RowMod = "U";
    
    foreach(var plant in part.PartPlant)
    {
      plant.MinimumQty = 0;
      plant.MaximumQty = 0;
      plant.SafetyQty = 0;
      plant.VendorNum = 0;
      
      plant.RowMod = "U";

    }
    
    foreach(var rev in part.PartRev) {
      
      rev.RowMod = "D";
    }
    
    foreach(var whse in part.PartWhse) {
      whse.PrimBinNum = "GENERAL";
    
      whse.RowMod = "U";
    }
    
    
    partSvc.Update(ref part);
    
}


Well, I couldn’t figure out why using the part service wasn’t working, but got some inspiration from one of Tim Shoemaker’s old posts to just use the Db to make changes.

using(var txScope = IceContext.CreateDefaultTransactionScope()) {
  var plants = Db.PartPlant.With(LockHint.UpdLock).Where(pp => pp.Company == Session.CompanyID && pp.PartNum == targetPartNum);
  foreach(var plant in plants)
  {
    plant.MinimumQty = 0;
    plant.MaximumQty = 0;
    plant.SafetyQty = 0;
    plant.VendorNum = 0;
 
  }
  Db.Validate();
  txScope.Complete();
}

I am having the same exact issue. I “DuplicatePart” in custom BPM code and the transaction only works sometimes. Other times it is called, it throws a BPM Runtime Error. This is my code:

// Change PartPlant
using(var txScope = IceContext.CreateDefaultTransactionScope()) {
var plants = Db.PartPlant.With(LockHint.UpdLock).Where(pp => pp.Company == Session.CompanyID && pp.PartNum == ord.PartNum );
foreach(var plant in plants)
{
plant.SourceType = “M”;
plant.NonStock = true;
Ice.Diagnostics.Log.WriteEntry($"PartPlant Changes for Part: " );
}
Db.Validate();
txScope.Complete();
}