|  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, как правильно | 
|  | 
| 
 |