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