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

如何为通过ConvertToBAccount()创建的新BAccount设置扩展字段

解决Contact转换为BAccount时设置自定义扩展字段的问题

嘿,针对你在Acumatica里遇到的Contact转BAccount时设置自定义扩展字段的问题,我有两个靠谱的解决办法,能完美解决你说的「赋值后界面不显示」或者「重写动作时没记录」的痛点:

方案一:重写ConvertToBAccount动作,直接在创建BAccount时赋值

这种方式最直接,在转换动作执行过程中就给新创建的BAccount扩展字段赋值,还能确保数据实打实写到数据库里:

public class ContactMaintExtension : PXGraphExtension<ContactMaint>
{
    // 定义动作的委托,用来覆盖原生逻辑
    public delegate void ConvertToBAccountDelegate();

    [PXOverride]
    public void ConvertToBAccount(ConvertToBAccountDelegate baseMethod)
    {
        // 先跑原生的转换逻辑,把BAccount对象创建出来
        baseMethod();

        // 动作里有个内置的PersistedBAccount属性,专门存刚创建好的BAccount记录
        BAccount newBAccount = Base.ConvertToBAccount.PersistedBAccount;
        if (newBAccount != null)
        {
            // 拿到BAccount的扩展缓存
            BAccountExt baExt = PXCache<BAccount>.GetExtension<BAccountExt>(newBAccount);
            
            // 这里可以从当前选中的Contact里取对应字段值,或者直接设固定值
            baExt.UsrMyCustomField = Base.Contact.Current.UsrContactCustomField;
            // 比如固定值:baExt.UsrMyCustomField = "从联系人转换而来";

            // 更新缓存并强制持久化,确保值真的写到数据库里
            Base.ConvertToBAccount.BAccountCache.Update(newBAccount);
            Base.ConvertToBAccount.BAccountCache.Persist(PXDBOperation.Insert);
        }
    }
}

方案二:利用BAccount的RowInserting事件自动赋值

如果你不想动Contact的转换动作,也可以在BAccount插入数据库的瞬间触发事件,判断是不是从Contact转过来的,再自动赋值:

public class BAccountMaintExtension : PXGraphExtension<BAccountMaint>
{
    protected void _(Events.RowInserting<BAccount> e)
    {
        BAccount newBAccount = e.Row as BAccount;
        if (newBAccount == null) return;

        // 转换动作执行时,当前的Contact会保存在Session里,直接取出来就行
        Contact currentContact = PXGraph.CreateInstance<ContactMaint>().Contact.Current;
        if (currentContact != null && currentContact.ContactID == newBAccount.ContactID)
        {
            BAccountExt baExt = PXCache<BAccount>.GetExtension<BAccountExt>(newBAccount);
            // 把Contact上的自定义字段同步到BAccount里
            baExt.UsrMyCustomField = currentContact.UsrContactCustomField;
        }
    }
}

几个关键要注意的点

  • 先检查你的BAccountExt扩展DAC写得对不对:字段要加对应的数据库存储属性(比如[PXDBString(50)]),还要加[PXUIField(DisplayName = "你的自定义字段名")],不然界面认不出来
  • 确认BAccount的页面(比如AR.30.30.00)已经拖入了这个自定义字段,不然数据库里有值,界面也显示不出来
  • 方案一里的PersistedBAccount是Acumatica新版本里ConvertToBAccount动作的内置属性,如果你用的版本比较老,可能需要换个方式获取刚创建的BAccount(比如从BAccount缓存里找最新的记录)

这样处理后,转换出来的BAccount会带着自定义字段值存到数据库,跳转去BAccount界面时,系统会从数据库读最新值,自然就能显示出来了。

内容的提问来源于stack exchange,提问作者EricP.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:09:04