|
16.04.2003, 12:48 | #1 |
Участник
|
Связывание источников данных в запросах
Прошу знающих людей объяснить, как происходит связывание источников данных в отчетах, то есть в чем различие между связыванием одного источника к одному источнику и одного к нескольким на последующем уровне - не работает так как нужно . Вообще какие есть ограничения при построении дерева источников данных - Ахсапта компилирует и запускает практически любую комбинацию но выбирает данные не верно. Чем управляет "таинственное" свойство источников данных FetchMode (так и не понял ни из документации ни из предыдущих сообщений в форум). Заране большое спасибо!
|
|
31.05.2010, 11:19 | #2 |
Участник
|
Может за 7 лет кто-нибудь выяснил в подробностях, какой именно "физический" смысл имеет FetchMode? Где его нужно и не нужно ставить (вид джойна, узел или лист в иерархии датасорсов)?
|
|
31.05.2010, 15:02 | #3 |
Мрачный тип
|
Если на узел вешаете несколько листов (например запрос по InventTrans c при-join'ными InventTable и InventDim) - листам надо указывать. В противном случае, система, не зная, какие отношения между таблицами существуют, при попытке добавить второй лист сбросит первый - что прекрасно видно в дебаггере при трассировке.
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
31.05.2010, 15:18 | #4 |
Участник
|
Цитата:
Сообщение от TasmanianDevil
Если на узел вешаете несколько листов (например запрос по InventTrans c при-join'ными InventTable и InventDim) - листам надо указывать. В противном случае, система, не зная, какие отношения между таблицами существуют, при попытке добавить второй лист сбросит первый - что прекрасно видно в дебаггере при трассировке.
Система, ессно, знает, какие отношения существуют между таблицами, и может по ним построить правильный запрос. Просто значение по умолчанию для FetchMode = Один ко Многим. Поэтому вместо одного запроса выполняется несколько независимых: Один - InventTrans->InventTable Второй - InventTrans->InventDim а потом все 3 курсора заполняются соответствующими данными. Поэтому в дебаггере видно, как будно один источник "отпал". Если же посмотреть, какие запросы при этом выполнит SQL, то должны увидеть оба запроса. Я все собираюсь написать блог пост tutorial с примерами, но не хватает времени. |
|
|
За это сообщение автора поблагодарили: mazzy (2), Pustik (10), Logger (2), TasmanianDevil (2), konopello (2), S.Kuskov (3), vanokh (1), Cardagant (2). |
17.04.2013, 18:34 | #5 |
Участник
|
2 kashperuk: Эта статья про FetchMode на axaptapedia находится(не нахожу там) или в каком-то другом блоге?
|
|
31.05.2010, 12:11 | #6 |
Участник
|
Все зависит от того, какой вам нужно получить запрос в результате?
Если вам нужен запрос с join, как вы бы написали в SQL, то ВСЕГДА используйте FetchMode равный One2One. Если же вам нужно другое поведение, когда данные из связанных таблиц выбираются отдельно, и у вас есть код, который завязан на смену записи в конкретных таблицах, то используйте 1ToN Мой общий совет - всегда используйте 1-To-1 |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
01.06.2010, 03:47 | #7 |
Участник
|
Ага, многое прояснилось.
Про смену записи в конкретных датасорсах я догадался Еще вопрос - допустим у нас есть запрос с несколькими Exists Join'ами. В этом случае для основного источника все они вернут по одной записи. На практике я столкнулся с тем, что основной запрос с учетом фильтра по джойнам выбирает одну запись, а next() в Query проходит аж 30 раз (Exists Join'ов присоединено 6-7 штук). Спасает One2One или контроль changed() на основном запросе. Но так и осталось загадкой почему все-таки 30 раз... |
|
17.04.2013, 22:45 | #8 |
Участник
|
К сожалению, так и не написана, в виде разных маленьких заметок у меня на диске.
|
|