单一字段值不会在缓存更新时更新

问题描述

我正在尝试插入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配置为分配了认位置,则该项目会为所有其他字段正确插入,但如果未插入,则会引发此错误

错误:插入“ IN Kit Split”记录引起至少一个错误。请检查错误

我在做什么错了?

错误”:

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