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

Acumatica跳转客户合同页遇空引用错误,如何正确填充客户字段?

解决Acumatica创建合同按钮的空引用错误及跳转填充问题

问题场景

在Business Accounts(CR303000)的Contracts标签页创建了名为"Create Contract"的按钮,预期点击后跳转至Customer Contracts(CT301000)页面并自动填充当前Business Account到Customer字段,但点击时触发**"Object reference not set to an instance of an object"**空引用错误。

相关截图说明:

  • 截图1:展示CR303000页面中添加的"Create Contract"按钮位置
  • 截图2:显示点击按钮后弹出的空引用错误提示
  • 截图3:展示按钮的配置界面

原代码片段

public PXAction<PX.Objects.CR.BAccount> CreateContract;
  
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Create Contract")]
protected void createContract()
{
        ContractMaint contractMaint = PXGraph.CreateInstance<ContractMaint>();

        Contract newContract = new Contract();
        
        newContract.CustomerID = Base.BAccount.Current.BAccountID;

        contractMaint.Contracts.Update(newContract);

        throw new PXRedirectRequiredException(contractMaint, true, "New Contract")
        {
            Mode = PXBaseRedirectException.WindowMode.NewWindow
        };
}

错误原因分析

  1. 空引用触发点:Base.BAccount.Current可能为null,未选中任何Business Account就点击按钮,直接访问BAccountID会抛出空引用异常。
  2. 新增逻辑错误:使用contractMaint.Contracts.Update(newContract)是错误的,Update方法用于修改已有记录,新增合同应使用Insert方法。

修正后的代码

public PXAction<PX.Objects.CR.BAccount> CreateContract;

[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Create Contract")]
protected void createContract()
{
    // 检查当前是否选中了商业账户
    BAccount currentBAccount = Base.BAccount.Current;
    if (currentBAccount == null)
    {
        PXTrace.WriteError("请先选择一个商业账户");
        return;
    }

    // 可选:校验当前账户为客户类型,符合合同关联逻辑
    if (currentBAccount.Type != BAccountType.CustomerType)
    {
        PXTrace.WriteError("仅客户类型账户可创建合同");
        return;
    }

    ContractMaint contractMaint = PXGraph.CreateInstance<ContractMaint>();

    // 初始化新合同并绑定客户ID
    Contract newContract = new Contract();
    newContract.CustomerID = currentBAccount.BAccountID;

    // 插入新合同到数据源
    contractMaint.Contracts.Insert(newContract);

    // 跳转至合同页面
    throw new PXRedirectRequiredException(contractMaint, true, "New Contract")
    {
        Mode = PXBaseRedirectException.WindowMode.NewWindow
    };
}

关键修正点说明

  • 增加Base.BAccount.Current的空值校验,提前拦截无选中记录的情况并给出提示。
  • 新增客户类型校验(可选),确保业务逻辑合理性。
  • 将Update替换为Insert,正确完成新合同的创建操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:52:02