Acumatica通过EventHandler在Graph写入DB值不生效问题排查
失效原因
代码无法生效有三个核心问题:
- 调用
SetValueExt时传入的是ScanHeader对应的缓存实例,并非SOShipment所属的缓存,赋值操作无法被SOShipment的缓存跟踪逻辑识别 - 通过
PXGraph.CreateInstance新建了独立的无上下文Graph实例,查询到SOShipment记录完成修改后,没有触发持久化动作,内存中的修改会被直接回收 - 修改字段后没有将
SOShipment标记为已更新状态,即使缓存正确,框架也不会将该记录纳入待持久化队列
修正后的实现代码
protected void ScanHeader_Barcode_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { ScanHeader row = (ScanHeader)e.Row; if (row == null) return; HeaderExt headerExt = row.GetExtension<HeaderExt>(); if (headerExt == null) return; // 直接获取当前事件上下文绑定的PickPackShip.Host实例,避免创建孤立Graph PickPackShip.Host graph = (PickPackShip.Host)cache.Graph; // 获取SOShipment对应的正确缓存对象 PXCache shipmentCache = graph.Caches<SOShipment>(); // 按条码查询匹配的发货单 SOShipment shipment = PXSelect<SOShipment, Where<SOShipment.shipmentNbr, Equal<Required<SOShipment.shipmentNbr>>>> .Select(graph, row.Barcode); if (shipment != null) { // 基于SOShipment缓存给扩展字段赋值 shipmentCache.SetValueExt<SOShipmentExt.myField>(shipment, headerExt.MyField); // 标记记录为已更新,让框架识别到字段变更 shipmentCache.Update(shipment); // 如果需要字段值修改后立刻写入数据库,保留下面这行;如果要等用户点击保存按钮统一提交,注释掉这行即可 graph.Persist(); } }
关键调整说明
- 不再新建独立Graph实例,直接从事件参数的
cache.Graph获取当前页面绑定的PickPackShip.Host实例,保证操作在同一个上下文事务内 - 所有针对
SOShipment的字段操作,都通过SOShipment专属的缓存实例执行,避免跨缓存操作失效 - 赋值后调用
Update方法标记记录变更,按需选择是否立刻调用Persist持久化到数据库
内容的提问来源于stack exchange,提问作者Param A.
相关产品推荐
相关产品推荐

