| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Метод addRange() и его использование (верное)
			 
			
			Доброго времени суток, дамы и господа. 
		
		
		
		
		
		
		
	Подскажите пожалуйста, может кто-либо из вас сталкивался с таким вопросом. Суть - нужно открыть форму(№2) с заранее отсортированным дс из другой формы(№1). Для этого изпользуются классы FormRun, FormDataSource и QueryBuildRange. В частности вот код - X++:     QFormRun = ClassFactory.FormRunClass(Args);
    QFormRun.init();
    QFormDs = QformRun.dataSource(2);
    criteria = QFormDs.Query().dataSourceNo(2).addRange(
        fieldNum(pgpProjTable,ProjId)); //спозиционировались
    criteria.value(pgpProjTable.ProjId); //задали рейндж
    QFormRun.Run();X++: criteria = QFormDs.Query().dataSourceNo(2).addRange(
        fieldNum(pgpTaskTable,TaskId)); // вот тут начинаются чудеса :eek: 
criteria.value(pgpTasksTable.TaskId);Как говорила некая Алиса - "Всё чудесатее и чудесатее."   З.Ы. Ax 3.0 eng SP2. Заранее благодарю.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Может таблицы идут в разном порядке? Позиционируйтесь по tablenum. Вообще говоря, для того, чтобы преенести текущие range в другое место юзайте SysQuery::mergeRange() Для того, чтобы правильно создать range юзайте SysQuery::findOrCreateRange()  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			хмм.... видимо я не совсем верно сформулировал свой вопрос. Попробую по другому. 
		
		
		
		
		
		
		
		
			Позиционирование на дс происходит абсолютно верно. Если вы говорите про кусок кода - Query().dataSourceNo(2), то да - здесь вернее будет ловить по имени (Query().dataSourceName("pgpQstRef")), спасибо за подсказку. ![]() Суть немного в другом - мне необходимо форму №2 открывать из 4ех других форм, каждый раз с разным range. . В форме №1 и в форме №3 у меня никакого range нет, я его задаю открываемой форме позиционируясь на один из её датасурсов и используя текущие записи из форм №1 и №3. И ессно у меня в данных формах нет и Query. Не совсем еще разобрался в SysQuery::MergeRanges() но там на входе 2 query, а у меня существует только один.   Данный метод мне, к сожалению не подходит.Вобще суть вопроса такова - при явном указании открываемой форме на какое поле ей необходимо наложить range (то, что я назвал позиционироваться) Акспта начинает путать поля и накладывать задаваемый range не туда, куда надо. З.Ы. SysQuery::findOrCreateRange() - вобще не нашел, к сожалению. Может это при другом СП? Напомню свой текущий - Ax3.0 SP2. Последний раз редактировалось Akinak; 05.04.2007 в 14:26.  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Query().dataSourceTable(tablenum(pgpQstRef)))  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Тут явно все дело именно в том источнике, который выбирается для фильтра. (Это так правильно называется. Позиционирование - это совсем другая тема) 
		
		
		
		
		
		
			
		
		
		
		
	Так как парсер опирается на таблицу, которая находится в QueryBuildDataSource при наложении фильтра, то в метод addRange вы передаете только номер поля (как у вас реализовано). Но из-за того, что таблица на самом деле не та, берется ее поле с этим номером - соостветственно получаете левое поле. А вообще, вместо такой фильтрации может попробовали бы использовать динамические связи? (Dynalink)? Тут и программировать не пришлось бы. Только настроить отношения между таблицами. Хотя, Вам решать  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Akinak
			 
 
			X++:     criteria = QFormDs.Query().dataSourceNo(2).addRange(
        fieldNum(pgpProjTable,ProjId)); //спозиционировались
    criteria.value(pgpProjTable.ProjId); //задали рейнджX++: criteria = QFormDs.Query().dataSourceNo(2).addRange(
        fieldNum(pgpTaskTable,TaskId)); // вот тут начинаются чудеса :eek: 
criteria.value(pgpTasksTable.TaskId);![]() Посмотрите, в обоих случаях Вы обращаетесь к той же самой форме. В первом случае как к таблице pgpProjTable, накладывая соответствующий фильтр. Все ОК. Видимо этот источник именно этой таблицы Во втором случае уже как к таблице pgpTaskTable. Если посмотрите код поля pgpTaskTable.TaskId, то увидите, что он равен коду поля, которое вы видите в дебаггере.  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Gustav (8). | |
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Огромное спасибо, господа. Разобрался. По отдельности ваши посты не помогли бы, а вот вместе...  
		
		
		
		
		
		
		
	![]() Маззи - спасибо за подсказку правильного метода для использования. kasperuk - спасибо за разьяснение принципа работы addRange().  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Извините, не удержался, навёл красоту.  
		
		
		
			  1400 / 350 = ровно 4 ! Congratulations! Гармония, однако!  
		 | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
![]() Это что же получается? Что 3 сообщения из 4ех не оказались полезными? Как, к примеру, и вот это  
		 | 
| 
	
 |