Общее правило объединение критериев отбора в директиве 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');
}