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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.10.2014, 16:42   #1  
Kashesh is offline
Kashesh
Участник
 
29 / 10 (1) +
Регистрация: 08.12.2004
Адрес: Саров
выборка истории на дату или как перевести select в query. ax4
Всем доброго времени суток.

Пытаюсь адаптировать select запрос на query, но никак не выходит.
Задача состоит, чтобы для каждого сотрудника выбрать одну запись из истории, удовлетворяющую условиям дат. (параметры сотрудник и дата), но при этом должен быть доступ ко всем полям таблиц.

В select это выглядит так:

X++:
while SELECT FORUPDATE * FROM EmplTable
        ORDER BY Name ASC
    WHERE EmplTable.EmplId == emplId
    JOIN * FROM table
        WHERE   0 == HRMVirtualNetworkTable.referenceType &&
                EmplTable.EmplId == HRMVirtualNetworkTable.reference
    JOIN * FROM HRMVirtualNetworkHistory1
        ORDER BY startDate DESC
    WHERE HRMVirtualNetworkTable.hrmVirtualNetworkId == HRMVirtualNetworkHistory1.hrmVirtualNetworkId
          && HRMVirtualNetworkHistory1.startDate <= onDate
    JOIN * FROM position
        WHERE HRMVirtualNetworkHistory1.hrmPositionId == position.hrmPositionId
              && 1 == position.active
    NOTEXISTS JOIN * FROM HRMVirtualNetworkHistory2
        WHERE HRMVirtualNetworkHistory1.startDate < HRMVirtualNetworkHistory2.startDate &&
              HRMVirtualNetworkHistory1.hrmVirtualNetworkId == HRMVirtualNetworkHistory2.hrmVirtualNetworkId &&
              HRMVirtualNetworkHistory2.startDate <= onDate
Пытаюсь сделать что-то похожее на query.
X++:
q = new query();

    qbdsEmpl = q.addDataSource(tableNum(EmplTable));
    if(emplId)
        qbdsEmpl.addRange( fieldnum(EmplTable, EmplId)).value(emplId);

    qbdsNetworkTable = qbdsEmpl.addDataSource(tableNum(HRMVirtualNetworkTable));
    qbdsNetworkTable.relations(true);
    qbdsNetworkTable.fetchMode(queryFetchMode::One2One);
    
    qbdsNetworkHistory = qbdsNetworkTable.addDataSource(tableNum(HRMVirtualNetworkHistory));
    qbdsNetworkHistory.relations(true);
    qbdsNetworkHistory.fetchMode(queryFetchMode::One2One);
    qbdsNetworkHistory.addSortField(fieldNum(HRMVirtualNetworkHistory, startDate), sortOrder::Descending);
    qbdsNetworkHistory.orderMode(orderMode::OrderBy);
    qbdsNetworkHistory.addRange(fieldNum(HRMVirtualNetworkHistory, startDate)).value(queryRange(dateNull(), onDate));
    
    qbdsPosition = qbdsNetworkHistory.addDataSource(tableNum(HRMPosition));
    qbdsPosition.relations(true);
    qbdsPosition.fetchMode(queryFetchMode::One2One);
    
    qbdsNetworkHistory2 = qbdsNetworkHistory.addDataSource(tableNum(HRMVirtualNetworkHistory));
    qbdsNetworkHistory2.addLink(fieldNum(HRMVirtualNetworkHistory, hrmVirtualNetworkId), fieldNum(HRMVirtualNetworkHistory, hrmVirtualNetworkId));
    qbdsNetworkHistory2.joinMode(joinMode::NoExistsJoin);
    qbdsNetworkHistory2.fetchMode(queryFetchMode::One2One);
    qbdsNetworkHistory2.addRange(fieldNum(HRMVirtualNetworkHistory, recId)).value(strfmt('(%1.%2 < %3.%2) && (%3.%2 <= %4)',
                                                                              qbdsNetworkHistory.name(), // %1
                                                                              fieldStr(HRMVirtualNetworkHistory, startDate), // %2
                                                                              qbdsNetworkHistory2.name(), // %3
                                                                              queryValue(onDate))); // %4));
