2022R2版本AP批量释放时Credit Adjustment明细未创建问题排查
Acumatica 2022R2 AP批量释放自定义扩展问题排查
核心问题
- 通过AP批量释放的自定义扩展插入现有凭证行并创建Credit Adjustment时,仅生成表头,无明细行
- 插入新凭证行并修改金额后,明细总额未同步减少
排查方向及解决方案
1. Credit Adjustment明细行未触发正确的持久化与关联逻辑
Acumatica创建Credit Adjustment时,明细行必须关联原AP凭证行,且需通过框架API完成创建与持久化:
- 检查代码是否直接手动创建
APAdjust记录,而非调用AdjustmentEntry图的AddDetail或类似关联方法,导致明细未绑定到表头 - 确认创建明细后是否执行
graph.APAdjusts.Cache.Persist(PersistActions.Insert)或graph.Actions.PressSave(),确保明细行被持久化 - 批量释放流程中,调整单创建逻辑需放在
ReleaseBatch事务上下文内执行,避免事务回滚导致明细丢失
2. 原凭证行状态或权限限制导致无法关联
批量释放过程中原凭证行可能处于锁定状态,无法生成调整明细:
- 验证自定义代码中创建Credit Adjustment前,原凭证行的
Status字段为Open或允许调整的状态 - 确认调整单创建后,是否正确更新原凭证行的关联调整记录,避免状态冲突导致明细无法写入
3. 明细总额未更新:未触发框架自动汇总计算
Acumatica的明细总额(如APInvoice.CuryDocTotal)依赖字段事件自动计算,手动修改金额后需触发对应事件:
- 避免直接赋值
APTran.CuryAmount,改用graph.APTran.Cache.SetValueExt<APTran.curyAmount>(tran, newAmount)修改,触发字段验证与汇总逻辑 - 修改金额后调用
graph.APTran.Cache.RaiseRowUpdated(tran, tran)或graph.CalculateTotals()强制刷新总额 - 确保修改操作在
ReleaseBatch事务完成前执行,保证汇总计算被纳入事务流程
4. 事件触发时机错误导致逻辑未执行
AP批量释放核心逻辑在APReleaseProcess类中,事件挂载时机错误会导致逻辑失效:
- 检查调整单创建逻辑是否挂载到
APReleaseProcess.ReleaseDoc的正确扩展点(如ReleaseDoc_AfterRelease),避免过早或过晚执行 - 禁止在批量释放事务提交后修改凭证行,此时凭证已锁定,修改不会生效
修正后的代码示例
// 创建Credit Adjustment并关联明细 var adjGraph = PXGraph.CreateInstance<AdjustmentEntry>(); var adjDoc = new APAdjust { AdjType = "CA", VendorID = originalInvoice.VendorID, RefNbr = PXAutoNumberAttribute.GetNextNumber(adjGraph, typeof(APAdjust.refNbr).Name, null), // 其他表头字段赋值 }; adjDoc = adjGraph.APAdjusts.Insert(adjDoc); // 添加关联的原凭证明细行 var adjTran = new APTran { AdjNbr = adjDoc.RefNbr, AdjType = adjDoc.AdjType, InvoiceNbr = originalInvoice.RefNbr, InvoiceType = originalInvoice.DocType, CuryAmount = -originalTran.CuryAmount, // 其他明细字段赋值 }; adjTran = adjGraph.APTran.Insert(adjTran); adjGraph.APTran.Cache.RaiseRowInserted(adjTran); // 保存调整单 adjGraph.Actions.PressSave(); // 修改原凭证行金额并刷新总额 var invoiceGraph = PXGraph.CreateInstance<APInvoiceEntry>(); var originalTran = invoiceGraph.APTran.Search<APTran.refNbr, APTran.lineNbr>(originalInvoice.RefNbr, originalLineNbr); if (originalTran != null) { invoiceGraph.APTran.Cache.SetValueExt<APTran.curyAmount>(originalTran, newAmount); invoiceGraph.CalculateTotals(); invoiceGraph.Actions.PressSave(); }
内容的提问来源于stack exchange,提问作者Tibu
相关产品推荐
相关产品推荐

