使用视图作为数据源时如何添加表单范围值?

时间:2018-10-22 16:02:39

标签: axapta x++ dynamics-ax-2012

我希望能够在新表单数据源上创建自定义过滤器,这是我创建的自定义视图。

我已经创建了一个自定义视图ABCPurchLineBusUnitView(来自将PurchLine表连接到DefaultDimension视图的自定义查询)以追加到现有表单的数据源(PurchLineOpenOrder)。表单主网格中的DisplayValue列返回所有PurchLine的业务单位维度值。

自定义表格:-

在新数据源的init()方法中,我将视图与现有PurchLine数据源结合如下:

public void init()
{
    #DEFINE.DataSourceBusUnit(7)

    QueryBuildDataSource qbds;

    super();

    qbds = this.query().dataSourceNo(#DataSourceBusUnit);
    qbds.clearLinks();
    qbds.joinMode(JoinMode::InnerJoin);
    qbds.relations(true);
qbds.addLink(fieldNum(PurchLine,RecId),fieldNum(ABCPurchLineBusUnitView,RecId));

    qbrBusinessUnit = qbds.addRange(fieldNum(ABCPurchLineBusUnitView, DisplayValue));
}

在同一数据源的executeQuery()方法中,我设置了一个硬编码范围值,以仅带回与特定业务部门有关的PurchLine。

public void executeQuery()
{
    qbrBusinessUnit.value(queryValue('Business unit name here'));
    super();
}

显示的列工作正常。 但是,使用CTRL + G可以查看用户筛选器,很明显该筛选器值不存在并且尚未应用。

在同一表格上,当我在现有数据源上应用过滤器时,使用上述令人困惑的技术可以很好地工作。

此外,我希望此方法可以在外部连接的数据源上工作,并尝试使用QueryFilters,但使用相同的数据源方法也没有运气。

1 个答案:

答案 0 :(得分:3)

您应该使用根数据源(executeQuery)的PurchLine,因为ABCPurchLineBusUnitView是通过InnerJoin加入的,因此executeQuery不会在那里被调用。

除此之外,一些观察结果:

  • 您可以使用qbds = this.query().dataSourceNo(#DataSourceBusUnit);来代替qbds = this.query().dataSourceTable(tableNum(ABCPurchLineBusUnitView));,我确信您已经知道\Forms\PurchLineOpenOrder\Data Sources\PurchLine\Methods\init中的标准代码已经提供了这种语法的示例。

  • 如果数据源LinkType的属性ABCPurchLineBusUnitView已设置为InnerJoin,则不需要行qbds.joinMode(JoinMode::InnerJoin);,可以将其删除。

    li>
  • 您不应该同时使用qbds.relations(true);qbds.addLink(fieldNum(PurchLine, RecId), fieldNum(ABCPurchLineBusUnitView, RecId));。如果需要使用qbds.relations(true);,请尝试用qbds.relations(false);替换addLink