Acumatica自定义:如何在SO Line中添加关联的PO Nbr列
Acumatica SO Line添加关联PO Nbr字段实现方案
以下是基于Acumatica框架的最优实现方案,无需冗余逻辑,适配绝大多数业务场景:
1. DAC扩展字段配置
你已经创建的SOLine自定义Usr字段直接使用PXDBScalar属性即可自动关联SOLineSplit取数,该方案原生支持页面的排序、过滤操作,性能最优。
完整DAC扩展代码示例:
using PX.Data; using PX.Objects.PO; using PX.Objects.SO; public class SOLineExt : PXCacheExtension<SOLine> { #region UsrPONbr // 若不需要持久化存储到SOLine表,将PXDBString改为PXString即可 [PXDBString(15, IsUnicode = true)] [PXUIField(DisplayName = "关联PO单号")] [PXDBScalar(typeof(Search2<SOLineSplit.pONbr, InnerJoin<POOrder, On<POOrder.orderType, Equal<SOLineSplit.pOType>, And<POOrder.orderNbr, Equal<SOLineSplit.pONbr>>>>, Where<SOLineSplit.orderType, Equal<SOLine.orderType>, And<SOLineSplit.orderNbr, Equal<SOLine.orderNbr>, And<SOLineSplit.lineNbr, Equal<SOLine.lineNbr>, // 可自行追加过滤条件,比如排除已作废的PO And<POOrder.status, NotEqual<POOrderStatus.cancelled>>>>>))] public virtual string UsrPONbr { get; set; } public abstract class usrPONbr : PX.Data.BQL.BqlString.Field<usrPONbr> { } #endregion }
2. 页面配置步骤
- 打开SO订单页面(SO301000)的自定义编辑器
- 找到Transactions网格的字段集合,添加自定义字段
UsrPONbr到显示列 - 发布自定义即可生效,无需额外编写图扩展事件逻辑
多PO关联场景适配
如果业务中一行SO Line对应多个PO分配,需要合并展示所有关联PO号,可以通过图扩展的RowSelecting事件实现:
using PX.Data; using PX.Objects.SO; using System.Linq; public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry> { protected void SOLine_RowSelecting(PXCache cache, PXRowSelectingEventArgs e) { if (e.Row is not SOLine row) return; var relatedPoNbrs = PXSelect<SOLineSplit, Where<SOLineSplit.orderType, Equal<Required<SOLine.orderType>>, And<SOLineSplit.orderNbr, Equal<Required<SOLine.orderNbr>>, And<SOLineSplit.lineNbr, Equal<Required<SOLine.lineNbr>>, And<SOLineSplit.pONbr, IsNotNull>>>> .Select(Base, row.OrderType, row.OrderNbr, row.LineNbr) .RowCast<SOLineSplit>() .Select(s => s.PONbr) .Distinct(); cache.SetValue<SOLineExt.usrPONbr>(row, string.Join(",", relatedPoNbrs)); } }
内容的提问来源于stack exchange,提问作者Rray575
相关产品推荐
相关产品推荐