И вроде как работает, но не работает последний NotExists JOIN с таблицей на саму себя) чтобы выбрать только одну запись а не все из истории.
И как я не пытаюсь это исправить, никак не выходит. (((
Еще пробовал делать через View с группировкой по сотруднику и дате. работает, но медленно из-за того, что приходилось делать 2 прохода, первый для выбора сотрудника и нужной даты, а второй, чтобы подцепить остальные таблицы.

Может где ошибка затаилась и глаз замылился? Заранее спасибо!
Старый 29.10.2014, 18:02   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
queryValue(onDate))); // %4));
Почему не работает запрос?
За это сообщение автора поблагодарили: Kashesh (1).
Старый 29.10.2014, 18:17   #3  
Kashesh is offline
Kashesh
Участник
 
29 / 10 (1) +
Регистрация: 08.12.2004
Адрес: Саров
Заработало! Спасибо огромное! Самое главное я и грешил на эту дату, пробовал в разных вариантах ее передавать в сложный запрос, но до этого не дошел. Спасибо еще раз!
Старый 29.10.2014, 19:13   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Kashesh Посмотреть сообщение
Пытаюсь сделать что-то похожее на query.
Вы бы не создавали запрос с нуля в коде.
гораздо эффективнее создать Query в AOT,
а в коде написать что-то вроде
X++:
Query q = new Query(querystr(mySuperQueryInAOT));

...findOrCreateRange....
Старый 30.10.2014, 20:10   #5  
Kashesh is offline
Kashesh
Участник
 
29 / 10 (1) +
Регистрация: 08.12.2004
Адрес: Саров
Цитата:
Сообщение от mazzy Посмотреть сообщение
гораздо эффективнее создать Query в AOT,
Да, сначала так и хотел сделать, но потом подумал, что последний join будет проблематично в нем создать. Спасибо, попробую.
Старый 31.10.2014, 07:43   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Kashesh Посмотреть сообщение
Да, сначала так и хотел сделать, но потом подумал, что последний join будет проблематично в нем создать. Спасибо, попробую.
Условие
X++:
HRMVirtualNetworkHistory1.startDate < HRMVirtualNetworkHistory2.startDate
технически конечно можно реализовать и в AOT\Query, но только через тот же самый Expressions in query ranges, к тому же там его придется задавать в виде статической строки. В общем, некрасиво получится.
Старый 31.10.2014, 08:08   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
к тому же там его придется задавать в виде статической строки.
Поправлю сам себя. Сначала ответил, а потом вспомнил, что у AOT\Query есть возможность перекрывать методы. Например, в методе init можно программно донавесить на Query все те вещи, которые через дизайнер задавать не удобно. Так будет покрасивее.

Пример из стандарта AX2009:
X++:
static void JobTEST_AOTQuery_InitMethodWork(Args _args)
{
    Query q = new Query(querystr(ReqItemJournalCreate));
    QueryRun qr;
    ;
    
    info(q.dataSourceNo(1).toString());
    qr = new QueryRun(q);
    info(qr.query().dataSourceNo(1).toString());
}
P.S.: Хм интересно, а что будет если на основе такого Query создать View? Он будет перестраиваться при синхронизации?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Microsoft Dynamics AX general performance analysis scripts page 5 Blog bot DAX Blogs 0 01.09.2014 14:11
dynamicscare: Using Power BI to Analyze Your Dynamics AX Data Blog bot DAX Blogs 1 06.10.2013 18:11
dynamicsaxtraining: How to use select statements instead of query in data source Blog bot DAX Blogs 0 06.12.2010 23:11
Запрос на форме как Select или готовая выборка в форму? rohlenko DAX: Программирование 9 23.06.2005 13:38

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

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

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