You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:33:10