27.07.2018, 08:15 | #1 |
Участник
|
Проблема с Query
Здравствуйте, можете привести нормальный пример с Query через этот job
X++: static void Job674(Args _args) { // EmplTable.PayEmploymentDate_RU - дата приема // EmplTable.PayResignedDate_RU - дата увольнения EmplTable emplTable; DirPartyTable dirPartyTable; int i; date needDate = 03\01\2017; ; while select EmplId, MainOrganizationId_UA, PayEmploymentDate_RU from emplTable where EmplTable.LaborRelation_UA == LaborRelation_UA::Employee && ( (EmplTable.PayEmploymentDate_RU <= needDate) && (EmplTable.PayResignedDate_RU == datenull()|| EmplTable.PayResignedDate_RU >= needDate) ) join Name from dirPartyTable where dirPartyTable.PartyId == EmplTable.PartyId { info(strfmt('%1 , %2 %3 %4',EmplTable.EmplId, DirPartyTable.Name, empltable.MainOrganizationId_UA,EmplTable.PayEmploymentDate_RU)); i++; if(i>10) { break; } } } |
|
27.07.2018, 08:57 | #2 |
Участник
|
|
|
31.07.2018, 19:33 | #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). |