【问题标题】:Unexpected Query behaviour意外的查询行为
【发布时间】:2015-11-25 14:40:02
【问题描述】:

我正在尝试执行以下代码:

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

注释掉的那 2 行可以正常工作。但是如果我取消注释它们,它将不再运行并且不会显示任何错误消息。

据我所见,ProjType 是一个枚举,我确信我已经在 SQL 中检查了 FixedPrice 值。

【问题讨论】:

  • 错误信息是什么?
  • @Matej 不幸的是,没有错误消息。
  • 这个查询对我有用 :) 没有错误。您是否有任何以0 开头的FixedPrice 项目ANDProjEmplTrans
  • @Matej 我可以注释掉关于 ProjId 的 addRange 并且只保留一个瞄准 Type 并且仍然没有结果。
  • @Matej,我遇到了一件奇怪的事情.. 输入“类型”字段时,智能感知根本没有帮助,就像 ProjTable 中不存在“类型”字段一样。

标签: axapta dynamics-ax-2012 x++ dynamics-ax-2012-r3


【解决方案1】:

这个技巧有助于理解查询生成的 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,可以复制/粘贴到查询编辑器。

【讨论】:

    猜你喜欢
    • 2011-07-30
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2017-01-24
    相关资源
    最近更新 更多