30.06.2008, 14:32 | #1 |
MCTS
|
InnerJoin в подчиненом датасорсе на форме
Создадим например две таблицы. Одна шапка HeaderTable, другая - строки LinesTable. В LinesTable делаем релейшен на шапку по ключевому полю. Поле создано на EDT, у которого нет релейшенов. Теперь создадим форму, на первой вкладке грид с датасорсом HeaderTable, на второй вкладке - грид с дататорсом LinesTable. Ставим для LinesTable_DS joinSource HeaderTable и linkType = InnerJoin. Получаем шикарный глюк, в виде отображения шапке стольки одинаковых строк, сколько их в строках подчиненной таблицы. Нафига тогда тип innerJoin и как заставить его работать правильно?
Последний раз редактировалось Eldar9x; 30.06.2008 в 14:36. |
|
30.06.2008, 14:38 | #2 |
MCTS
|
Цитата:
Нафига тогда тип innerJoin и как заставить его работать правильно?
Предназначен он для отображения ваших двух таблиц в одном гриде.
__________________
С уважением, Павел Цераниди. На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага. |
|
30.06.2008, 14:41 | #3 |
Участник
|
а что ты ожидал увидеть?
|
|
30.06.2008, 14:41 | #4 |
Участник
|
Цитата:
А вот чтобы отображать строки отдельным гридом от заголовков, обычно тип связи используется Delayed. |
|
30.06.2008, 14:43 | #5 |
Axapta
|
Цитата:
Passive
Linked child data sources are not updated automatically. Updates of the child data source must be programmed on the active() method of the master data source. Delayed A pause is inserted before linked child data sources are updated. This allows for faster navigation in the parent data source since the records from child data sources are not updated immediately. For example, the user could be scrolling past several orders without immediately seeing the order lines for each one. Active The child data source is updated immediately when a new record in the parent data source is selected. Notice that continuous updates are resource-consuming. InnerJoin Selects records from the main table that have matching records in the joined table – and vice versa. In other words, you get one record for each match and records without related records are eliminated from the result. OuterJoin Selects records from the main table whether or not they have matching records in the joined table. ExistJoin Selects a record from the main table for each matching record in the joined table. The difference between InnerJoin and ExistJoin: When the join type is ExistJoin, no more potentially matching records are searched for once the first match has been found. When the join type is InnerJoin, all matching records are searched for. NotExistJoin Select records from the main table that do not have a match in the joined table. |
|
30.06.2008, 14:46 | #6 |
MCTS
|
Ожидалось, что все будет также как и при обычном джойне, но накладывая рандже на подчиненную таблицу будут фильтроваться и записи в шапке. То есть как работает кодовый select c innerJoin.
X++: . Вообще гояоря пытался таким образом решить следующую задачу: На форме есть stringEdit, в который вводится некое значение по полю из строк (LinesTable), по этому значению фильтруются строки, но те строки в шапке, которые не содержат таких строк в строках, не должны отображаться... Последний раз редактировалось Eldar9x; 30.06.2008 в 14:49. |
|
30.06.2008, 14:47 | #7 |
Axapta
|
|
|
30.06.2008, 14:51 | #8 |
MCTS
|
А теперь понял, innerJoin возвращает несколько строк шапки - все правильно. Можно на форме в шапке отображать только одну из этих записей?
|
|
30.06.2008, 14:57 | #9 |
MCTS
|
Цитата:
Можно на форме в шапке отображать только одну из этих записей?
Может лучше опишите исходную проблему.
__________________
С уважением, Павел Цераниди. На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага. |
|
30.06.2008, 15:04 | #10 |
MCTS
|
Есть шапка, к шапке привязаны строки. Мы накладываем фильтр на строки. На вкладке Обзор (то есть в шапке) нужно отобразить только те записи, которые удовлетворяют условию фильтра. Допустим:
Шапка Строки УП_1 УП_1 Сотр_1 УП_1 Сотр_2 УП_1 Сотр_3 УП_2 УП_2 Сотр_2 УП_2 Сотр_3 УП_2 Сотр_4 УП_3 УП_3 Сотр_3 УП_3 Сотр_4 Введем в поле фильтра Сотр_4 В шапке должны остаться только УП_2 и УП_3. В строках для каждой из этих шапок, должны отобразиться только Сотр_4. |
|
30.06.2008, 15:18 | #11 |
Moderator
|
Немного саморекламы в тему
Ограничить вывод записей master таблицы, наложением фильтра на detail таблицу Как не выводить заголовки в форме, если нет строк?
__________________
Андрей. |
|
|
За это сообщение автора поблагодарили: Eldar9x (1). |
30.06.2008, 16:12 | #12 |
Участник
|
Просто использовать Exists Join - это решение вашей задачи. То есть добавить надо еще один источник - такой же, как для строк, и на него накладывать фильтр уже
|
|
01.07.2008, 13:03 | #13 |
MCTS
|
Спасибо, заработало! Еще хотелось бы понять, какой тип связи используется в первых трех случаях (Passive, Delayed и Active)? Почему они объединены в одну группу, было бы логичнее, если они лежали в разных группах....
|
|
01.07.2008, 13:08 | #14 |
Участник
|
В этих 3 случаях связи вообще нету.
В смысле, что вместо объединения таблиц в подчиненной (строках) просто добавляется фильтр по значению определенного поля шапки. Но при этом выборка идет только по одной таблице В режиме Passive вообще ничего не происходит со строками - вручную надо их обновлять. Но это и так уже описано в сообщение Олега выше |
|
01.07.2008, 13:26 | #15 |
MCTS
|
Буду знать, спасибо.
|
|