我希望能够在新表单数据源上创建自定义过滤器,这是我创建的自定义视图。
我已经创建了一个自定义视图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,但使用相同的数据源方法也没有运气。
答案 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);
,可以将其删除。
您不应该同时使用qbds.relations(true);
和qbds.addLink(fieldNum(PurchLine, RecId), fieldNum(ABCPurchLineBusUnitView, RecId));
。如果需要使用qbds.relations(true);
,请尝试用qbds.relations(false);
替换addLink
。