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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.12.2008, 15:05   #1  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Вопрос про Outer Join
Добрый день.
Прошу прощения за легкий вопрос..
Объявления опустим..
Пишу такой запрос:

//выбираю все ItemId из InventTable
qbDSItem = query.addDataSource(tableNum(InventTable));
qbDSItem.addSortField(fieldNum(InventTable, ItemId));
qbDSItem.orderMode(OrderMode::GroupBy);
qbDSItem.addSelectionField(fieldNum(InventTable, ItemId));

//добавляю таблицу InventTrans
qbDS = qbDSItem.addDataSource(tableNum(InventTrans));
qbDS.joinMode(JoinMode::OuterJoin);
qbDS.addLink(fieldNum(InventTable, ItemId), fieldNum(InventTrans, ItemId));
qbDS.addSortField(fieldNum(InventTrans, ItemId));
qbDS.addSelectionField(fieldNum(InventTrans, ItemId));

//вывожу результат
queryRun = new QueryRun(query);
while (queryRun.next())
{
inventTable = queryRun.get(tableNum(InventTable));
inventTrans = queryRun.get(tableNum(InventTrans));
info( strfmt( "%1 %2", inventTable.ItemId, inventTrans.ItemId));
}

Вот пример того, что выводится:
0001
0001 0001
0002
0002 0002
0003 //номера 0003 нет в TransTable
0004
0004 0004

Почему выводятся строки типа
0001
0001 0001
Вместо
0001 0001 ?
Старый 04.12.2008, 15:10   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А если попробовать добавить qbDS.fetchMode(QueryFetchMode::OneToOne) перед queryRUn?
За это сообщение автора поблагодарили: Silphidae (1).
Старый 04.12.2008, 15:16   #3  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Цитата:
Сообщение от Silphidae Посмотреть сообщение
Почему выводятся строки типа
0001
0001 0001
Вместо
0001 0001 ?
Потому что нужно добавить условие типа

