| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Есть запрос : 
		
		
		
		
		
		
		
	Select payTrans where . . . . . && payTrans.Emplid == nameEmplList дело в том что nameEmplList - это список через запятую ( 123,543,678,812,453 ) причём длинна этого списка не известна. Перебор по списку сотрудников. Вопрос как правильно это сделать в Х++ запросе?! Делать вне запроса не хочется, будет долго. Необходимо реализовать подобие функции Charindex() в SQL.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 NavAx 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Скорее это нужно делать через конструктор запросов в x++, а диапазон задать, добавив range по EmplId: 
		
		
		
		
		
		
		
	Код:     QueryBuildRange             qr;
    ;
    ...
    
    qr.value(sysQuery::value(nameEmplList)); | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Сделать временную таблицу, заполнить её списком и заджойнить. 
		
		
		
		
		
		
		
	С Уважением, Георгий  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вот более полный вариант примера, приведенного Roman777 
		
		
		
		
		
		
		
	X++: Query q; QueryBuildDataSource qbds; QueryBuildRange qbr; QueryRun qr; RPayTrans payTrans; q = new Query(); qbds = q.addDataSource(tablenum(RPayTrans)); qbr = qbds.addRange(fieldnum(RPayTrans, EmplId)); qbr.value(nameEmplList); qr = new QueryRun(q); while (qr.next()) { payTrans = qr.get(tablenum(RPayTrans)); ... }  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Кстати, если вы формируете список сотрудников (т.е. значение переменной nameEmplList) в цикле, то предыдущий пример можно сделать несколько иначе: 
		
		
		
		
		
		
		
	X++: Query q; QueryBuildDataSource qbds; QueryBuildRange qbr; QueryRun qr; RPayTrans payTrans; EmplTable emplTable; q = new Query(); qbds = q.addDataSource(tablenum(RPayTrans)); while select emplTable where ... { qbr = qbds.addRange(fieldnum(RPayTrans, EmplId)); qbr.value(SysQuery::value(emplTable.EmplId)); } qr = new QueryRun(q); while (qr.next()) { payTrans = qr.get(tablenum(RPayTrans)); ... }  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от George Nordic
			
			 
Сделать временную таблицу, заполнить её списком и заджойнить. 
		
	Через query - лучше! Хотя в случае query есть ограничение на длину строки, подставляемой в range. Но это можно обойти при помощи нескольких range на одно и то же поле. В этом случае они будут объединяться по ИЛИ. Можно ещё конечно извратиться с макросом для обычного select (см. макрос InventDimJoin). В макрос передается динамически сгенерированное условие where на основе списка значений nameEmplList. Но макросы как-то обычно не рекомендуется использовать.  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от dn
			
			 
С временной таблицей - спорный вариант, с подводными камнями. 
		
	 | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от dn
			
			 
Можно ещё конечно извратиться с макросом для обычного select (см. макрос InventDimJoin). В макрос передается динамически сгенерированное условие where на основе списка значений nameEmplList. Но макросы как-то обычно не рекомендуется использовать. 
		
	![]() Проверка на передачу пустого параметра в макрос Ну не передаются в макрос динамически (т.е. программно) сгенерированные вещи! Макросы используются только на этапе компиляции. 
				__________________ 
		
		
		
		
	Андрей.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от dn
			
			 
С временной таблицей - спорный вариант, с подводными камнями.  
		
	Через query - лучше! Хотя в случае query есть ограничение на длину строки, подставляемой в range. Но это можно обойти при помощи нескольких range на одно и то же поле. В этом случае они будут объединяться по ИЛИ.  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от dn
			
			 
Хотя в случае query есть ограничение на длину строки, подставляемой в range. 
		
	 | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Зависит от размера EDT Range.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Gustav (1). | |
| 
			
			 | 
		#12 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Hezl
			
			 
Зависит от размера EDT Range. 
		
	![]() P.S. Кстати, влияет ли размер этого EDT Range еще на что-нибудь? Критично ли? Почему по дефолту стоит 250, а не сразу максимально 1000? Последний раз редактировалось Gustav; 16.03.2006 в 11:49.  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Dron AKA andy
			
			 
Ну не передаются в макрос динамически (т.е. программно) сгенерированные вещи! Макросы используются только на этапе компиляции. 
		
	Тогда ещё остается только runbuf  
		 | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Gustav
			
			 
Например? 
		
	join постоянной и временной таблиц утечка RecId производительность ...  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от dn
			
			 
Подводные камни с временными таблицами не раз обсуждались: 
		
	join постоянной и временной таблиц утечка RecId производительность ...  | 
| 
	
 | 
| Теги | 
| query, временная таблица, ax3.0 | 
| 
	
	 | 
	
			 
			Похожие темы
		 | 
	||||
| Тема | Ответов | |||
| Подскажите класс для подсчета сальдо | 7 | |||
| Подскажите с чего начать | 12 | |||
| Проблема с запросом | 7 | |||
| Подскажите как реализовать такой запрос в Axapte | 12 | |||
| Помогите с запросом.. | 2 | |||
		
  |