| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Не цепляется второй дочерний датасорс в запросе
			 X++: Query       query;
    QueryBuildDataSource    dsInventTrans,
                            dsInventTransPosting,
                            dsInventDim;
    int                     i;
    ;
    query = new Query();
    // Инициализация структуры запроса
    // InventTrans
    dsInventTrans   =   query.addDataSource(tablenum(InventTrans));
    dsInventTrans.name('dsInventTrans');
    dsInventTrans.firstFast(false);
    dsInventTransPosting    = dsInventTrans.addDataSource(tablenum(InventTransPosting));
    dsInventDim             = dsInventTrans.addDataSource(tablenum(InventDim));
    // Дальнейший код(dsInventTrans = SELECT FIRSTFAST * FROM InventTrans) После, к нему добавляю дочерний датасорс InventTransPosting, в датасорсе InventTrans значение меняется на (dsInventTrans = SELECT * FROM InventTrans JOIN FIRSTFAST * FROM InventTransPosting) Далее цепляю к dsInventTrans второй датасорс dsInventDim на что в датасорсе dsInventTrans значение меняется на: (dsInventTrans = SELECT * FROM InventTrans). Добавление второго Датасорса сбивает первый дочерний и все связи, которые до сих пор были добавлены. Подскажите как можно справиться с проблемой и что это может быть. Версия DAX 2009. Спасибо. Последний раз редактировалось Cardagant; 13.02.2012 в 18:51.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вообще-то, прежде чем задавать вопрос, попробуйте воспользоваться поиском. Возможно, подобные вопросы уже обсуждались  
		
		
		
		
		
		
			![]() Join трех таблиц (две к одной) или "посвежее" QueryRun и два Join'а 
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Cardagant (1). | |
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Владимир Максимов
			 
 
			Вообще-то, прежде чем задавать вопрос, попробуйте воспользоваться поиском. Возможно, подобные вопросы уже обсуждались  
		
	![]() Join трех таблиц (две к одной) или "посвежее" QueryRun и два Join'а  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Владимир Максимов
			 
 
			Вообще-то, прежде чем задавать вопрос, попробуйте воспользоваться поиском. Возможно, подобные вопросы уже обсуждались  
		
	![]() Join трех таблиц (две к одной) или "посвежее" QueryRun и два Join'а Выборка происходит корректно, однако нет возможности сгруппировать по полям из дочерних таблиц. Выдаёт сообщение "Заданная последовательность полей Group By и Order By не поддерживается." Как это можно преодолеть? Спасибо.  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			При Exists Join делать группировку или сортировку по подчиненной таблице - бессмысленно. Извините, конечно, но Вы в курсе чем Exists отличается от Inner Join?  
		
		
		
		
		
		
			Заменять одно на другое можно только если задача это допускает. Причем, как правило, как раз наоброт, использование Exists Join в Axapta, по возможности, следует избегать. Если задача позволяет, лучше использовать Inner Join Приведите полный запрос, который Вы хотите получить. Просто команду Select напишите. 
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			измените на innerJoin и для каждого датасорса напишите:  
		
		
		
		
		
		
		
	X++: qbds.fetchMode(QueryFetchMode::One2One);  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Владимир Максимов
			 
 
			При Exists Join делать группировку или сортировку по подчиненной таблице - бессмысленно. Извините, конечно, но Вы в курсе чем Exists отличается от Inner Join?  
		
	Заменять одно на другое можно только если задача это допускает. Причем, как правило, как раз наоброт, использование Exists Join в Axapta, по возможности, следует избегать. Если задача позволяет, лучше использовать Inner Join Приведите полный запрос, который Вы хотите получить. Просто команду Select напишите. SUM (INVENTTRANS.CostAmountSecCurPosted_RU) /*, SUM (INVENTSETTLEMENT.COSTAMOUNTADJUSTMENT)*/ as sum , INVENTTRANS.ITEMID , INVENTDIM.INVENTLOCATIONID, INVENTPROFILE_RU.INVENTPROFILEType--, /*, INVENTDIM.INVENTPROFILEID_RU, INVENTDIM.INVENTOWNERID_RU, INVENTDIM.INVENTBATCHID, INVENTDIM.INVENTGTDID_RU , INVENTTRANSPOSTING.ACCOUNT, INVENTTRANSPOSTING.ACCOUNTOFFSET , INVENTTRANSPOSTING.DIMENSION, INVENTTRANSPOSTING.DIMENSION7_ /*, INVENTTRANS.TRANSREFID, INVENTTRANS.RASSETID_ZTR*/ */ from INVENTTRANS inner join INVENTDIM on INVENTTRANS.INVENTDIMID = INVENTDIM.INVENTDIMID inner join INVENTTRANSPOSTING on INVENTTRANS.INVENTTRANSID = INVENTTRANSPOSTING.INVENTTRANSID and INVENTTRANS.ITEMID = INVENTTRANSPOSTING.ITEMID --физическая связь and INVENTTRANSPOSTING.TRANSDATE = INVENTTRANS.DATEPHYSICAL and INVENTTRANSPOSTING.VOUCHER = INVENTTRANS.VOUCHERPHYSICAL and INVENTTRANSPOSTINGTYPE = 0 and INVENTTRANS.ITEMID like '22.%' , INVENTPROFILE_RU where INVENTDIM.INVENTPROFILEID_RU = INVENTPROFILE_RU.INVENTPROFILEID and --INVENTPROFILE_RU.INVENTPROFILETYPE= '1' and -- не включать финансовые сторно проводки INVENTTRANS.STORNO_ZTR = 0 -- не включать физические сторно проводки and INVENTTRANS.PACKINGSLIPRETURNED = 0 --дата and INVENTTRANSPOSTING.TRANSDATE /*between*/ /*< '2012-01-01'*/ /*and*/ < '2012-01-08' /*-- Код номенклатуры, номер журнала, номер ОС and INVENTTRANS.ITEMID = '' and INVENTTRANS.TRANSREFID = '' and INVENTTRANS.RASSETID_ZTR = ''*/ --складские аналитики --and INVENTDIM.INVENTLOCATIONID = '' /*and INVENTDIM.INVENTPROFILEID_RU = '' and INVENTDIM.INVENTOWNERID_RU = '' and INVENTDIM.INVENTBATCHID = '' and INVENTDIM.INVENTGTDID_RU = '' -- Счет ГК, Корр.счет and INVENTTRANSPOSTING.ACCOUNT = '' and INVENTTRANSPOSTING.ACCOUNTOFFSET = '' --Финансовые аналитики (Подразделение, Заводской заказ) and INVENTTRANSPOSTING.DIMENSION = '' and INVENTTRANSPOSTING.DIMENSION7_ = ''*/ group by INVENTTRANS.ITEMID , INVENTDIM.INVENTLOCATIONID, INVENTPROFILE_RU.INVENTPROFILEType/*, INVENTDIM.INVENTPROFILEID_RU, INVENTDIM.INVENTOWNERID_RU, INVENTDIM.INVENTBATCHID, INVENTDIM.INVENTGTDID_RU , INVENTTRANSPOSTING.ACCOUNT, INVENTTRANSPOSTING.ACCOUNTOFFSET , INVENTTRANSPOSTING.DIMENSION, INVENTTRANSPOSTING.DIMENSION7_*/ /*, INVENTTRANS.TRANSREFID, INVENTTRANS.RASSETID_ZTR*/ order by INVENTTRANS.ITEMID , INVENTDIM.INVENTLOCATIONID , INVENTPROFILE_RU.INVENTPROFILEType Что-то вроде этого... Что приведено в комментариях может быть выбрано или не выбрано в зависимо от условий Последний раз редактировалось Cardagant; 17.02.2012 в 12:51.  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Это работающий код? Не вижу где джойнится INVENTSETTLEMENT. 
		
		
		
		
		
		
		
		
			Предлагаю вам этот сложный неработающий запрос начать последовательно упрощать. И представить здесь максимально простую неработающую версию. Ведь количество выбираемых полей и условий не влияет на работоспособность запроса. Всё зависит от последовательности соединений. Составьте тестовый пример неработающего соединения, который не будет содержать кучу отвлекающей информации. Последний раз редактировалось S.Kuskov; 17.02.2012 в 12:39.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от S.Kuskov
			 
 
			Это работающий код? Не вижу где джойнится INVENTSETTLEMENT. 
		
	Предлагаю вам этот сложный неработающий запрос начать последовательно упрощать. И представить здесь максимально простую неработающую версию. Ведь количество выбираемых полей и условий не влияет на работоспособность запроса. Всё зависит от последовательности соединений. Составьте тестовый пример неработающего соединения, который не будет содержать кучу отвлекающей информации. Не получается стандартным QueryaddDataSource прицепить одновременно InventDim и InventTransPosting. Подскажите пожалуйста варианты выхода из ситуации кроме получения выборки через ResultSet Последний раз редактировалось Cardagant; 17.02.2012 в 12:55.  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Так? 
		
		
		
		
		
		
		
		
			X++: Query q = new Query(); QueryBuildDataSource qbdsInventTrans; QueryBuildDataSource qbdsInventTransPosting; QueryBuildDataSource qbdsInventDim; QueryBuildDataSource qbdsInventProfile_RU; ; qbdsInventTrans = q.addDataSource(tablenum(InventTrans)); qbdsInventTransPosting = qbdsInventTrans.addDataSource(tablenum(InventTransPosting)); qbdsInventTransPosting.relations(true); qbdsInventTransPosting.joinMode(joinMode::InnerJoin); qbdsInventTransPosting.fetchMode(QueryFetchMode::One2One); qbdsInventDim = qbdsInventTrans.addDataSource(tablenum(InventDim)); qbdsInventDim.relations(true); qbdsInventDim.joinMode(joinMode::InnerJoin); qbdsInventDim.fetchMode(QueryFetchMode::One2One); qbdsInventProfile_RU = qbdsInventDim.addDataSource(tablenum(InventProfile_RU)); qbdsInventProfile_RU.relations(true); qbdsInventProfile_RU.joinMode(joinMode::InnerJoin); qbdsInventProfile_RU.fetchMode(QueryFetchMode::One2One); qbdsInventTrans.orderMode(orderMode::GroupBy); qbdsInventTransPosting.orderMode(orderMode::GroupBy); qbdsInventDim.orderMode(orderMode::GroupBy); qbdsInventProfile_RU.orderMode(orderMode::GroupBy); qbdsInventTrans.addSelectionField(fieldNum(InventTrans, Qty), SelectionField::Sum); qbdsInventTrans.addSortField(fieldNum(InventTrans, ItemId)); qbdsInventTransPosting.addSortField(fieldNum(InventTransPosting, Account)); qbdsInventDim.addSortField(fieldNum(InventDim, InventLocationId)); qbdsInventProfile_RU.addSortField(fieldNum(InventProfile_RU, InventProfileType)); info(qbdsInventTrans.toString()); Последний раз редактировалось S.Kuskov; 17.02.2012 в 13:23.  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Cardagant (1), Artikov (1). | |
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от S.Kuskov
			 
 
			Так? 
		
	X++: Query q = new Query(); QueryBuildDataSource qbdsInventTrans; QueryBuildDataSource qbdsInventTransPosting; QueryBuildDataSource qbdsInventDim; QueryBuildDataSource qbdsInventProfile_RU; ; qbdsInventTrans = q.addDataSource(tablenum(InventTrans)); qbdsInventTransPosting = qbdsInventTrans.addDataSource(tablenum(InventTransPosting)); qbdsInventTransPosting.relations(true); qbdsInventTransPosting.joinMode(joinMode::InnerJoin); qbdsInventTransPosting.fetchMode(QueryFetchMode::One2One); qbdsInventDim = qbdsInventTrans.addDataSource(tablenum(InventDim)); qbdsInventDim.relations(true); qbdsInventDim.joinMode(joinMode::InnerJoin); qbdsInventDim.fetchMode(QueryFetchMode::One2One); qbdsInventProfile_RU = qbdsInventDim.addDataSource(tablenum(InventProfile_RU)); qbdsInventProfile_RU.relations(true); qbdsInventProfile_RU.joinMode(joinMode::InnerJoin); qbdsInventProfile_RU.fetchMode(QueryFetchMode::One2One); qbdsInventTrans.orderMode(orderMode::GroupBy); qbdsInventTransPosting.orderMode(orderMode::GroupBy); qbdsInventDim.orderMode(orderMode::GroupBy); qbdsInventProfile_RU.orderMode(orderMode::GroupBy); qbdsInventTrans.addSelectionField(fieldNum(InventTrans, Qty), SelectionField::Sum); qbdsInventTrans.addSortField(fieldNum(InventTrans, ItemId)); qbdsInventTransPosting.addSortField(fieldNum(InventTransPosting, Account)); qbdsInventDim.addSortField(fieldNum(InventDim, InventLocationId)); qbdsInventProfile_RU.addSortField(fieldNum(InventProfile_RU, InventProfileType)); info(qbdsInventTrans.toString());  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			в очередной раз удивляюсь, насколько люди ленивы и любят только готовые примеры 
		
		
		
		
		
		
		
	 
		 | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Строит то как нужно на вид и по строке датасорса тоже, но вот группировать верно не хочет... 
		
		
		
		
		
		
		
		
			А именно если поставить группировки по полям таблиц InventDim и InventTransPosting одновременно Последний раз редактировалось Cardagant; 22.02.2012 в 14:46.  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Добрый день всем! 
		
		
		
		
		
		
		
	Перечитал кучу топиков про связывание таблиц в запросе. Но ответа на свой вопрос не нашел У меня есть запрос: select count(T1.RecId) from T1 exists join T2 where T2.F21 == T1.F12 exists join T3 where T3.F32 == T2.F23 exists join T4 where T4.F43 == T3.F34 notexists join T5 where T5.F51 == T1.F15 and T5.F52 != T1.F25 формирую query, связываю через addLink и fetchMode(1:1). в трассировке SQL видно что последний датасорс не подключен. Аксапта в состоянии обработать это единым запросом или я напасно стараюсь?  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			а joinmode установили?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Да, JoinMode::ExistsJoin и JoinMode::NoExistsJoin соответственно.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			условие T5.F52  != T1.F25 как задаете?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Через Range на T5.F52, и в нем текстом "T5.F52 != T1.F25". 
		
		
		
		
		
		
		
	Причем если закомментить связку Т2-Т3-Т4, то всё подключается правильно. Или если подключать к Т1 сначала Т5, то она тоже отрабатывает правильно, но всё остальное не подключается.  | 