if (queryRun.changed(tableNum(InventTrans))
перед info


Кстати, вот это
qbDS.addSortField(fieldNum(InventTrans, ItemId));
qbDS.addSelectionField(fieldNum(InventTrans, ItemId));
на мой взгляд лишнее, поскольку и так уже указана сортировка по этому полю выше по тексту и выбираться оно будет в любом случае, поскольку по нему связь

Последний раз редактировалось coolibin; 04.12.2008 в 15:31.
Старый 04.12.2008, 15:28   #4  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Добавление qbDS.fetchMode(QueryFetchMode::OneToOne) вызывает ошибку в запросе
"Невозможно выбрать запись в Складские операции (InventTrans). Использован оператор объединения таблиц join, но выражение WHERE не содержит связи между таблицами." Надо думать, он не может связать таблицы по полю ItemId, т.к. не всегда есть ItemId в InventTrans такой же как InventTable.
Старый 04.12.2008, 15:34   #5  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Вот так у меня работает
X++:
    qbDSItem = query.addDataSource(tableNum(InventTable));
    qbDSItem.addSortField(fieldNum(InventTable, ItemId));
    qbDSItem.orderMode(OrderMode::GroupBy);
    qbDSItem.addSelectionField(fieldNum(InventTable, ItemId));
    //добавляю таблицу InventTrans
    qbDS = qbDSItem.addDataSource(tableNum(InventTrans));
    qbDS.joinMode(JoinMode::OuterJoin);
    qbDS.addLink(fieldNum(InventTable, ItemId), fieldNum(InventTrans, ItemId));
    //вывожу результат
    queryRun = new QueryRun(query);
    while (queryRun.next())
    {
        inventTable = queryRun.get(tableNum(InventTable));
        inventTrans = queryRun.get(tableNum(InventTrans));
        if (queryRun.changed(tableNum(InventTrans)))
        {
            info( strfmt( "%1 %2", inventTable.ItemId, inventTrans.ItemId));
        }
    }
За это сообщение автора поблагодарили: evv (1), Silphidae (1).
Старый 04.12.2008, 15:42   #6  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Вариант, предложенный coolibin, действительно работает, спасибо.
Но тогда не выводятся уникальные ItemId, которые есть в InventTable, но которых нет в InventTrans. В моем примере это был ItemId == 0003

Можно с помощью if-оф добиться вывода нужной информации. Но, хотелось бы, чтобы сам запрос не содержал дублей.

Последний раз редактировалось Silphidae; 04.12.2008 в 15:53.
Старый 04.12.2008, 15:53   #7  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Ааа, так нужны уникальные...
тогда if (queryRun.changed(tableNum(InventTrans))) заменить на
if (queryRun.changed(tableNum(InventTable)))
Старый 04.12.2008, 16:04   #8  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Кхм...попробовал, у меня на трешке не выдает дублей никаких, и даже без changed()
X++:
    qbDSItem = query.addDataSource(tableNum(InventTable));
    qbDSItem.addSortField(fieldNum(InventTable, ItemId));
    qbDSItem.orderMode(OrderMode::GroupBy);
    qbDSItem.addSelectionField(fieldNum(InventTable, ItemId));
    //добавляю таблицу InventTrans
    qbDS = qbDSItem.addDataSource(tableNum(InventTrans));
    qbDS.joinMode(JoinMode::OuterJoin);
    qbDS.addLink(fieldNum(InventTable, ItemId), fieldNum(InventTrans, ItemId));
    qbDS.addSortField(fieldNum(InventTrans, ItemId));
    qbDS.orderMode(OrderMode::GroupBy);
    //вывожу результат
    queryRun = new QueryRun(query);
    while (queryRun.next())
    {
        inventTable = queryRun.get(tableNum(InventTable));
        inventTrans = queryRun.get(tableNum(InventTrans));
        //if (queryRun.changed(tablenum(InventTable)))
            info( strfmt( "%1 %2", inventTable.ItemId, inventTrans.ItemId));
    }
добавил qbDS.orderMode(OrderMode::GroupBy);

Последний раз редактировалось coolibin; 04.12.2008 в 16:09.
Старый 04.12.2008, 16:09   #9  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Прошу прощения.. В моем коде был еще один Inner Join перед Outer, когда я его убрал, дубли исчезли.

Хех. В связи с этим возник вопрос.. Как с этим бороться, ибо Inner Join мне нужен.

Модель датасорса выглядит так:
qbDSItem по InventTable
qbDSChild по InventItemGroup связь с Inner Join qbDSItem по полю InventGroupId
qbDS по InventTrans связь с Outer Join qbDSItem по полю ItemId

Может, я неправильно строю соединения?

Последний раз редактировалось Silphidae; 04.12.2008 в 16:23.
Старый 04.12.2008, 16:25   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
fetchMode указывайте, как я советывал выше
Старый 05.12.2008, 14:01   #11  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
В тему про запросы..
Пишу датасорс qbDSItem к нему по Inner Join добавляю qbDSChild, затем по Outer Join добавляю qbDS. Вывожу запрос в info(qbDSItem.toString())..
Никакого Outer Joina там нет!!!

Если к qbDSItem по Outer Join сразу добавлять qbDS (без qbDSChild), то в инфо выводится запрос с Outer Join.

Я чего-то не понимаю.. Помогите, пожалуйста.
Старый 05.12.2008, 14:07   #12  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Примеры хоть кода приведите
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 05.12.2008, 15:11   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Silphidae Посмотреть сообщение
В тему про запросы..
Пишу датасорс qbDSItem к нему по Inner Join добавляю qbDSChild, затем по Outer Join добавляю qbDS. Вывожу запрос в info(qbDSItem.toString())..
Никакого Outer Joina там нет!!!

Если к qbDSItem по Outer Join сразу добавлять qbDS (без qbDSChild), то в инфо выводится запрос с Outer Join.

Я чего-то не понимаю.. Помогите, пожалуйста.
Обсуждалось Еще раз про Outer join
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: Silphidae (1).
Старый 05.12.2008, 16:28   #14  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Спасибо за ответы.
Теги
join, outer join, query

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Несколько outer join в запросе _scorp_ DAX: Программирование 2 11.04.2008 10:56
Данные в Grid из таблиц, связанных по Outer Join cherv DAX: Программирование 2 17.02.2007 01:36
2 и более OUTER JOIN к одному паренту Ronin DAX: Программирование 21 19.12.2005 13:42
Outer Join Anais DAX: Программирование 3 20.05.2005 12:10
outer join для трех таблиц r25 DAX: Программирование 4 29.04.2004 15:42

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

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

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