13.10.2015, 14:30 | #1 |
Участник
|
Помощь с запросов
Добрый день!
Пытаюсь доработать запрос - добавить в него дополнительное условие - к сожалению никак не получается. Логика следующая мне необходимо выдернуть все фактуры у которых Voucher в LedgerTrans лежить в пределаж периода и соеденить их как NotExistJoin c таблицей PurchBookVATProcessLogTrans_RU Код: X++: qbds = query.addDataSource(tableNum(FactureJour_RU)); qbds.addRange(fieldNum(FactureJour_RU, Module)).value(queryValue(FactureModule_RU::Vend)); //qbds.addRange(fieldNum(FactureJour_RU, FactureDate)).value(strfmt('((%1 >= %2) && (%1 <= %3))', fieldstr(FactureJour_RU, FactureDate),date2StrXpp(startDate), date2StrXpp(endDate))); qbds = query.dataSourceTable(tableNum(FactureJour_RU)).addDataSource(tableNum(LedgerTrans)); qbds.relations(false); qbds.addLink(fieldNum(FactureJour_RU, Voucher), fieldNum(LedgerTrans, Voucher)); qbds.joinMode(JoinMode::InnerJoin); qbds.addRange(fieldNum(LedgerTrans, TransDate)).value(strfmt('((%1 >= %2) && (%1 <= %3))', fieldstr(LedgerTrans, TransDate),date2StrXpp(startDate), date2StrXpp(endDate))); qbds = query.dataSourceTable(tableNum(FactureJour_RU)).addDataSource(tableNum(PurchBookVATProcessLogTrans_RU)); qbds.relations(true); qbds.joinMode(JoinMode::NoExistsJoin); |
|
13.10.2015, 14:55 | #2 |
Участник
|
Попробуйте вот так:
X++: qbds = query.addDataSource(tableNum(FactureJour_RU)); qbds.addRange(fieldNum(FactureJour_RU, Module)).value(queryValue(FactureModule_RU::Vend)); qbds = query.dataSourceTable(tableNum(FactureJour_RU)).addDataSource(tableNum(LedgerTrans)); qbds.relations(false); qbds.addLink(fieldNum(FactureJour_RU, Voucher), fieldNum(LedgerTrans, Voucher)); qbds.joinMode(JoinMode::InnerJoin); qbds.addRange(fieldNum(LedgerTrans, TransDate)).value(strfmt('((%1 >= %2) && (%1 <= %3))', fieldstr(LedgerTrans, TransDate),date2StrXpp(startDate), date2StrXpp(endDate))); qbds.fetchMode(QueryFetchMode::One2One); qbds = query.dataSourceTable(tableNum(FactureJour_RU)).addDataSource(tableNum(PurchBookVATProcessLogTrans_RU)); qbds.relations(true); qbds.joinMode(JoinMode::NoExistsJoin); qbds.fetchMode(QueryFetchMode::One2One); |
|
13.10.2015, 15:15 | #3 |
Участник
|
На всякий случай замечу, что простые условия лучше формировать через методы класса SysQuery. В данном случае диапазон дат лучше задать через sysQuery::range()
X++: qbds.addRange(fieldNum(LedgerTrans, TransDate)).value(sysQuery::range(startDate, endDate)) По поводу собственно вопроса, Axapta крайне отрицательно относится к запросам, у которых таблицы-источник не вытянуты в одну "цепочку". Т.е. как только появляются две таблицы присоединенные к одной таблице-"родителю", так вероятность проблем резко повышается. Как показал Cardagant, в большинстве случаев проблему можно решить явным образом указав для каждого DataSource настройку X++: qbds.fetchMode(QueryFetchMode::One2One); Однако, по возможности, лучше избегать запросов с несколькими таблицами, связанными с одной таблицей-родителем. Например, в данном случае можно перестроить запрос, поставив в качестве "Головной" таблицы LedgerTrans. Т.е. "вытянув" запрос в одну цепочку LedgerTrans - join - FactureJour_RU - notexists - PurchBookVATProcessLogTrans_RU
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
13.10.2015, 17:32 | #4 |
Участник
|
Начиная с 2009 версии в метод addLink добавлен параметр parentDatasourceName, где можно указать название ds, для которого добавляется join. Т.е. добавлять datasource можно "по цепочке", но в фактическом запросе таблица будет связана с той, которая указана в параметре. В более старых версиях такой трюк можно сделать с помощью расширенного условия в addRange, не добавляя никаких addLink или relation(true), а просто прописав, например addRange(fieldnum(LedgerTrans, RecId)).value("(FactureJour_RU_1.Voucher == LedgerTrans_1.Voucher)").
Решение можно использовать, когда нельзя перестроить запрос, поменяв местами таблицы. |
|