| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Всем привет!  
		
		
		
		
		
		
		
	Пересмотрел несколько похожих тем, но к сожалению, из-за нехватки опыта, понимания так и не пришло. Задача такова: На форме (не важно какой, у формы 1 источник данных) нужно организовать фильтр по полю ItemId. Т.к. область значений может быть достаточна велика, то я решил использовать временную таблицу, заполнить ее нужными значениями (ItemId) и сдлеать join к постоянной таблице, являющейся источником данных на форме. Я пытаюсь в executeQuery() сформировать запрос и присвоить его datasource формы. Вот примерный код: X++: public void executeQuery() { Query query; QueryBuildDataSource qbdsRetailPriceBuffer, qbdsTmpTable; TmpTable tmpTable = TmpTable::InitOnServer(); ; query = new Query(); qbdsRetailPriceBuffer = query.addDataSource(tablenum(RetailPriceBuffer)); if(InventLocationFilter.valueStr() && CustomSectionFilter.valueStr()) { tmpTable.data(GetCustomSectionFilterResult(InventLocationFilter.valueStr(), CustomSectionFilter.valueStr())); qbdsTmpTable = qbdsRetailPriceBuffer.addDataSource(tablenum(TmpTable)); qbdsTmpTable.addLink(fieldnum(RetailPriceBuffer, ItemId), fieldnum(TmpTable, ItemId)); qbdsTmpTable.joinMode(JoinMode::ExistsJoin); qbdsTmpTable.fetchMode(false); } this.query(query); super(); } X++: public static server TmpTable InitOnServer() { TmpTable tmpTable; select firstonly tmpTable; return tmpTable; } X++: public static server TmpTable GetCustomSectionFilterResult(InventLocationId _inventLocationId, CustomSectionId _customSectionId) { TmpTable tmpTable = TmpTable::InitOnServer(); ; //Заполнение tmpTable... return tmpTable; } Что же я делаю не так? Помогите пожалуйста, если кто сталкивался. С уважением, Евгений.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Но мой взгляд, объединение постоянной таблицы с временной не самая удачная идея. 
		
		
		
		
		
		
		
	Я бы сделал так: таблицу бы сделал не временной а нормальной. 
  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: yahenz (1). | |
| 
			
			 | 
		#3 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 
			
			если честно, не до конца понял что за монстро-фильтр надо организовать, который нельзя было бы наложить с помощью расширенного фильтра... 
		
		
		
		
		
		
			попробую предположить решение вашей проблемы... необходимо добавить курсор временной таблицы в QueryRun вашей формы, а именно написать в методе ExecuteQuery до супера (по идее все равно где именно) следующий код: X++: this.queryRun().setCursor(myTmpTable); 
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Насколько я помню, временная таблица должна всегда быть в "верху" запроса. Т.е. линкуйте постоянные таблицы к временной, а не наоборот.
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
		
			-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 22.02.2012 в 18:13.  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Raven Melancholic
			 
 
			Но мой взгляд, объединение постоянной таблицы с временной не самая удачная идея. 
		
	Я бы сделал так: таблицу бы сделал не временной а нормальной. 
 Цитата: 
	
		
			Сообщение от lev
			 
 
			если честно, не до конца понял что за монстро-фильтр надо организовать, который нельзя было бы наложить с помощью расширенного фильтра... 
		
	попробую предположить решение вашей проблемы... необходимо добавить курсор временной таблицы в QueryRun вашей формы, а именно написать в методе ExecuteQuery до супера (по идее все равно где именно) следующий код: X++: this.queryRun().setCursor(myTmpTable); Благодарю, буду разбираться. Как окажусь на работе, попробую, спс.  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 ---------------- 
		
			
	 | 
	
	
	
		
		
		
		 
			
			не надо джоинить постоянные и временные таблицы. 
		
		
		
		
		
		
		
	Цитата: 
	
		
			длинна критерия в value(...) ограничена 250 символами
		
	 
 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Pustik (7), yahenz (1). | |
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Я правильно понял, если у меня будет 5000 номенклатур, то это 5000 addRange'й? Или необходимо создавать следующий рендж, только когда в первом "закончилось место"?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Роман Долгополов (RDOL) 
		
			
	 | 
	
	
	
		
		
		
		 
			
			ну думаю не будет большим свинством процитировать себя Выборка произвольных записей одним запросом
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: fed (3), lev (3), yahenz (1). | |
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Проверено: если Range становится очень много (в моем случае их 833 набралось), то Ax ругается так "Трассировка стека: При выполнении операции привязки не удалось распределить пространство буфера."
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Ты лучше голодай, чем что попало есть, И лучше будь один, чем вместе с кем попало. 
			 | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 MCP 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
длина Range  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Axapta 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Нет у range в X++ ограничения в 250 символов. Ограничение в 250 символов есть только у EDT Range, который стандартно используется на формах для указания критериев запросов. Но и его длину можно увеличить. 
		
		
		
		
		
		
		
		
			А вот больше скольких-то сотен условий по ИЛИ добавить не получится, есть ограничение на уровень вложенности WHERE. Аксапта для ИЛИ построит что-то типа такого и в некоторый момент загнется: X++: ((((((((((((((((((((((((((((((((((((((((((((((((ITEMID=?) OR (ITEMID=?)) OR (ITEMID=?)) OR (ITEMID=?)) OR (ITEMID=?))... Последний раз редактировалось oip; 24.04.2012 в 15:07. Причина: добавил про вложенность  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: klimova_m (1), kornix (1). | |
| 
			
			 | 
		#13 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от oip
			 
 
			Нет у range в X++ ограничения в 250 символов. Ограничение в 250 символов есть только у EDT Range, который стандартно используется на формах для указания критериев запросов. Но и его длину можно увеличить. 
		
	А вот больше скольких-то сотен условий по ИЛИ добавить не получится, есть ограничение на уровень вложенности WHERE. Я, поэтому, всегда пользуюсь техникой, которую участник db описал. Хотя я ее предпочитаю даже не столько с точки зрения производительности, сколько с точки зрения наглядности...  | 
| 
	
 | 
| 
	
	 | 
	
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
		
  |