使用视图作为数据源时如何添加表单范围值?
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);
我希望能够在新表单数据源上创建自定义过滤器,这是我创建的自定义视图。
我创建了一个自定义视图 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);