获取新插入INTran行的LineNbr值的技术疑问
解决Acumatica中INTran新行LineNbr获取为空的问题
我之前在Acumatica开发时也遇到过类似的INTran LineNbr获取问题,结合我的经验给你几个可行的解决方向:
不要依赖原缓存对象,重新获取最新行
Acumatica的缓存在保存后,不会自动更新原有对象的系统生成字段(比如LineNbr)——你手里的那个INTran对象是插入前的实例,自然没有LineNbr值。保存完成后,你需要从graph的缓存或数据库重新查询最新的行数据:// 执行保存操作 graph.Actions.PressSave(); // 方式1:从当前graph的缓存中获取最新行 INTran latestTran = graph.INTran.SelectSingle(); // 方式2:通过单据类型和单号精准查询(更可靠) INTran latestTran = PXSelect<INTran, Where<INTran.tranType, Equal<Required<INTran.tranType>>, And<INTran.refNbr, Equal<Required<INTran.refNbr>>>>> .Select(graph, yourTranType, yourRefNbr);确保事务已提交
如果你是在自定义事务块中操作,一定要确认事务已经提交到数据库,否则PXSelect可能查不到最新数据:using (var transactionScope = new PXTransactionScope()) { // 插入新INTran行的逻辑 graph.Actions.PressSave(); // 提交事务,让数据写入数据库 transactionScope.Complete(); }手动刷新缓存中的当前行
如果不想重新查询,也可以尝试手动刷新缓存里的当前行,强制同步数据库中的最新值:graph.Actions.PressSave(); // 重新加载当前行的缓存数据 graph.INTran.Cache.Reload(graph.INTran.Current); // 此时graph.INTran.Current.LineNbr应该有值了
核心原因在于:你最初创建的INTran对象是插入前的状态,LineNbr是数据库/系统在保存时生成的,原有对象不会自动更新这个值。必须通过重新查询或刷新缓存,才能拿到带LineNbr的最新实例。
内容的提问来源于stack exchange,提问作者EricP.
相关产品推荐
相关产品推荐

