如何在Acumatica的通用查询(GI)中添加自定义批量操作按钮
问题解决:Acumatica GI批量操作按钮不显示及实现步骤
问题背景
使用版本21.210.0030,作为Acumatica开发新手,现有PXAction代码在Vendor表单(AP303000)可正常运行,但基于AP-Vendors(AP3030PL)创建的GI过滤副本中,无法将自定义按钮显示在批量操作列表中。尝试设置IsMass=true并添加到菜单,但无效果,同时对BAccount、VendorR、Vendor的使用存在困惑。
现有VendorMaint扩展代码:
public class VendorMaint_Extension : PXGraphExtension<VendorMaint> { public SelectFrom<PX.Objects.CR.BAccount>.View suppliers; #region buttons public PXAction<PX.Objects.CR.BAccount> myButton; [PXButton(CommitChanges = true)] [PXUIField(DisplayName = "Verify Now", IsDirty = true)] public virtual IEnumerable MyButton(PXAdapter adapter) { BAccount supplier = suppliers.Current; PX.Objects.CR.BAccountExt bAccountExt = PXCache<BAccount>.GetExtension<PX.Objects.CR.BAccountExt>(supplier); // do my stuff... //... //... return adapter.Get(); } #endregion buttons //... //... }
尝试过的Initialize代码:
public override void Initialize() { base.Initialize(); myButton.IsMass = true; Base.action.AddMenuAction(this.myButton); }
核心问题分析
- 图扩展目标错误:GI AP-Vendors对应的后台图是
APVendorInq(供应商查询图),而非VendorMaint(供应商维护图),需针对APVendorInq做扩展。 - DAC类型不匹配:GI AP3030PL的数据源是
VendorR(只读供应商视图),而非BAccount,Action的泛型参数需与GI的主DAC一致。 - 批量菜单添加位置错误:GI的批量操作菜单是
MassActions,而非action,需将Action添加到Base.MassActions中。
解决方案代码
正确的APVendorInq扩展类
using PX.Data; using PX.Objects.AP; using PX.Objects.CR; public class APVendorInq_Extension : PXGraphExtension<APVendorInq> { // GI主视图为VendorR,Action泛型参数对应设置为VendorR public PXAction<VendorR> verifyVendors; [PXButton(CommitChanges = true)] [PXUIField(DisplayName = "Verify Now", IsDirty = true)] public virtual IEnumerable VerifyVendors(PXAdapter adapter) { // 遍历GI中选中的所有供应商记录 foreach (VendorR vendorR in adapter.Get()) { // 通过VendorR的BAccountID关联获取BAccount记录 BAccount bAccount = PXSelect<BAccount, Where<BAccount.bAccountID, Equal<Required<BAccount.bAccountID>>>> .Select(Base, vendorR.BAccountID); if (bAccount != null) { BAccountExt bAccountExt = PXCache<BAccount>.GetExtension<BAccountExt>(bAccount); // 执行你的业务逻辑 // ... } } return adapter.Get(); } public override void Initialize() { base.Initialize(); // 标记为批量操作按钮 verifyVendors.IsMass = true; // 添加到GI的批量操作菜单中 Base.MassActions.AddMenuAction(verifyVendors); } }
关键概念解释
- BAccount:物理表,存储所有类型账户(客户、供应商、员工等)的通用基础信息,是所有账户的核心表。
- Vendor:物理表,存储供应商特有的字段(如付款条款、税号等),通过
BAccountID与BAccount关联。 - VendorR:只读DAC视图,是BAccount与Vendor的关联视图,专门用于查询场景(如GI、查询页面),提供供应商的完整只读数据,避免直接操作物理表。
验证步骤
- 编译发布该扩展项目。
- 打开GI副本,点击工具栏的批量操作下拉菜单,即可看到"Verify Now"按钮。
- 选中多条供应商记录,点击按钮即可执行批量处理逻辑。
内容的提问来源于stack exchange,提问作者Gav D
相关产品推荐
相关产品推荐

