Показать сообщение отдельно
Старый 31.07.2018, 19:33   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Общее правило объединение критериев отбора в директиве Where при формировании Query

1. Критерии отбора по разным полям объединяются через "И"
2. Критерии отбора по одному и тому же полю объединяются через "ИЛИ"

Дополнительные "фичи" использования метода sysQuery::range(From, To)

- Если вторая граница не указана (указано "пустое" значение), то вместо диапазона будет сформировано соответственно ">=" или "<=" в зависимости от того, какая граница "пустая"

Поэтому в данном конкретном случае все достаточно просто

X++:
static void MVB_Test(Args _args)
{
    Query       query;
    QueryRun    queryRun;
    
    QueryBuildDataSource    qbdsEmplTable;
    QueryBuildDataSource    qbdsDirPartyTable;
    
    QueryBuildRange         qbr;

    // EmplTable.PayEmploymentDate_RU - дата приема
    // EmplTable.PayResignedDate_RU - дата увольнения
    
    EmplTable       emplTable;
    DirPartyTable   dirPartyTable;

    int       i;
    date      needDate = 03\01\2017;
    ;
    
    query = new query();
    
    //---------------- EmplTable
    qbdsEmplTable = query.addDataSource(tablenum(EmplTable));
    
    qbr = qbdsEmplTable.addRange(fieldnum(EmplTable, LaborRelation_UA));
    qbr.value(sysQuery::value(LaborRelation_UA::Employee));

    qbr = qbdsEmplTable.addRange(fieldnum(EmplTable, PayEmploymentDate_RU));
    qbr.value(sysQuery::range(dateNull(), needDate));

    // Несколько Range, созданные по одному и тому же полю, будут объеденинены по "ИЛИ"
    qbr = qbdsEmplTable.addRange(fieldnum(EmplTable, PayResignedDate_RU));
    qbr.value(sysQuery::value(dateNull()));

    qbr = qbdsEmplTable.addRange(fieldnum(EmplTable, PayResignedDate_RU ));
    qbr.value(sysQuery::range(needDate, datenull()));
    
    //------------------ DirPartyTable

    qbdsDirPartyTable = qbdsEmplTable.addDataSource(tablenum(DirPartyTable));
    // Используем настроенную связь "по умолчанию"
    qbdsDirPartyTable.relation(true);
    
    // Если настроенная таким образом связь не устраивает, то настривают связь вручную
    // Как правило, здесь нужна только addLink(). Остальные команды в данном случае - перестраховка
    /*
    qbdsDirPartyTable.relations        (false);
    qbdsDirPartyTable.joinMode         (JoinMode::InnerJoin);
    qbdsDirPartyTable.fetchMode        (QueryFetchMode::One2One);
    qbdsDirPartyTable.clearLinks       ();
    qbdsDirPartyTable.addLink(fieldnum(EmplTable, PartyId), fieldnum(DirPartyTable, PartyId))
    */

    // Смотрим псевдокод получившегося запроса
    info(qbdsEmplTable.toString());
    

    // Выполнение запроса
    queryRun = new QueryRun(query);
    while (queryRun.next())
    {
        emplTable       = queryRun.get(tablenum(EmplTable));
        dirPartyTable   = queryRun.get(tablenum(DirPartyTable));

        info(strfmt('%1 , %2 %3 %4',EmplTable.EmplId, DirPartyTable.Name, empltable.MainOrganizationId_UA,EmplTable.PayEmploymentDate_RU));

        i++;
        if (i>10)
        {
            break;
        }
    }
    
    info('end');
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 31.07.2018 в 19:39.
За это сообщение автора поблагодарили: S.Kuskov (5).