AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.02.2012, 18:36   #1  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Не цепляется второй дочерний датасорс в запросе
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));

    // Дальнейший код
Есть вот такой код. Создаю запрос, в который добавляю Датасорс InventTrans.
(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  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вообще-то, прежде чем задавать вопрос, попробуйте воспользоваться поиском. Возможно, подобные вопросы уже обсуждались

Join трех таблиц (две к одной)

или "посвежее"

QueryRun и два Join'а
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Cardagant (1).
Старый 13.02.2012, 21:20   #3  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Вообще-то, прежде чем задавать вопрос, попробуйте воспользоваться поиском. Возможно, подобные вопросы уже обсуждались

Join трех таблиц (две к одной)

или "посвежее"

QueryRun и два Join'а
Спасибо Вам за Ваш ответ!
Старый 15.02.2012, 17:04   #4  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Вообще-то, прежде чем задавать вопрос, попробуйте воспользоваться поиском. Возможно, подобные вопросы уже обсуждались

Join трех таблиц (две к одной)

или "посвежее"

QueryRun и два Join'а
Попробовал сделать так, как рекомендуют в указазнных вами темах, а именно связал таблицы посредством 1:1 и joinMode::ExistsJoin

Выборка происходит корректно, однако нет возможности сгруппировать по полям из дочерних таблиц. Выдаёт сообщение "Заданная последовательность полей Group By и Order By не поддерживается."
Как это можно преодолеть? Спасибо.
Старый 16.02.2012, 10:43   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
При Exists Join делать группировку или сортировку по подчиненной таблице - бессмысленно. Извините, конечно, но Вы в курсе чем Exists отличается от Inner Join?

Заменять одно на другое можно только если задача это допускает. Причем, как правило, как раз наоброт, использование Exists Join в Axapta, по возможности, следует избегать. Если задача позволяет, лучше использовать Inner Join

Приведите полный запрос, который Вы хотите получить. Просто команду Select напишите.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 16.02.2012, 10:49   #6  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,733 / 406 (17) +++++++
Регистрация: 23.03.2006
измените на innerJoin и для каждого датасорса напишите:
X++:
qbds.fetchMode(QueryFetchMode::One2One);
Старый 17.02.2012, 11:23   #7  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
При Exists Join делать группировку или сортировку по подчиненной таблице - бессмысленно. Извините, конечно, но Вы в курсе чем Exists отличается от Inner Join?

Заменять одно на другое можно только если задача это допускает. Причем, как правило, как раз наоброт, использование Exists Join в Axapta, по возможности, следует избегать. Если задача позволяет, лучше использовать Inner Join

Приведите полный запрос, который Вы хотите получить. Просто команду Select напишите.
select /*SUM (INVENTTRANS.QTY) as qty,*/
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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Это работающий код? Не вижу где джойнится INVENTSETTLEMENT.

Предлагаю вам этот сложный неработающий запрос начать последовательно упрощать. И представить здесь максимально простую неработающую версию. Ведь количество выбираемых полей и условий не влияет на работоспособность запроса. Всё зависит от последовательности соединений. Составьте тестовый пример неработающего соединения, который не будет содержать кучу отвлекающей информации.

Последний раз редактировалось S.Kuskov; 17.02.2012 в 12:39.
Старый 17.02.2012, 12:52   #9  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Это работающий код? Не вижу где джойнится INVENTSETTLEMENT.

Предлагаю вам этот сложный неработающий запрос начать последовательно упрощать. И представить здесь максимально простую неработающую версию. Ведь количество выбираемых полей и условий не влияет на работоспособность запроса. Всё зависит от последовательности соединений. Составьте тестовый пример неработающего соединения, который не будет содержать кучу отвлекающей информации.
Да, это работающий запрос, уже подредактировал, прошу прощения, INVENTSETTLEMENT там не должно коннектиться.
Не получается стандартным QueryaddDataSource прицепить одновременно InventDim и InventTransPosting.
Подскажите пожалуйста варианты выхода из ситуации кроме получения выборки через ResultSet

Последний раз редактировалось Cardagant; 17.02.2012 в 12:55.
Старый 17.02.2012, 13:18   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Так?
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  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от 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  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,733 / 406 (17) +++++++
Регистрация: 23.03.2006
в очередной раз удивляюсь, насколько люди ленивы и любят только готовые примеры
Старый 22.02.2012, 14:42   #13  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Вот это уже интересно. Строит как нужно. Спасибо Вам за Ваш ответ.
Строит то как нужно на вид и по строке датасорса тоже, но вот группировать верно не хочет...

А именно если поставить группировки по полям таблиц InventDim и InventTransPosting одновременно

Последний раз редактировалось Cardagant; 22.02.2012 в 14:46.
Старый 10.10.2012, 14:49   #14  
andrmax is offline
andrmax
Участник
 
7 / 10 (1) +
Регистрация: 30.03.2011
Добрый день всем!
Перечитал кучу топиков про связывание таблиц в запросе. Но ответа на свой вопрос не нашел
У меня есть запрос:
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  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,733 / 406 (17) +++++++
Регистрация: 23.03.2006
а joinmode установили?
Старый 10.10.2012, 14:59   #16  
andrmax is offline
andrmax
Участник
 
7 / 10 (1) +
Регистрация: 30.03.2011
Да, JoinMode::ExistsJoin и JoinMode::NoExistsJoin соответственно.
Старый 10.10.2012, 16:01   #17  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,733 / 406 (17) +++++++
Регистрация: 23.03.2006
условие T5.F52 != T1.F25 как задаете?
Старый 11.10.2012, 11:08   #18  
andrmax is offline
andrmax
Участник
 
7 / 10 (1) +
Регистрация: 30.03.2011
Через Range на T5.F52, и в нем текстом "T5.F52 != T1.F25".
Причем если закомментить связку Т2-Т3-Т4, то всё подключается правильно.
Или если подключать к Т1 сначала Т5, то она тоже отрабатывает правильно, но всё остальное не подключается.
Старый 11.10.2012, 11:31   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Не очень дружит 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
вьюху и уже ее испльзовать в основном запросе вместе с таблицей T5
__________________
Axapta v.3.0 sp5 kr2
Старый 11.10.2012, 11:41   #20  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
а я бы посоветовал все exists заменить на inner (по возможности)
в аксапте exists имеет неприятную особенность - все последующие объединения идут вложенными запросами.
Теги
fetchmode, join, query, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
сортировка в запросе V777 DAX: Программирование 41 25.04.2008 12:47
Добавить датасорс Eldar9x DAX: Программирование 1 01.10.2007 16:21
Условие в запросе по отбору чисел cherv DAX: Программирование 6 05.07.2006 14:11
Проблема - Две одинаковые таблицы в запросе NAST DAX: Программирование 0 13.10.2005 08:51
Сортировка в запросе "В Наличии" linney DAX: Программирование 16 20.01.2005 20:01
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:00.