| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#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"); | 
| 
	
 | 
| 
			
			 | 
		#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(), "ИС")); }  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А как мне теперь удалить такой рэнжь?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			myRange.value(""); 
		
		
		
		
		
		
			
		
		
		
		
	Обратите внимание, что такая конструкция удаляет range из запроса. Такая конструкция не эквивалентна поиску пустой строки. Для поиска пустой строки пользуйтесь SysQuery::valueEmptyString()  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			myRange.value("");
		
	 
X++: ds2.findRange(FieldNum(EmplTable, RecId)).value(""); Если выключаю его: X++:  ds2.enabled(false);Нужно именно удалять, а не очищать.  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вы посмотрите на sql запрос. 
		
		
		
		
		
		
			
		
		
		
		
	по пустому range условие в sql запросе не создается. обратите внимание на запросы в отчетах ![]() я не очень понимаю зачем вам удалять именно range. скорее всего, вам нужно избавиться от условия в sql запросе. так избавьтесь от условия штатными средствами - установите пустую строку в range.  | 
| 
	
 | 
| 
			
			 | 
		#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); } } }  
		 | 
| 
	
 | 
| 
			
			 | 
		#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.
		
	 
 | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Программатор 
		
			
	 | 
	
	
	
		
		
		
		 X++: qbr.value(strfmt('((SalesTable.SalesTaker="%1") || (SalesTable.SalesResponsible="%1"))',EmplTable::findByUserId_W(curuserid()).EmplId)); | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			нет, там проблема была другая - salestable не нужно было писать, т.е.  
		
		
		
		
		
		
		
	X++:         qbr.value(strfmt('(((SalesTaker=\"%1\") || (SalesResponsible=\"%1\")))',EmplTable::findByUserId_W(curuserid()).EmplId)); | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Думаю проблема была связана с вот этим 
		
		
		
		
		
		
			
		
		
		
		
	RLS&Расширенный запрос  | 
| 
	
 |