У меня есть сетка типов ставок, в которой есть поле выбора, отображающее все типы ставок. То, что я хотел сделать, это отфильтровать идентификатор тарифа и тип полезности, чтобы избежать дублирования в сетке.
Проще говоря, в сетке должен быть отражен только 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, в моем поле селектора не отображаются записи.
Надеюсь на ваши ответы/предложения. Большое спасибо.
Мне трудно понять точные требования, поэтому это общие рекомендации.
Дубликаты можно уменьшить, сгруппировав их в селекторе в параметре типа:
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
, он работает как делегат представления данных.