6

我已经修改了 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 的问题,但我想知道是否有一种方法可以启用/禁用数据源而不会出现此错误。

我希望我已经很好地解释了自己,谢谢!

4

2 回答 2

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;
}

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

于 2013-01-25T20:29:39.343 回答
0

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

以下似乎有效:

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()”属性添加到测试允许代码根据请求跳过禁用的数据源。

于 2013-04-18T16:49:18.080 回答