问题描述
我正在尝试插入INKitRegister
项。这是代码:
KitAssemblyEntry kitGraph = CreateInstance<KitAssemblyEntry>();
INKitRegister kit = new INKitRegister();
kitGraph.Document.Current = kit;
kitGraph.Document.Cache.SetValueExt<INKitRegister.inventoryID>(kit,mixQLine.InventoryID);
// This line is not working
kitGraph.Document.Cache.SetValueExt<INKitRegister.locationID>(kit,scales.LocationID);
kitGraph.Document.Cache.SetValueExt<INKitRegister.uOM>(kit,mixQLine.Uom);
kitGraph.Document.Cache.SetValueExt<INKitRegister.qty>(kit,mixQLine.Qty);
kit = kitGraph.Document.Cache.Update(kit) as INKitRegister;
kitGraph.Actions.PressSave();
如果我手动将InventoryItem配置为分配了默认位置,则该项目会为所有其他字段正确插入,但如果未插入,则会引发此错误:
我在做什么错了?
“错误”:
9/11/2020 2:36:26 PM错误: 错误:插入“ IN Kit Split”记录引起至少一个错误。请检查错误。 在PX.Data.PXUIFieldAttribute.CommandPreparing(PXCache发送者,PXCommandPreparingEventArgs e) 在PX.Data.PXCache.OnCommandPreparing处(字符串名称,对象行,对象值,PXDBOperation操作,类型表,FieldDescription和描述) 在PX.Data.PXProjectionAttribute.PersistInserted(PXCache发送者,对象行) 在PX.Data.PXCache.PersistInserted(对象行,布尔bypassInterceptor) 在PX.Data.PXCache.Persist(PXDBOperation操作) 在PX.Data.PXGraph.Persist(类型cacheType,PXDBOperation操作) 在PX.Data.PXGraph.Persist() 在PX.Data.PXSave.d__2.MoveNext() 在PX.Data.PXAction.d__28.MoveNext() 在PX.Data.PXAction.d__28.MoveNext() 在PX.Web.UI.PXBaseDataSource.tryExecutePendingCommand(String viewName,String [] sortcolumns,Boolean []降序,Object []搜索,Object []参数,PXFilterRow []过滤器,DataSourceSelectArguments参数,Boolean&closeWindowrequired,Int32&adapterStartRow,Int32&adapterTotalRows ) 在PX.Web.UI.PXBaseDataSource.ExecuteSelect(String viewName,DataSourceSelectArguments自变量,PXDSSelectArguments pxarguments)
解决方法
使用SetValueExt看起来正确,只要mixQLine和scales都不为空,并且引用字段也不为null。但是,您应该通过 Document.Insert(kit); 模拟“插入”按钮,以插入新的INKitRegister。有时,您需要在插入之前在记录中填写一些值(例如在输入SOType的销售订单中),但是在大多数情况下,我并不需要这样做。如果您的记录存在,通常可以通过以下方式搜索记录:
Document.Current = Document.Search<keyField>(keyValue);
在视图上使用Insert方法将确保创建记录,并在图中触发所有适当的事件。我最好的猜测是这是潜在的问题,尽管您可能需要在设置某些字段之前对缓存进行临时更新。 (例如,如果位置与清单ID相关联,则可能需要使用清单ID更新缓存,以便DAC更新选择器并检索适用于该物料的位置。)
未经测试,但这就是我要做的。
KitAssemblyEntry kitGraph = CreateInstance<KitAssemblyEntry>();
INKitRegister kit = new INKitRegister();
// Sometimes need to set initial values here
kit = kitGraph.Document.Insert(kit);
kitGraph.Document.Cache.SetValueExt<INKitRegister.inventoryID>(kit,mixQLine.InventoryID);
//May need to do an interim update on the cache after setting certain fields
kit = kitGraph.Document.Update(kit);
kitGraph.Document.Cache.SetValueExt<INKitRegister.locationID>(kit,scales.LocationID);
kitGraph.Document.Cache.SetValueExt<INKitRegister.uOM>(kit,mixQLine.Uom);
kitGraph.Document.Cache.SetValueExt<INKitRegister.qty>(kit,mixQLine.Qty);
////////////////////////////////
//Alternate way to to set values
kit.InventoryID = mixQLine.InventoryID;
//May need to do an interim update on the cache after setting certain fields
kit = kitGraph.Document.Update(kit);
kit.LocationID = scales.LocationID;
kit.Qty = mixQLine.Qty;
kit.UOM = mixQLine.Uom;
////////////////////////////////
kit = kitGraph.Document.Update(kit);
kitGraph.Actions.PressSave();
,
我为我的一个项目使用了以下代码,该代码可以正常工作。该代码可能对您有所帮助。
KitAssemblyEntry kitGraph = PXGraph.CreateInstance<KitAssemblyEntry>();
INKitRegister objkitregister = PXCache<INKitRegister>.CreateCopy(kitGraph.Document.Insert(new INKitRegister()));
objkitregister.InventoryID = kitspecifications.KitInventoryID;
objkitregister.KitRevisionID = SOKitRevisionID;
objkitregister.Hold = false;
objkitregister.Qty = Requiredkitqty;
objkitregister = kitGraph.Document.Update(objkitregister);
kitGraph.Save.Press();
if (kitGraph.Actions.Contains("Release"))
{
kitGraph.Actions["Release"].Press();
}