创建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
相关产品推荐
相关产品推荐

