在Acumatica中跨图调用Action,如何传递正确PXAdapter至Release方法?
让我来帮你一步步拆解并解决这几个问题:
问题1:PXAdapter获取所有ARPayment记录导致批量处理异常
你遇到的核心问题是PXAdapter默认拉取了所有ARPayment记录,这不仅拖慢了处理速度,还引入了无效记录导致后续错误。解决思路是给适配器添加精准的过滤条件,只让它处理你需要的目标记录。
举个代码示例,假设你要处理当前选中的Payment记录:
// 获取当前要处理的付款记录 var currentPayment = graphPmt.Document.Current; if (currentPayment == null) return; // 创建适配器并指定过滤条件,只匹配当前记录的DocType和RefNbr var releaseAdapter = new PXAdapter(graphPmt.Document) { Searches = new object[] { currentPayment.DocType, currentPayment.RefNbr } }; // 执行Release操作,此时只会处理目标记录 graphPmt.Release.Press(releaseAdapter);
这样就能避免适配器拉取全量数据,大幅提升处理效率,同时也能排除其他无效记录的干扰。
问题2:“PaymentMethod can't be null”错误(调试时Document.PaymentMethod非空)
这个错误大概率是因为之前适配器拉取的全量记录中,存在PaymentMethod为空的其他付款记录,而你调试时查看的是当前正常的Document记录。
解决了第一个问题后,适配器只会处理你指定的目标记录,这个错误应该会自然消失。不过保险起见,你可以在执行Release前先做个校验:
var currentPayment = graphPmt.Document.Current; if (string.IsNullOrEmpty(currentPayment.PaymentMethodID)) { throw new PXException("当前付款记录的支付方式不能为空,请检查后重试。"); }
如果还是出现错误,可能是缓存同步问题,尝试刷新一下缓存再操作:
graphPmt.Document.Cache.Reload(currentPayment);
问题3:在另一个图中调用Action时传递适配器
当你需要在A图中调用B图的Action时,核心是实例化目标图后,创建关联到目标视图的适配器,并传入对应的过滤条件或记录。
举个具体的例子,假设你要在GraphA中调用PaymentEntry图的Release操作:
// 实例化目标图PaymentEntry using (var pmtGraph = PXGraph.CreateInstance<PaymentEntry>()) { // 假设你在GraphA中有要处理的付款记录的DocType和RefNbr string targetDocType = "INV"; string targetRefNbr = "PMT-000123"; // 创建适配器,关联到PaymentEntry的Document视图,并设置搜索条件 var adapter = new PXAdapter(pmtGraph.Document) { Searches = new object[] { targetDocType, targetRefNbr } }; // 调用Release Action pmtGraph.Release.Press(adapter); }
如果需要传递多条记录,也可以直接给适配器的Records属性赋值:
// 假设你有一批要处理的ARPayment记录列表 List<ARPayment> targetPayments = GetTargetPayments(); using (var pmtGraph = PXGraph.CreateInstance<PaymentEntry>()) { var adapter = new PXAdapter(pmtGraph.Document) { Records = targetPayments.ToArray() }; pmtGraph.Release.Press(adapter); }
内容的提问来源于stack exchange,提问作者Maxime
相关产品推荐
相关产品推荐

