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 прохода, первый для выбора сотрудника и нужной даты, а второй, чтобы подцепить остальные таблицы. Может где ошибка затаилась и глаз замылился? Заранее спасибо! |
|
|
|