21.03.2007, 11:07 | #1 |
Участник
|
Как собрать запрос?
Мне нужно реализовать в аксапте вот такой запрос:
Код: SELECT * FROM OutlookTaskTable A INNER JOIN EmplTable B ON A.User = B.EmplId WHERE A.USER = 'ANV' OR B.HRMORGANIZATIONID = 'IS' Подробнее: Есть два запроса такой: X++: StrRange = '(((OutlookTaskTable.Ot = "%1") || (OutlookTaskTable.User = "%2")))'; rq = OutlookTaskTable_q.dataSourceTable(TableNum(OutlookTaskTable)).addRange(FieldNum(OutlookTaskTable, RecId)); rq.value(strfmt(StrRange, CurUserId(), CurUserId())); X++: ds = OutlookTaskTable_q.dataSourceTable(TableNum(OutlookTaskTable)); ds2 = OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable)); if (!ds2) { ds2 = ds.addDataSource(TableNum(EmplTable)); ds2.addLink(FieldNum(OutlookTaskTable, User), FieldNum(EmplTable, EmplId)); ds2.joinMode(JoinMode::ExistsJoin); ds2.addRange(FieldNum(EmplTable, HRMOrganizationId)).value(ArrayStr); } else ds2.findRange(FieldNum(EmplTable, HRMOrganizationId)).value(ArrayStr); Второй запрос смотрит поле User из таблицы OutlookTaskTable и проверяет по таблице EmplTable принадлежность к подразделению CurUserId(). Последний раз редактировалось moid; 21.03.2007 в 13:53. |
|
21.03.2007, 14:25 | #2 |
Участник
|
Цитата:
Код: qbds = query.addDataSource(tablenum(OutlookTaskTable), "OutlookTaskTableDS"); qbds.fetchMode(QueryFetchMode::One2One); qbds.relations(false); qbds2 = qbds.addDataSource(tablenum(EmplTable), "EmplTable1DS"); qbds2.fetchMode(QueryFetchMode::One2One); qbds2.relations(false); qbds2.joinMode(JoinMode::OuterJoin); qbds2.addLink(fieldnum(OutlookTaskTable, User), fieldnum(EmplTable, EmplId)); qbds2.addRange(fieldnum(EmplTable, EmplId)).value("ANV"); qbds1 = qbds.addDataSource(tablenum(EmplTable), "EmplTableDS"); qbds1.fetchMode(QueryFetchMode::One2One); qbds1.relations(false); qbds1.joinMode(JoinMode::InnerJoin); qbds1.addLink(fieldnum(OutlookTaskTable, User), fieldnum(EmplTable, EmplId)); s = strfmt("((%1.EmplId == %2.EmplId) && (%1.RecId == %2.RecId))", qbds1.name(), qbds2.name()); qbds1.addRange(fieldnum(OutlookTaskTable, HRMORGANIZATIONID)).value(s); qbds1.addRange(fieldnum(OutlookTaskTable, HRMORGANIZATIONID)).value("IS"); |
|
22.03.2007, 11:00 | #3 |
Участник
|
Вот так надо было:
X++: ds = OutlookTaskTable_q.dataSourceTable(TableNum(OutlookTaskTable)); ds2 = OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable)); if (!ds2) { ds2 = ds.addDataSource(TableNum(EmplTable)); StrRange = '((((OutlookTaskTable.Ot = "%1") || (OutlookTaskTable.User = "%2") || (HRMOrganizationId = "%3")) && (EmplId = OutlookTaskTable.User)))'; ds2.addRange(FieldNum(EmplTable, RecId)).value(strfmt(StrRange, CurUserId(), CurUserId(), "ИС")); } |
|
23.03.2007, 09:32 | #4 |
Участник
|
А как мне теперь удалить такой рэнжь?
|
|
23.03.2007, 09:46 | #5 |
Участник
|
myRange.value("");
Обратите внимание, что такая конструкция удаляет range из запроса. Такая конструкция не эквивалентна поиску пустой строки. Для поиска пустой строки пользуйтесь SysQuery::valueEmptyString() |
|
23.03.2007, 09:55 | #6 |
Участник
|
Цитата:
myRange.value("");
X++: ds2.findRange(FieldNum(EmplTable, RecId)).value(""); Если выключаю его: X++: ds2.enabled(false); Нужно именно удалять, а не очищать. |
|
23.03.2007, 10:06 | #7 |
Участник
|
Вы посмотрите на sql запрос.
по пустому range условие в sql запросе не создается. обратите внимание на запросы в отчетах я не очень понимаю зачем вам удалять именно range. скорее всего, вам нужно избавиться от условия в sql запросе. так избавьтесь от условия штатными средствами - установите пустую строку в range. |
|
23.03.2007, 11:00 | #8 |
Участник
|
сделал так:
X++: Void ClearRg() { //Очищаем запрос ds2 = OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable)); ds4 = OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable)); if (ds2) { FRange = ds2.findRange(FieldNum(EmplTable, RecId)); if(FRange) { ds2.findRange(FieldNum(EmplTable, RecId)).value(SysQuery::valueUnlimited()); OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable)).clearRanges(); ds2.enabled(false); } } if (ds4) { FRange = ds4.findRange(FieldNum(EmplTable, RecId)); if (FRange) { ds4.findRange(FieldNum(EmplTable, RecId)).value(SysQuery::valueUnlimited()); OutlookTaskTable_q.dataSourceTable(TableNum(EmplTable)).clearRanges(); ds4.enabled(false); } } } |
|
29.06.2007, 15:36 | #9 |
Участник
|
А у меня не работает
Делаю: X++: salesTable_ds.autoQuery(false); query = new Query(); DS=query.addDataSource(tablenum(SalesTable)); qbr=DS.addRange(fieldnum(SalesTable, RecId)); qbr.value(strfmt('(((SalesTable.SalesTaker=\"%1\") || (SalesTable.SalesResponsible=\"%1\")))',EmplTable::findByUserId_W(curuserid()).EmplId)); salesTable_ds.query(query); Цитата:
SELECT * FROM SalesTable WHERE (((((SalesTable.SalesTaker="Иванов") || (SalesTable.SalesResponsible="Иванов")))))
Цитата:
Ошибка расширенного диапазона запроса: SalesTable.SalesTaker не является корректной парой datasource.field рядом с 27.
|
|
29.06.2007, 15:41 | #10 |
Программатор
|
X++: qbr.value(strfmt('((SalesTable.SalesTaker="%1") || (SalesTable.SalesResponsible="%1"))',EmplTable::findByUserId_W(curuserid()).EmplId)); |
|
02.07.2007, 11:42 | #11 |
Участник
|
нет, там проблема была другая - salestable не нужно было писать, т.е.
X++: qbr.value(strfmt('(((SalesTaker=\"%1\") || (SalesResponsible=\"%1\")))',EmplTable::findByUserId_W(curuserid()).EmplId)); |
|
02.07.2007, 12:07 | #12 |
Участник
|
Думаю проблема была связана с вот этим
RLS&Расширенный запрос |
|