Acumatica: Дубликаты фильтра селектора - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть таблица типов тарифов, в которой есть поле селектора, отображающее все типы тарифов.Я хотел отфильтровать идентификатор тарифа и тип утилиты, чтобы избежать дубликатов в сетке.

Проще говоря, в сетке должен быть только 1 тип тарифа для каждого типа, который будет отражен в сетке., Если я уже выбрал тип тарифа «Мощность», тогда все типы тарифов мощности не должны выбираться в поле селектора, если я не удалил текущий тип тарифа «Мощность» в сетке, тогда я снова смогу выбрать другой тип тарифа.

Я пытался использовать 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 Ответ

1 голос
/ 10 апреля 2019

Мне трудно понять точные требования, поэтому это общие рекомендации.

Дубликаты можно уменьшить, сгруппировав их в селекторе в параметре типа:

typeof(Search4<RERateTable.rateID,
       Aggregate<GroupBy<RERateTable.utilityType>>>)

Я предполагаю, что причина, по которой сетка селектора пуста, заключается в том, что вы фильтруете по нулевому значению. Обычным шаблоном является фильтрация значения, если оно не равно нулю, или отображение всего, если оно равно нулю:

typeof(Search<RERateTable.rateID,
       Where<RERateTable.rateID, Equal<Current<REPropertyRateDetail.rateID>>,
       Or<Current<REPropertyRateDetail.rateID>, IsNull>>>)

Для вашего сценария атрибут ограничителя кажется ненужным, потому что вы можете поместить условие в параметр типа селектора (первый параметр). Если логику трудно выразить в виде запроса SQL (может быть некоторая арифметическая и групповая логика), тогда можно использовать пользовательский селектор . С помощью специального селектора вы можете выбирать, манипулировать и возвращать записи любым удобным для вас способом с помощью метода GetRecords, он работает как делегат просмотра данных.

...