基于PXCustomSelectorAttribute实现销售订单客户选择器动态过滤
修正步骤
- 首先打开你注释的特性传参代码,将当前订单类型的BQL表达式传入自定义特性
- 在
GetRecords方法中从当前图的SOOrder缓存获取当前行的订单类型值,不要用硬编码的变量接收 - 优化查询逻辑,避免全量拉取客户数据后再过滤,提升选择器加载速度
完整修改后代码
namespace PX.Objects.SO { [PXNonInstantiatedExtension] public class SO_SOOrder_ExistingColumn : PXCacheExtension<PX.Objects.SO.SOOrder> { #region CustomerID [PXMergeAttributes(Method = MergeMethod.Append)] // 传入当前上下文的订单类型Bql参数 [CustomercustomersAttribute(typeof(Current<SOOrder.orderType>))] public int? CustomerID { get; set; } #endregion } public class CustomercustomersAttribute : PXCustomSelectorAttribute { public Type OrderTypeField { get; set; } public CustomercustomersAttribute(Type orderTypeField) : base(typeof(Customer.acctCD)) { OrderTypeField = orderTypeField; this.DescriptionField = typeof(Customer.acctName); } public CustomercustomersAttribute() : base(typeof(Customer.acctCD)) { this.DescriptionField = typeof(Customer.acctName); } protected virtual IEnumerable GetRecords() { // 从当前图获取SOOrder缓存的当前行 SOOrder currentOrder = _Graph.Caches<SOOrder>()?.Current as SOOrder; string currentOrderType = currentOrder?.OrderType; // 按需构造查询,避免全量拉取数据提升性能 PXResultset<Customer> customerSet; if (currentOrderType == "QT") { // 报价单类型不过滤信用冻结客户 customerSet = PXSelect<Customer>.Select(_Graph); } else { // 其他订单类型仅返回活跃客户 customerSet = PXSelect<Customer, Where<Customer.status, Equal<CustomerStatus.active>>>.Select(_Graph); } foreach (Customer pc in customerSet) { yield return pc; } } } }
说明
你原来的代码中定义的orderType、orderType2变量没有实际从上下文取值,所以无法判断当前订单类型。通过从_Graph中获取SOOrder缓存的当前行,就能拿到实时的订单类型值,再根据这个值调整查询逻辑即可。
如果是新增订单还没保存的场景,Current也能拿到界面上已经填入的订单类型值,不需要依赖数据已持久化。
内容的提问来源于stack exchange,提问作者JvD
相关产品推荐
相关产品推荐

