我有一个费率类型网格,其中有一个显示所有费率类型的选择器字段。我想做的是过滤费率ID和实用程序类型,以避免在网格中重复。
简单地说,每种类型的费率类型都只能在网格中反映出来,如果我已经选择了“功率”费率类型,则不应在选择器字段中选择所有功率费率类型,除非我在网格中删除了当前的“功率”费率类型,然后可以再次选择另一种费率类型。
我尝试使用PXRestrictor解决我的问题
[PXDBInt]
[PXDefault()]
[PXUIField(DisplayName = "Rate ID")]
[PXSelector(typeof(Search<RERateTable.rateID>),
typeof(RERateTable.rateID),
typeof(RERateTable.refNbr),
typeof(RERateTable.rateName),
typeof(RERateTable.utilityType),
SubstituteKey = typeof(RERateTable.refNbr),
DescriptionField = typeof(RERateTable.rateName))]
[PXRestrictor(typeof(Where<RERateTable.utilityType,
NotIn2<Search<RERateTable.utilityType,
Where<RERateTable.rateID,
Equal<Current<REPropertyRateDetail.rateID>>>>>>), REMessages.UtilityTypeDuplicateException)]
public virtual int? RateID { get; set; }
public abstract class rateID : IBqlField { }
我用这种方法遇到的问题是,选择器字段中不再呈现任何记录。
我承担使用 NotExists 方法的另一种方法
[PXDBInt]
[PXDefault()]
[PXUIField(DisplayName = "Rate ID")]
[PXSelector(typeof(Search<RERateTable.rateID,
Where<NotExists<Select<REPropertyRateDetail,
Where<REPropertyRateDetail.rateID,
Equal<Current<REPropertyRateDetail.rateID>>>>>>>),
typeof(RERateTable.rateID),
typeof(RERateTable.refNbr),
typeof(RERateTable.rateName),
typeof(RERateTable.utilityType),
SubstituteKey = typeof(RERateTable.refNbr),
DescriptionField = typeof(RERateTable.rateName))]
public virtual int? RateID { get; set; }
public abstract class rateID : IBqlField { }
在这种方法中,我在使用PXRestrictor方法时也遇到了同样的问题,选择器字段上没有呈现记录。
希望得到您的答案/建议。非常感谢。
答案 0 :(得分:1)
我很难理解确切的要求,所以这是一般准则。
可以通过在类型参数的选择器中对重复项进行分组来减少重复项:
typeof(Search4<RERateTable.rateID,
Aggregate<GroupBy<RERateTable.utilityType>>>)
我猜测选择器网格为空的原因是您要针对空值进行过滤。一种常见的模式是,如果值不为null,则根据该值进行过滤;如果值为null,则显示所有内容:
typeof(Search<RERateTable.rateID,
Where<RERateTable.rateID, Equal<Current<REPropertyRateDetail.rateID>>,
Or<Current<REPropertyRateDetail.rateID>, IsNull>>>)
对于您的方案,限制器属性似乎是不必要的,因为您可以将条件放入选择器类型参数(第一个参数)中。如果逻辑难以表达为SQL查询(可以是某些算术和分组逻辑),则可以使用custom selector。使用自定义选择器,您可以使用GetRecords
方法以任何所需的方式选择,操作和返回记录,它的工作方式类似于dataview委托。