Acumatica 2019R1中TR订单类型发货创建异常及字段显示需求
针对你在Acumatica 2019R1中遇到的TR订单类型发货限制问题,我来梳理下背景、现有代码和可能的解决方向:
我们在Acumatica中使用TR(Transfer)订单类型,已经通过自定义代码让Sales Order页面上的CustomerID和Customer Location字段可见(标准Acumatica默认不暴露这两个字段),同时还有一个自定义屏幕专门存储客户及位置信息。
但在2019R1版本中出现了功能退化:无法使用客户或供应商类型的客户创建发货,仅允许选择公司类型的客户,而这个功能在2017R2版本中是完全正常的。触发的错误信息如下:
An error occurred during processing of the field Customer value C000000001 AR Error: Incorrect value specified. Specify a customer (for shipments of the Shipment type) or a company business account (for shipments of the Transfer type)
以下是让TR订单类型显示客户相关字段的自定义代码,测试环境为未发布任何自定义项的全新Acumatica销售数据实例:
protected void SOOrder_RowSelected(PXCache cache, PXRowSelectedEventArgs e, PXRowSelected InvokeBaseHandler) { if(InvokeBaseHandler != null) InvokeBaseHandler(cache, e); var row = (SOOrder)e.Row; if (row.OrderType == "TR") { PXUIFieldAttribute.SetVisible<SOOrder.customerID>(cache, (object)row, true); PXUIFieldAttribute.SetVisible<SOOrder.customerLocationID>(cache, (object)row, true); } }
1. 版本逻辑变更的根源
Acumatica 2019R1大概率对Transfer类型发货的客户验证逻辑做了收紧,强制要求必须使用**公司类型(Company Type)**的业务账户,而2017R2版本没有这个严格限制。这是导致功能失效的核心原因。
2. 自定义验证逻辑的扩展
要解决这个问题,需要修改或绕过原有的验证规则。可以尝试在SOOrderEntry或ShipmentEntry中扩展字段验证事件,针对TR订单类型放宽对客户类型的限制:
示例参考代码(需根据实际业务场景调整):
protected void SOOrder_CustomerID_FieldVerifying(PXCache cache, PXFieldVerifyingEventArgs e) { SOOrder row = e.Row as SOOrder; if (row?.OrderType == "TR") { // 获取选中的业务账户记录 BAccount bAccount = PXSelect<BAccount, Where<BAccount.bAccountID, Equal<Required<BAccount.bAccountID>>>>.Select(Base, e.NewValue); if (bAccount != null && (bAccount.Type == BAccountType.CustomerType || bAccount.Type == BAccountType.VendorType)) { // 跳过原有的公司类型强制验证 e.Cancel = true; } } }
⚠️ 注意:这个示例仅提供思路,实际使用时需要同步检查发货创建流程中的其他验证节点,避免后续环节出现关联错误。
3. 业务账户类型的兼容处理
如果允许的话,也可以考虑将目标客户的业务账户类型修改为公司类型,但这可能会影响其他业务流程,需要谨慎评估。
内容的提问来源于stack exchange,提问作者John

