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