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

如何在Acumatica中删除符合条件的表头记录?

问题排查与代码修正

原代码核心问题

  1. 在RowPersisting事件中创建独立的KitAssemblyEntry实例操作同一条记录,会与当前正在执行的持久化流程产生冲突(比如时间戳校验失败、缓存状态不一致)
  2. 手动调用graph.Save.Press()会干扰Acumatica的默认事务处理逻辑,引发不可预期的错误
  3. 未判断操作类型,若为新建记录的场景,原逻辑会导致不必要的跨graph操作

修正后的代码

protected void INKitRegister_RowPersisting(PXCache cache, PXRowPersistingEventArgs e)
{
    var row = (INKitRegister)e.Row;
    if (row == null) return;
    var extKit = row.GetExtension<INKitRegisterExt>();            

    // 仅在制造阶段为"06"(已取消)且为更新操作时执行删除逻辑
    if (extKit.UsrFabStage == "06" && e.Operation == PXDBOperation.Update)
    {
        if (Base.Document.Ask("Confirm Delete", "Are you sure?", MessageButtons.YesNo) == WebDialogResult.Yes)
        {
            // 直接在当前缓存中删除记录
            cache.Delete(row);
            // 取消当前持久化操作,避免原有保存流程继续执行
            e.Cancel = true;
        }
    }
}

关键修正说明

  • 移除跨Graph操作:直接使用当前事件上下文的cache对象删除记录,避免独立Graph实例与当前持久化流程的冲突
  • 新增操作类型判断:仅针对更新操作执行删除逻辑,符合“修改制造阶段为取消后保存时删除”的业务场景
  • 终止原有持久化流程:设置e.Cancel = true,确保在删除记录后,Acumatica不会继续执行原有的保存操作
  • 移除冗余代码:删除PXTimeStampScope和手动Save.Press()调用,遵循Acumatica的默认事务处理机制

额外注意事项

  • 确认UsrFabStage字段的取值映射正确,若该字段为枚举类型,建议使用枚举常量替代字符串"06",避免硬编码错误
  • 若需要支持“新建记录时直接标记为取消并删除”的场景,可移除e.Operation == PXDBOperation.Update的判断条件

内容的提问来源于stack exchange,提问作者Marco A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:47:24