Acumatica: селектор фильтров дубликатов

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

Проще говоря, в сетке должен быть отражен только 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 { }

Проблема, с которой я столкнулся при таком подходе, заключается в том, что в поле селектора больше не отображаются записи.

Я использую другой метод использования метода Не существует

    [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, в моем поле селектора не отображаются записи.

Надеюсь на ваши ответы/предложения. Большое спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
245
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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, он работает как делегат представления данных.

Другие вопросы по теме

Похожие вопросы