AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.10.2015, 14:30   #1  
Art_Tanis is offline
Art_Tanis
Участник
 
225 / 36 (2) +++
Регистрация: 04.02.2014
Помощь с запросов
Добрый день!
Пытаюсь доработать запрос - добавить в него дополнительное условие - к сожалению никак не получается.
Логика следующая мне необходимо выдернуть все фактуры у которых 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  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Попробуйте вот так:

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  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 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  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
Начиная с 2009 версии в метод addLink добавлен параметр parentDatasourceName, где можно указать название ds, для которого добавляется join. Т.е. добавлять datasource можно "по цепочке", но в фактическом запросе таблица будет связана с той, которая указана в параметре. В более старых версиях такой трюк можно сделать с помощью расширенного условия в addRange, не добавляя никаких addLink или relation(true), а просто прописав, например addRange(fieldnum(LedgerTrans, RecId)).value("(FactureJour_RU_1.Voucher == LedgerTrans_1.Voucher)").
Решение можно использовать, когда нельзя перестроить запрос, поменяв местами таблицы.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DAX 2009 - Трассировка долгих SQL-запросов в пакетном режиме N.D.P. DAX: Администрирование 4 18.03.2015 09:13
Просмотрщик запросов QueryBrowser DAX 3.0 SP4 Russland DAX: База знаний и проекты 30 11.03.2011 11:00
Трассировка запросов Ax 4.0 sp2 AlexeyBP DAX: Администрирование 1 18.09.2007 15:48
Мониторинг запросов SQL exceptor DAX: Программирование 11 21.02.2006 09:16
расчеты с персоналом. мат. помощь shumelka DAX: Функционал 1 13.04.2004 11:29

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:14.