在 Axapta/Dynamics Axe 中的链接表上过滤

发布于 2024-07-09 13:45:17 字数 202 浏览 7 评论 0原文

我在 Axapta/Dynamics Ax (EmplTable) 中有一个表单,它有两个数据源(EmplTable 和 HRMVirtualNetworkTable),其中第二个数据源 (HRMVirtualNetworkTable) 使用“延迟”链接类型链接到第一个数据源。

有没有办法根据第二个数据源对记录设置过滤器,而不必将链接类型更改为“InnerJoin”?

I have a form in Axapta/Dynamics Ax (EmplTable) which has two data sources (EmplTable and HRMVirtualNetworkTable) where the second data source (HRMVirtualNetworkTable) is linked to the first on with "Delayed" link type.

Is there a way to set an filter on the records, based on the second data source, without having to change the link type to "InnerJoin"?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冰雪梦之恋 2024-07-16 13:45:17

您可以使用“外部联接”而不是“延迟”,然后在 HRMVirtualNetworkTable 上搜索字段时以编程方式更改联接模式。

将此方法添加到 SysQuery 类中:

static void updateJoinMode(QueryBuildDataSource qds)
{
    Counter r;
    if (qds)
    {
        qds.joinMode(JoinMode::OuterJoin);
        for (r = 1; r <= qds.rangeCount(); r++)
        {
            if (qds.range(r).value() && qds.range(r).status() == RangeStatus::Open)
            {
                qds.joinMode(JoinMode::InnerJoin);
                break;
            }
        }
    }
}

在 EmplTable 数据源上的 executeQuery() 中:

public void executeQuery()
{;
    SysQuery::updateJoinMode(this.queryRun() ? this.queryRun().query().dataSourceTable(tableNum(HRMVirtualNetworkTable)) : this.query().dataSourceTable(tableNum(HRMVirtualNetworkTable)));    
    super();
}

有时 this.queryRun() 返回 null,因此请使用 this.query() 代替。

更新:

请注意,上述内容与 AX 2012 及更高版本无关,您可以在外连接中使用查询过滤器。 请参阅如何将 QueryFilter 类与外部联接结合使用

You could use "Outer join" instead of "Delayed" then change the join mode programmaticly when there is search for fields on HRMVirtualNetworkTable.

Add this method to class SysQuery:

static void updateJoinMode(QueryBuildDataSource qds)
{
    Counter r;
    if (qds)
    {
        qds.joinMode(JoinMode::OuterJoin);
        for (r = 1; r <= qds.rangeCount(); r++)
        {
            if (qds.range(r).value() && qds.range(r).status() == RangeStatus::Open)
            {
                qds.joinMode(JoinMode::InnerJoin);
                break;
            }
        }
    }
}

In the executeQuery() on the EmplTable datasource:

public void executeQuery()
{;
    SysQuery::updateJoinMode(this.queryRun() ? this.queryRun().query().dataSourceTable(tableNum(HRMVirtualNetworkTable)) : this.query().dataSourceTable(tableNum(HRMVirtualNetworkTable)));    
    super();
}

Sometimes this.queryRun() return null so use this.query() instead.

Update:

Note that the above is not relevant for AX 2012 and later, where you can use query filters in outer joins. See How to Use the QueryFilter Class with Outer Joins.

情绪少女 2024-07-16 13:45:17

您可以通过加入 QueryBuildDataSource 或扩展过滤器(Alt+F3,右键单击数据源,1:n 并找到 sev\condary DS)以编程方式完成此操作

You can do it programmaticaly by joining QueryBuildDataSource or by extended filter (Alt+F3, Right click on datasorce, 1:n and find sev\condary DS)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文