|
![]() |
#1 |
Участник
|
Вот так у меня работает
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). |
![]() |
#2 |
Участник
|
Вариант, предложенный coolibin, действительно работает, спасибо.
Но тогда не выводятся уникальные ItemId, которые есть в InventTable, но которых нет в InventTrans. В моем примере это был ItemId == 0003 Можно с помощью if-оф добиться вывода нужной информации. Но, хотелось бы, чтобы сам запрос не содержал дублей. Последний раз редактировалось Silphidae; 04.12.2008 в 15:53. |
|
![]() |
#3 |
Участник
|
Ааа, так нужны уникальные...
тогда if (queryRun.changed(tableNum(InventTrans))) заменить на if (queryRun.changed(tableNum(InventTable))) |
|
![]() |
#4 |
Участник
|
Кхм...попробовал, у меня на трешке не выдает дублей никаких, и даже без 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)); } Последний раз редактировалось coolibin; 04.12.2008 в 16:09. |
|
![]() |
#5 |
Участник
|
Прошу прощения.. В моем коде был еще один 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. |
|
Теги |
join, outer join, query |
|
![]() |
||||
Тема | Ответов | |||
Несколько outer join в запросе | 2 | |||
Данные в Grid из таблиц, связанных по Outer Join | 2 | |||
2 и более OUTER JOIN к одному паренту | 21 | |||
Outer Join | 3 | |||
outer join для трех таблиц | 4 |
|