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 |
|