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

How to add a form range value when using a view as a datasource?

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

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

自定义表单:-

在新数据源的 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() 方法中,我设置了一个硬编码的范围值,以仅返回与特定业务部门相关的采购行。

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

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

在相同的表单上,当我在现有数据源上应用过滤器时,使用上述令人困惑的技术可以正常工作。

此外,我希望它能在外部连接的数据源上工作,并尝试使用 QueryFilters,但无论是使用相同的数据源方法还是没有运气。

您应该使用根数据源 (PurchLine) 的 executeQuery,因为 ABCPurchLineBusUnitView 是使用 InnerJoin 连接的,因此不会在那里调用 executeQuery

除此之外,还有一些观察:

  • 您可以使用 qbds = this.query().dataSourceTable(tableNum(ABCPurchLineBusUnitView)); 而不是 qbds = this.query().dataSourceNo(#DataSourceBusUnit);,我相信您已经知道 \Forms\PurchLineOpenOrder\Data Sources\PurchLine\Methods\init 中的标准代码有此语法的示例。

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

  • 您不应同时使用 qbds.relations(true);qbds.addLink(fieldNum(PurchLine, RecId), fieldNum(ABCPurchLineBusUnitView, RecId));。如果您需要使用 addLink.

  • ,请尝试将 qbds.relations(true); 替换为 qbds.relations(false);