Ok this code is 2 years old before I knew what I was doing at all, but it works.
It is part of a larger program, but you can pick through it.
//Add Lot from PCID
Action<string, string, string, string, string, string, decimal, string, Erp.Contracts.PkgControlIDBuildSplitMergeSvcContract, Erp.Contracts.PkgControlIDSvcContract> AddToPCID = (pcid, partNum, partDesc, partClass, jobNum, lotNum, qty, uom, pcidBSM, pcidItem) =>
{
bool retVal = false;
Erp.Tablesets.PCIDBuildSplitMergeDestTableset destTS = new Erp.Tablesets.PCIDBuildSplitMergeDestTableset();
Erp.Tablesets.PCIDBuildSplitMergeSourcePartTableset sourceTS = new Erp.Tablesets.PCIDBuildSplitMergeSourcePartTableset();
pcidBSM.GetDestPCID(pcid, false, ref destTS);
Erp.Tablesets.PCIDBuildSplitMergeSourcePartRow partRow = (Erp.Tablesets.PCIDBuildSplitMergeSourcePartRow)sourceTS.PCIDBuildSplitMergeSourcePart.NewRow();
partRow.Company = Session.CompanyID;
partRow.Plant = "";
partRow.PartNum = partNum;
partRow.PartDescription = partDesc;
partRow.BinNum = "WARE";
partRow.BinDescription = "Warehouse";
partRow.LotNum = lotNum;
partRow.LotTrackedPart = true;
partRow.SerialTrackedPart = false;
partRow.OnHandQuantity = qty;
partRow.SourceQuantity = qty;
partRow.AvailableQuantity = qty;
partRow.WarehouseCode = (partClass == "SCRA" ? "SCRAP" : "FIN");
partRow.SourceUOM = uom;
partRow.AvailableUOM = uom;
partRow.OnHandUOM = uom;
partRow.AttributeSetID = 0;
partRow.EnableAttributeSetSearch = false;
partRow.PartTrackInventoryAttributes = false;
//partRow.DispNumberOfPieces = 0;//0
partRow.SysRowID = Guid.NewGuid();
partRow.RowMod = "A";
sourceTS.PCIDBuildSplitMergeSourcePart.Add(partRow);
pcidBSM.AddPartToPCID(ref sourceTS, ref destTS);
Erp.Tablesets.PkgControlIDTableset pcidTS = new Erp.Tablesets.PkgControlIDTableset();
pcidTS = pcidItem.GetByID(pcid);
pcidTS.PkgControlItem.FirstOrDefault().SupplyJobNum = jobNum;
pcidTS.PkgControlItem.FirstOrDefault().RowMod = "U";
pcidItem.Update(ref pcidTS);
};