Dynamics AX:在代码中禁用表单中的数据源,同时能够使用高级过滤/排序选项

时间:2012-12-19 11:50:27

标签: dynamics-ax-2009 axapta ax

我修改了InventTable表单,以便用户可以根据默认订单设置设置表单中的“已停止”状态过滤项目。他们会根据两个复选框的值获得“可购买”商品,“可销售”商品,所有商品或待售商品或商品的列表。

我在代码中添加了InventItemSalesSetup和InventItemPurchSetup数据源,并在用户选中或取消选中复选框时启用或禁用它们。

除非禁用其中一个数据源,否则一切正常。然后“高级过滤/排序”选项停止工作。我收到错误:“数据源未启用”。

错误来自SysQueryForm表单的方法“saveCueEnabled”。当它打电话时:

if (!CueRun::canSaveQueryAsCue(this.args().caller()))
    return false;

哪个电话:

static boolean canSaveQueryAsCue(QueryRun qr)
{
    int numOfDataSources, i;
    QueryBuildDataSource ds;
    Query q;
    Common cursor;
    ;

    if (!qr)
    return false;

    q = qr.query();
    if (!q)
        return false;

    numOfDataSources = q.dataSourceCount();
    for(i = 1; i <= numOfDataSources; i++)
    {
        ds = q.dataSourceNo(i);
        if(ds.dynalinkCount() > 0)
            return false;

        // Check if it is temp
        cursor = qr.getNo(i);
        if (cursor.dataSource() && cursor.isTmp())
            return false;
    }

    return true;
}

当获取查询中的数据源数量时,“dataSourceCount”方法也会返回带有已禁用数据源的计数,当它获取循环中已禁用数据源的QueryBuildDataSource时,您将获得一个空DS和它在检查它是否是临时表时会崩溃。

我已经解决了在“saveCueEnabled”代码上添加额外if的问题,但我想知道是否有办法启用/禁用数据源而不会出现此错误。

我希望我能很好地解释自己,谢谢!

2 个答案:

答案 0 :(得分:4)

我能提出的唯一解决方案要求你修改canSaveQueryAsQue()。

对for循环的此更新很简单,可以解决您的问题。

for(i = 1; i <= numOfDataSources; i++)
{
    ds = q.dataSourceNo(i);
    if(ds && ds.dynalinkCount() > 0)
        return false;

    // Check if it is temp
    cursor = qr.getNo(i);
    if (cursor.dataSource() && cursor.isTmp())
        return false;
}

我没有测试过这段代码,但我在其他情况下使用了类似的代码。希望有所帮助!

答案 1 :(得分:0)

建议的编辑实际上不起作用,因为'ds'变量在测试时仍然是'truthy'。

以下似乎有效:

for(i = 1; i <= numOfDataSources; i++)
{
    ds = q.dataSourceNo(i);
    if(ds.enabled() && ds.dynalinkCount() > 0)
        return false;

    // Check if it is temp
    if(ds.enabled())
    {
        cursor = qr.getNo(i);
        if (cursor.dataSource() && cursor.isTmp())
            return false;
    }
}

将'.enabled()'属性添加到测试允许代码按要求跳过已禁用的数据源。