Показать сообщение отдельно
Старый 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 прохода, первый для выбора сотрудника и нужной даты, а второй, чтобы подцепить остальные таблицы.

Может где ошибка затаилась и глаз замылился? Заранее спасибо!