2015-11-25 51 views
1

我想执行以下代码:意外的查询行为

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是一个枚举,我确信我有FixedPrice值只是在SQL中检查。

+0

什么是错误信息? – Matej

+0

@Matej不幸的是,没有错误信息。 –

+0

此查询适用于我:)没有错误。你有没有''FixedPrice'项目以'0'开头** AND **有'ProjEmplTrans'? – Matej

回答

7

这个技巧是了解查询生成的SQL有用:

query.literals(true); 
info(query.datasourceNo(1).toString()); 

while循环之前添加行(也许注释的环出)。
输出将是一个几乎合法的SQL语句(尽管如此,一些X ++依然闪耀)。

相应的破解为X ++会给出确切的SQL语句:

ProjTable projTable; 
select generateonly forceliterals from projTable 
    where ProjTable.Type == ProjType::FixedPrice; 
info(projTable.getSQLStatement()); 

输出是完全合法的SQL和可复制/粘贴到查询编辑器。

+0

另请参阅http://stackoverflow.com/q/29815005/4509 –