Acumatica:选择器过滤器重复项

时间:2019-04-10 02:52:56

标签: acumatica

我有一个费率类型网格,其中有一个显示所有费率类型的选择器字段。我想做的是过滤费率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方法时也遇到了同样的问题,选择器字段上没有呈现记录。

希望得到您的答案/建议。非常感谢。

1 个答案:

答案 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委托。

相关问题