如何在Acumatica中删除符合条件的表头记录?
问题排查与代码修正
原代码核心问题
- 在
RowPersisting事件中创建独立的KitAssemblyEntry实例操作同一条记录,会与当前正在执行的持久化流程产生冲突(比如时间戳校验失败、缓存状态不一致) - 手动调用
graph.Save.Press()会干扰Acumatica的默认事务处理逻辑,引发不可预期的错误 - 未判断操作类型,若为新建记录的场景,原逻辑会导致不必要的跨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.
相关产品推荐
相关产品推荐

