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 }; }
错误原因分析
- 空引用触发点:
Base.BAccount.Current可能为null,未选中任何Business Account就点击按钮,直接访问BAccountID会抛出空引用异常。 - 新增逻辑错误:使用
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
相关产品推荐
相关产品推荐

