|  13.02.2012, 18:36 | #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. | 
|  | 
|  13.02.2012, 19:47 | #2 | 
| Участник | 
			
			Вообще-то, прежде чем задавать вопрос, попробуйте воспользоваться поиском. Возможно, подобные вопросы уже обсуждались   Join трех таблиц (две к одной) или "посвежее" QueryRun и два Join'а 
				__________________ - Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... | 
|  | |
| За это сообщение автора поблагодарили: Cardagant (1). | |
|  13.02.2012, 21:20 | #3 | 
| Участник | Цитата: 
		
			Сообщение от Владимир Максимов
			   Вообще-то, прежде чем задавать вопрос, попробуйте воспользоваться поиском. Возможно, подобные вопросы уже обсуждались   Join трех таблиц (две к одной) или "посвежее" QueryRun и два Join'а | 
|  | 
|  15.02.2012, 17:04 | #4 | 
| Участник | Цитата: 
		
			Сообщение от Владимир Максимов
			   Вообще-то, прежде чем задавать вопрос, попробуйте воспользоваться поиском. Возможно, подобные вопросы уже обсуждались   Join трех таблиц (две к одной) или "посвежее" QueryRun и два Join'а Выборка происходит корректно, однако нет возможности сгруппировать по полям из дочерних таблиц. Выдаёт сообщение "Заданная последовательность полей Group By и Order By не поддерживается." Как это можно преодолеть? Спасибо. | 
|  | 
|  16.02.2012, 10:43 | #5 | 
| Участник | 
			
			При Exists Join делать группировку или сортировку по подчиненной таблице - бессмысленно. Извините, конечно, но Вы в курсе чем Exists отличается от Inner Join?  Заменять одно на другое можно только если задача это допускает. Причем, как правило, как раз наоброт, использование Exists Join в Axapta, по возможности, следует избегать. Если задача позволяет, лучше использовать Inner Join Приведите полный запрос, который Вы хотите получить. Просто команду Select напишите. 
				__________________ - Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... | 
|  | 
|  16.02.2012, 10:49 | #6 | 
| Участник | 
			
			измените на innerJoin и для каждого датасорса напишите:  X++: qbds.fetchMode(QueryFetchMode::One2One); | 
|  | 
|  17.02.2012, 11:23 | #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. | 
|  | 
|  17.02.2012, 12:28 | #8 | 
| Участник | 
			
			Это работающий код? Не вижу где джойнится INVENTSETTLEMENT. Предлагаю вам этот сложный неработающий запрос начать последовательно упрощать. И представить здесь максимально простую неработающую версию. Ведь количество выбираемых полей и условий не влияет на работоспособность запроса. Всё зависит от последовательности соединений. Составьте тестовый пример неработающего соединения, который не будет содержать кучу отвлекающей информации. Последний раз редактировалось S.Kuskov; 17.02.2012 в 12:39. | 
|  | 
|  17.02.2012, 12:52 | #9 | 
| Участник | Цитата: 
		
			Сообщение от S.Kuskov
			   Это работающий код? Не вижу где джойнится INVENTSETTLEMENT. Предлагаю вам этот сложный неработающий запрос начать последовательно упрощать. И представить здесь максимально простую неработающую версию. Ведь количество выбираемых полей и условий не влияет на работоспособность запроса. Всё зависит от последовательности соединений. Составьте тестовый пример неработающего соединения, который не будет содержать кучу отвлекающей информации. Не получается стандартным QueryaddDataSource прицепить одновременно InventDim и InventTransPosting. Подскажите пожалуйста варианты выхода из ситуации кроме получения выборки через ResultSet Последний раз редактировалось Cardagant; 17.02.2012 в 12:55. | 
|  | 
|  17.02.2012, 13:18 | #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). | |
|  17.02.2012, 13:30 | #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()); | 
|  | 
|  17.02.2012, 16:09 | #12 | 
| Участник | 
			
			в очередной раз удивляюсь, насколько люди ленивы и любят только готовые примеры   | 
|  | 
|  22.02.2012, 14:42 | #13 | 
| Участник | 
			
			Строит то как нужно на вид и по строке датасорса тоже, но вот группировать верно не хочет... А именно если поставить группировки по полям таблиц InventDim и InventTransPosting одновременно Последний раз редактировалось Cardagant; 22.02.2012 в 14:46. | 
|  | 
|  10.10.2012, 14:49 | #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 видно что последний датасорс не подключен. Аксапта в состоянии обработать это единым запросом или я напасно стараюсь? | 
|  | 
|  10.10.2012, 14:52 | #15 | 
| Участник | 
			
			а joinmode установили?
		 | 
|  | 
|  10.10.2012, 14:59 | #16 | 
| Участник | 
			
			Да, JoinMode::ExistsJoin и JoinMode::NoExistsJoin соответственно.
		 | 
|  | 
|  10.10.2012, 16:01 | #17 | 
| Участник | 
			
			условие T5.F52  != T1.F25 как задаете?
		 | 
|  | 
|  11.10.2012, 11:08 | #18 | 
| Участник | 
			
			Через Range на T5.F52, и в нем текстом "T5.F52 != T1.F25". Причем если закомментить связку Т2-Т3-Т4, то всё подключается правильно. Или если подключать к Т1 сначала Т5, то она тоже отрабатывает правильно, но всё остальное не подключается. | 
|  | 
|  11.10.2012, 11:31 | #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 | 
|  | 
|  11.10.2012, 11:41 | #20 | 
| ---------------- | 
			
			а я бы посоветовал все exists заменить на inner (по возможности) в аксапте exists имеет неприятную особенность - все последующие объединения идут вложенными запросами. | 
|  | 
| Теги | 
| fetchmode, join, query, как правильно | 
|  | 
|  Похожие темы | ||||
| Тема | Ответов | |||
| сортировка в запросе | 41 | |||
| Добавить датасорс | 1 | |||
| Условие в запросе по отбору чисел | 6 | |||
| Проблема - Две одинаковые таблицы в запросе | 0 | |||
| Сортировка в запросе "В Наличии" | 16 | |||
| 
 |