| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Как должна выполнятся конструкция вида 
		
		
		
		
		
		
		
	X++: while select tmpTable1 group by GroupId exists join tmpTable2 where tmpTable2.Id == tmpTable1.Id По аналогии с постоянными таблицами можно предположить, что сначала из таблицы tmpTable1 выберутся строкии, Id которых соответствуют строкам из таблицы tmpTable2. И затем отобранные строки сгруппируются по полю GroupId. На практике же оказывается что group by отрабатывает первым. Причём значение поля id не обнуляется, а становится равным значению из первой строки группы (первой по очерёдности вставки). И вот уже с этими Id продолжает работать exists join. Естественно результат такой выборки мало предсказуем. Данный баг уже был описан ранее? Или это фича такая?  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Administrator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Может я конечно чего-то не догоняю, но Вы видимо ожидаете увидеть поле GroupId пустым? В Аксапте контсрукция типа 
		
		
		
		
		
		
			X++: select tmpTable1 group by GroupId X++: select GroupId from tmpTable1 group by GroupId И потом - описанная Вами конструкция преобразуется в SQL вида X++: SELECT GROUPID FROM TMPTABLE1 WHERE TMPTABLE1.GROUPID EXISTS IN (SELECT * FROM TMPTABLE2 WHERE TMPTABLE2.GROUPID = TMPTABLE1.GROUPID) GROUP BY GROUPID 
				__________________ 
		
		
		
		
	Возможно сделать все. Вопрос времени  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			в моём примере запрос имеет немного другой вид 
		
		
		
		
		
		
		
	Код: SELECT GROUPID FROM TMPTABLE1 WHERE TMPTABLE1.GROUPID EXISTS IN (SELECT * FROM TMPTABLE2 WHERE TMPTABLE2.ID = TMPTABLE1.ID) GROUP BY GROUPID Код: SELECT T.GROUPID FROM (SELECT GROUPID, MIN(ID) FROM TMPTABLE1 GROUP BY GROUPID) AS T WHERE EXISTS(SELECT * FROM TMPTABLE2 WHERE TMPTABLE2.ID = T.ID)  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Administrator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А, я понял. Дело в том, что Аксапта сама не генерит JOIN-конструкции. А без JOIN-конструкции нельзя будет связать как Вы хотите - до группировки. При этом, замечу, что группировка заведомо предполагает перечисление в явном виде полей для выборки (чего кстати говоря нет в Вашем исходном примере у 2-й таблицы) и группировки. 
		
		
		
		
		
		
			Пример, который я написал про SQL-запрос намеренно написан именно так. Ваш вариант PHP код: 
	
			
	PS. Теперь окончательно понял   Т.е. конструкция самого запроса принципиально меняется. Это конечно интересно проверить. Однако - дело в том, что временные таблицы не всегда джойнятся с группировкой как у Вас, да еще связываясь по полю, не участвующему в группировке. В системе часто используются всякие Map, Set, RecordSortedList и прочие конструкции, торчащие в памяти (в частности при разноске). Временная таблица как правило нужна, чтобы в нее запихнуть конкретные данные для вывода в форму/отчет. И джойнить с ней подразумевается только справочники (т.е. без группировок и exists join). Конечно наверняка найдутся примеры и такого использования кода, но....сначала было бы неплохо их глянуть - чтобы понять где они есть и отрабатывают ли они вообще в России (т.к. форум в основном используется людьми, использующих российскую локализацию).
		
				__________________ 
		
		
		
		
	Возможно сделать все. Вопрос времени  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вот  набрасал небольшой пример  
		
		
		
			X++: static void TEST_Job(Args _args) { TEST_tmpTable1 TEST_tmpTable1; TEST_tmpTable2 TEST_tmpTable2; ; //----------------------------------------------- TEST_tmpTable1.GroupId = '01'; TEST_tmpTable1.Id = 1; TEST_tmpTable1.insert(); TEST_tmpTable1.Id = 2; TEST_tmpTable1.insert(); TEST_tmpTable1.GroupId = '02'; // Но если следующие две строки кода поменять местами, // то результат будет другой TEST_tmpTable1.Id = 4; TEST_tmpTable1.insert(); TEST_tmpTable1.Id = 3; TEST_tmpTable1.insert(); TEST_tmpTable2.Id = 1; TEST_tmpTable2.insert(); TEST_tmpTable2.Id = 3; TEST_tmpTable2.insert(); //----------------------------------------------- while select TEST_tmpTable1 group by GroupId exists join TEST_tmpTable2 where TEST_tmpTable2.Id == TEST_tmpTable1.Id { info(TEST_tmpTable1.GroupId); } } Последний раз редактировалось S.Kuskov; 30.01.2009 в 08:21.  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от sukhanchik
			 
 
			Ваш вариант 
		
	PHP код: 
	
			
	 | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Сейчас проверил на AX2012 порядок работы для постоянных и временных(InMemory) таблиц попрежнему отличается  
		
		
		
		
		
		
		
	 
		 | 
| 
	
 | 
| Теги | 
| bug, баг, временная таблица, запрос (query), ошибка | 
| 
	
	 | 
	
			 
			Похожие темы
		 | 
	||||
| Тема | Ответов | |||
| Проблемы с Exists Join | 28 | |||
| Данные в Grid из таблиц, связанных по Outer Join | 2 | |||
| Проблема с Exists Join | 5 | |||
| outer join для трех таблиц | 4 | |||
		
  |