You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
}

核心问题分析

  1. 图扩展目标错误:GI AP-Vendors对应的后台图是APVendorInq(供应商查询图),而非VendorMaint(供应商维护图),需针对APVendorInq做扩展。
  2. DAC类型不匹配:GI AP3030PL的数据源是VendorR(只读供应商视图),而非BAccount,Action的泛型参数需与GI的主DAC一致。
  3. 批量菜单添加位置错误: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、查询页面),提供供应商的完整只读数据,避免直接操作物理表。

验证步骤

  1. 编译发布该扩展项目。
  2. 打开GI副本,点击工具栏的批量操作下拉菜单,即可看到"Verify Now"按钮。
  3. 选中多条供应商记录,点击按钮即可执行批量处理逻辑。

内容的提问来源于stack exchange,提问作者Gav D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:25:27