29.10.2014, 16:42 | #1 |
Участник
|
выборка истории на дату или как перевести 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 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)); И как я не пытаюсь это исправить, никак не выходит. ((( Еще пробовал делать через View с группировкой по сотруднику и дате. работает, но медленно из-за того, что приходилось делать 2 прохода, первый для выбора сотрудника и нужной даты, а второй, чтобы подцепить остальные таблицы. Может где ошибка затаилась и глаз замылился? Заранее спасибо! |
|
29.10.2014, 18:02 | #2 |
NavAx
|
Цитата:
queryValue(onDate))); // %4));
|
|
|
За это сообщение автора поблагодарили: Kashesh (1). |
29.10.2014, 18:17 | #3 |
Участник
|
Заработало! Спасибо огромное! Самое главное я и грешил на эту дату, пробовал в разных вариантах ее передавать в сложный запрос, но до этого не дошел. Спасибо еще раз!
|
|
29.10.2014, 19:13 | #4 |
Участник
|
|
|
30.10.2014, 20:10 | #5 |
Участник
|
|
|
31.10.2014, 07:43 | #6 |
Участник
|
Цитата:
X++: HRMVirtualNetworkHistory1.startDate < HRMVirtualNetworkHistory2.startDate |
|
31.10.2014, 08:08 | #7 |
Участник
|
Поправлю сам себя. Сначала ответил, а потом вспомнил, что у 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()); } |
|
|
|