07.10.2005, 17:20 | #1 |
Участник
|
research и executeQuery
Кто нибудь может внятно обьяснить различие?
копию девгайда прошу не выкладывать, читал не помогает =( |
|
07.10.2005, 17:24 | #2 |
Гость
|
research - обновляет данные по СУЩЕСТВУЮЩИМ в дс строкам
executeQuery - и по существующим, и ВНОВЬ ДОБАВЛЕННЫМ - УДАЛЕННЫМ другими пользователями __________________ sassas as pas |
|
07.10.2005, 17:29 | #3 |
Banned
|
Цитата:
Изначально опубликовано pas
research - обновляет данные по СУЩЕСТВУЮЩИМ в дс строкам executeQuery - и по существующим, и ВНОВЬ ДОБАВЛЕННЫМ - УДАЛЕННЫМ другими пользователями |
|
07.10.2005, 17:32 | #4 |
Участник
|
research() - выполняет запрос находящийся в QueryRun(). Т.е. если добавить условия фильтрации, SortOrder и т.д. в *_ds.Query() после того, как запрос был открыт на выполнение, то он пойдет на сервер в неизменном виде.
Соответственно executeQuery() строит запрос заново с новыми условиями
__________________
Axapta v.3.0 sp5 kr2 |
|
07.10.2005, 17:38 | #5 |
Гость
|
ups...
т.е. рисерч не учитывает программно наложенные фильтры-сортировки, а экзекьют - учитывает? |
|
07.10.2005, 17:44 | #6 |
Участник
|
Не учитывает на *_ds.Query(). Но можно наложить на *_ds.QueryRun().Query()
__________________
Axapta v.3.0 sp5 kr2 |
|
07.10.2005, 17:53 | #7 |
Гость
|
2 EVGL & AndyD
а как часто пользуетесь рисерчем? отосительно экзекьюта. В процентах или соотношение. |
|
07.10.2005, 17:57 | #8 |
Banned
|
90% - research(). Не проверял, но это должно быть быстрее - раз, и не убивает фильтры, наложенные пользователем - два. Однако в формах типа из CRM, где по верху идут поля для фильтрации, целесообразнее по ряду причин использовать executeQuery().
|
|
07.10.2005, 18:01 | #9 |
Участник
|
Кстати, прикладное использование research() - наложение фильтра на QueryRun(). При этом становится активной кнопка отмены фильтрации и будет восстановлен оригинальный запрос, хранящийся в Query().
__________________
Axapta v.3.0 sp5 kr2 |
|
07.10.2005, 18:01 | #10 |
Гость
|
а быстрее почему? вроде, дополнительные ограничения ускоряют выборку. Если они на сервере применяются...
|
|
07.10.2005, 18:07 | #11 |
Banned
|
Цитата:
Изначально опубликовано pas
а быстрее почему? вроде, дополнительные ограничения ускоряют выборку. Если они на сервере применяются... |
|
07.10.2005, 18:17 | #12 |
Участник
|
что самое странное, что если перекрыть executeQuery, то оно будет вызываться из research при этом не убивая запрос.
Получается, что у FormDataSource есть два метода executeQuery: один из них мы можем вызвать а другой перекрыть |
|
07.10.2005, 18:58 | #13 |
Участник
|
Я думаю, что research() устанавливает какой-то внутренний флаг объекта FormDataSource и после этого вызывает executeQuery(). Так что никаких раздвоений методов не требуется
__________________
Axapta v.3.0 sp5 kr2 |
|
24.06.2015, 14:40 | #14 |
Участник
|
Цитата:
Проблема в том, что независимо от того, что мы дернули в коде - executeQuery или research - все равно в итоге ядро вызовет executeQuery. Но при этом вызов super() в методе executequery поведет себя по разному - в случае когда цепочка вызовов началась с executeQuery - создаст новый SysQueryRun на основе _ds.Query(), а в случае когда все началось с research - просто использует уже существующий _ds.QueryRun() Непонятно как код написанный на датасорсе внутри executeQuery сможет понять - пришел вызов из research() или нет. Можно в принципе анализировать стек вызовов и это будет работать, но это какой-то хакерский способ. Должно быть более "правильное" решение. |
|
24.06.2015, 14:47 | #15 |
Участник
|
Другой вариант - взводить свой собственный флаг при вызове research() )
Или речь о какой-то универсальной штучке?
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Logger (1). |
24.06.2015, 14:53 | #16 |
Участник
|
Ну да, я думал может быть можно без дополнительного кодирования понять, откуда идет вызов. Ведь ядро это понимает. Значит есть какой-то флаг. Может быть он выведен в какой нить метод доступный из X++
Проблема в том что правлю модификацию которая при вызове executeQuery сбрасывает ряд кешей/доп выборок зависящих от фильтра. Поэтому, для случая research хотелось бы это пропустить, без каких-либо костылей. |
|
24.06.2015, 14:54 | #17 |
Участник
|
Вот здесь Иван Кашперук хорошо, по-моему, изложил назначение этих методов.
__________________
С уважением, Александр. |
|
|
За это сообщение автора поблагодарили: Logger (1). |
24.06.2015, 15:05 | #18 |
Участник
|
Цитата:
Сообщение от samolalex
Вот здесь Иван Кашперук хорошо, по-моему, изложил назначение этих методов.
Вот тут Kashperuk Ivan: Tutorial: refresh, reread, research, executeQuery - which one to use? еще обсуждение было. Но там нет ответа на мой вопрос. |
|
Теги |
executequery, query, research, как правильно |
|
|