我修改了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的问题,但我想知道是否有办法启用/禁用数据源而不会出现此错误。
我希望我能很好地解释自己,谢谢!
答案 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()'属性添加到测试允许代码按要求跳过已禁用的数据源。