Как вызвать базовый метод делегата dataview - PullRequest
0 голосов
/ 11 октября 2018

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

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

Итакрезультат, который я хочу достичь:

    [PXOverride]
public virtual IEnumerable details()
{
   var records = Base.details();
   return records.Where(...);
}

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

Редактировать: моя проблема главным образом в том, что я не могу вызвать Base.details (), потому что делегат dataview подробностей объявлен как защищенный.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы были на правильном пути.Осталось только преобразовать коллекцию IEnumerable в список.Это необходимо сделать, потому что метод Linq Where не работает с коллекцией IEnumerable.

Вот пример вызова делегата «Способы оплаты клиента», базовая информация о делегировании и фильтрация результатов с использованием Linq:

using PX.Data;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace PX.Objects.AR
{
    public class CustomerPaymentMethodMaint_Extension : PXGraphExtension<CustomerPaymentMethodMaint>
    {
        public virtual IEnumerable details()
        {
            List<CustomerPaymentMethodDetail> records = Base.details().RowCast<CustomerPaymentMethodDetail>().ToList();

            return records.Where(record => record.Value == "Bob");
        }
    }
}

Результаты без дополнительного фильтра делегатов: enter image description here

Результаты с дополнительным фильтром делегатов: enter image description here

0 голосов
/ 11 октября 2018

Посмотрите на T200.У него есть пример.В вашем случае, в вашем делегате представления данных, вы должны определить новую инструкцию BQL, которая соответствует запросу вашего основного представления.Возможно, вам не следует включать какие-либо операторы where, поскольку вы добавите их чуть дальше.

PXSelectBase<YourDAC> query = new <PXSelectReadyOnly<YourDAC,Where<...>.select(yourParams)

Далее в своем делегате вы можете добавить дополнительные предложения where с помощью WhereAnd ... Итак, в вашем случае вы добавляетефильтр к объекту запроса, например

query.WhereAnd<Where<SomeDAC>

Наконец, убедитесь, что ваш делегат возвращает итератор.Поэтому вы можете позвонить

return query.Select()

. Этот запрос будет выполняться с добавленными вами пользовательскими фильтрами.Надеюсь, это поможет

...