2015-11-25 6 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 –