| 
	
 | 
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Не очень дружит Query с объединениями на одном уровне, особенно, если у одной из веток есть вложенные подзапросы 
		
		
		
		
		
		
			Я бы предложил попробовать сделать на основании этой части запроса X++: select * from T1 exists join T2 where T2.F21 == T1.F12 exists join T3 where T3.F32 == T2.F23 exists join T4 where T4.F43 == T3.F34 
				__________________ 
		
		
		
		
	Axapta v.3.0 sp5 kr2  | 
| 
	
 | 
| 
			
			 | 
		#20 | 
| 
			
			 ---------------- 
		
			
	 | 
	
	
	
		
		
		
		 
			
			а я бы посоветовал все exists заменить на inner (по возможности) 
		
		
		
		
		
		
		
	в аксапте exists имеет неприятную особенность - все последующие объединения идут вложенными запросами.  | 
| 
	
 | 
| Теги | 
| fetchmode, join, query, как правильно | 
| 
	
	 | 
	
		
			 
			Похожие темы
		 | 
	||||
| Тема | Ответов | |||
| сортировка в запросе | 41 | |||
| Добавить датасорс | 1 | |||
| Условие в запросе по отбору чисел | 6 | |||
| Проблема - Две одинаковые таблицы в запросе | 0 | |||
| Сортировка в запросе "В Наличии" | 16 | |||
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
		
  |