意外的查询行为
Unexpected Query behaviour
我正在尝试执行以下代码:
static void ProjTableQuery(Args _args)
{
Query query;
QueryBuildDataSource qbds1;
QueryBuildDataSource qbds2;
QueryBuildRange qbr1;
QueryBuildRange qbr2;
QueryRun queryRun;
ProjTable projTable;
query = new Query();
qbds1 = query.addDataSource(tableNum(ProjTable));
qbds1.addSortField(
fieldNum(ProjTable, Name),
SortOrder::Ascending);
//qbr1 = qbds1.addRange(fieldNum(ProjTable, Type));
//qbr1.value(queryValue(ProjType::FixedPrice));
qbr2 = qbds1.addRange(fieldNum(ProjTable, ProjId));
qbr2.value(queryValue('0') + '*');
qbds2 = qbds1.addDataSource(tableNum(ProjEmplTrans));
qbds2.relations(true);
qbds2.joinMode(JoinMode::InnerJoin);
queryRun = new QueryRun(query);
while (queryRun.next())
{
projTable = queryRun.get(tableNum(ProjTable));
info(strFmt("%1 %2 %3", projTable.ProjId, projTable.Name, projTable.Type));
}
}
将这两行注释掉后效果很好。但是如果我取消注释它们,它将不再 运行 并且不会显示任何错误消息。
据我所知,ProjType 是一个枚举,我确信我有 FixedPrice 值刚刚在 SQL.
中检查过
此 hack 有助于理解查询生成的 SQL:
query.literals(true);
info(query.datasourceNo(1).toString());
在 while
循环之前添加行(可能注释掉循环)。
输出将是一个几乎合法的 SQL 语句(尽管一些 X++ 仍然闪耀)。
X++ 的相应 hack 给出了准确的 SQL 语句:
ProjTable projTable;
select generateonly forceliterals from projTable
where ProjTable.Type == ProjType::FixedPrice;
info(projTable.getSQLStatement());
输出完全合法 SQL 并且可以 copy/pasted 到查询编辑器。
我正在尝试执行以下代码:
static void ProjTableQuery(Args _args)
{
Query query;
QueryBuildDataSource qbds1;
QueryBuildDataSource qbds2;
QueryBuildRange qbr1;
QueryBuildRange qbr2;
QueryRun queryRun;
ProjTable projTable;
query = new Query();
qbds1 = query.addDataSource(tableNum(ProjTable));
qbds1.addSortField(
fieldNum(ProjTable, Name),
SortOrder::Ascending);
//qbr1 = qbds1.addRange(fieldNum(ProjTable, Type));
//qbr1.value(queryValue(ProjType::FixedPrice));
qbr2 = qbds1.addRange(fieldNum(ProjTable, ProjId));
qbr2.value(queryValue('0') + '*');
qbds2 = qbds1.addDataSource(tableNum(ProjEmplTrans));
qbds2.relations(true);
qbds2.joinMode(JoinMode::InnerJoin);
queryRun = new QueryRun(query);
while (queryRun.next())
{
projTable = queryRun.get(tableNum(ProjTable));
info(strFmt("%1 %2 %3", projTable.ProjId, projTable.Name, projTable.Type));
}
}
将这两行注释掉后效果很好。但是如果我取消注释它们,它将不再 运行 并且不会显示任何错误消息。
据我所知,ProjType 是一个枚举,我确信我有 FixedPrice 值刚刚在 SQL.
中检查过此 hack 有助于理解查询生成的 SQL:
query.literals(true);
info(query.datasourceNo(1).toString());
在 while
循环之前添加行(可能注释掉循环)。
输出将是一个几乎合法的 SQL 语句(尽管一些 X++ 仍然闪耀)。
X++ 的相应 hack 给出了准确的 SQL 语句:
ProjTable projTable;
select generateonly forceliterals from projTable
where ProjTable.Type == ProjType::FixedPrice;
info(projTable.getSQLStatement());
输出完全合法 SQL 并且可以 copy/pasted 到查询编辑器。