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

创建SOInvoice时设置OverrideAddress重写地址不生效

SOInvoice地址重写不生效问题修复

问题表现

通过代码创建SOInvoice单据时,单据头部的所有操作可正常执行,仅地址区域的重写逻辑不生效。代码运行全程无抛出报错,但自定义的地址字段值未被保存,地址重写开关未按预期触发,地址仍取系统默认关联值。

原有问题代码

初始化逻辑

SOInvoiceEntry sOInvoiceEntry = PXGraph.CreateInstance<SOInvoiceEntry>();
ARInvoice aRInvoice = new ARInvoice();

失效的地址重写逻辑

ARAddress aRAddress = new ARAddress();
aRAddress.OverrideAddress = true;

aRAddress.AddressLine1 = header.BillToAddressLine1;
aRAddress.AddressLine2 = header.BillToAddressLine2;
aRAddress.City = header.BillToCity;
aRAddress.CountryID = header.BillToCountryID;
aRAddress.State = header.BillToState;
aRAddress.PostalCode = header.BillToPostalCode;

// 尝试插入地址
sOInvoiceEntry.Billing_Address.Insert(aRAddress);

// 执行保存
sOInvoiceEntry.Actions.PressSave();

问题根因

直接手动实例化ARAddress对象调用Insert方法的写法不符合SOInvoiceEntry视图的运行逻辑:

  • Billing_Address是和ARInvoice单据头强关联的子视图,系统会在单据头记录插入缓存后,自动生成关联的默认地址快照,手动new的地址对象因为缺少和单据头匹配的关联主键,会被缓存逻辑直接忽略
  • 未先完成单据头的插入与缓存更新就操作地址,后续触发的地址默认同步逻辑会直接覆盖手动赋值的字段值,OverrideAddress标记也不会被正确识别

修复方案

按照视图的生命周期调整代码执行顺序,不要直接插入新的地址对象,在系统自动生成的地址记录上做修改:

  • 先完成ARInvoice单据头的赋值、插入、缓存更新操作,确保单据头在缓存中生成有效记录
  • 直接取Billing_Address视图的Current属性,获取系统自动生成的关联地址记录
  • 先给现有地址记录设置OverrideAddress = true开启重写标记,再赋值自定义地址字段,调用Update方法提交缓存更新
  • 最后执行保存操作

修复后可运行代码

SOInvoiceEntry sOInvoiceEntry = PXGraph.CreateInstance<SOInvoiceEntry>();
// 先处理单据头
ARInvoice aRInvoice = new ARInvoice();
// 此处补充单据头必填字段赋值:如单据类型、客户ID、单据日期等
aRInvoice = sOInvoiceEntry.Document.Insert(aRInvoice);
// 完成单据头剩余字段赋值后更新缓存
aRInvoice = sOInvoiceEntry.Document.Update(aRInvoice);

// 取系统自动生成的关联地址,不要手动new新对象
ARAddress aRAddress = sOInvoiceEntry.Billing_Address.Current;
if (aRAddress != null)
{
    // 先开重写标记,再赋值字段
    aRAddress.OverrideAddress = true;
    aRAddress.AddressLine1 = header.BillToAddressLine1;
    aRAddress.AddressLine2 = header.BillToAddressLine2;
    aRAddress.City = header.BillToCity;
    aRAddress.CountryID = header.BillToCountryID;
    aRAddress.State = header.BillToState;
    aRAddress.PostalCode = header.BillToPostalCode;
    // 提交地址更新到缓存
    sOInvoiceEntry.Billing_Address.Update(aRAddress);
}

// 最后保存
sOInvoiceEntry.Actions.PressSave();

补充说明:如果需要同时重写账单联系人,逻辑和地址完全一致:先取Billing_Contact.Current,设置OverrideContact = true后再赋值自定义字段,调用Update提交缓存即可。

内容的提问来源于stack exchange,提问作者Jorge Peruyero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:09:26