如何调用数据视图委托的基本方法

时间:2018-10-10 22:14:36

标签: acumatica

我有一个带有要覆盖的数据视图委托的PXGraph,因此可以向网格上显示的数据添加一些自定义过滤器。

我知道如何重写和完全替换基本委托,但是我不知道如何首先执行数据视图的基本逻辑,然后将过滤器添加到结果中。

所以我要实现的结果是:

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

我尝试仅复制整个原始dataview委托,但是它调用了基础图的许多private成员,因此我也必须复制所有这些成员,这会导致代码中出现很多难看的重复。 / p>

编辑:我的问题主要是我不能调用Base.details(),因为详细信息数据视图委托被声明为受保护的。

2 个答案:

答案 0 :(得分:0)

看看T200。它有一个例子。对于您的情况,在数据视图委托中,您应该定义一个新的BQL语句,该语句与主视图的查询匹配。也许您不应该包含任何where语句,因为您将进一步添加它们。

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

在您的委托中,您还可以使用WhereAnd ...添加其他where子句,因此,在您的情况下,您可以向查询对象添加过滤器,例如

query.WhereAnd<Where<SomeDAC>

最后确保您的委托返回了迭代器。因此,您可以致电

return query.Select()

该查询将使用您添加的自定义过滤器执行。 希望这会有所帮助

答案 1 :(得分:0)

您在正确的轨道上。剩下的唯一事情就是将IEnumerable集合转换为List。您需要这样做,因为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