AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.06.2012, 07:15   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Как узнать, подходит ли Record к Query?
Допустим, есть у вас объект Query. И есть еще запись Record. Как красиво проверить факт того, что эта запись Record содержится в одной из записей данного Query?
Старый 08.06.2012, 08:12   #2  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Добавить в Query условие фильтрации по RecId и выполнить запрос. Если запись вернулась, то запись Record содержится в Query
Чтобы запрос выполнился ещё быстрее можно его преобразовать (убрать сортировку, группировку, выборку лишних значений) как в методе sysQuery::countPrim().

Если задачу можно свести к проверке "Попадает ли значение в фильтр Range?", то можно воспользоваться функцией Global::inRange().
За это сообщение автора поблагодарили: mazzy (5), Eldar9x (3), kornix (2).
Старый 08.06.2012, 08:12   #3  
AlexMoskvichev is offline
AlexMoskvichev
Участник
 
23 / 44 (2) +++
Регистрация: 08.11.2011
Адрес: Новосибирск
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Допустим, есть у вас объект Query. И есть еще запись Record. Как красиво проверить факт того, что эта запись Record содержится в одной из записей данного Query?
Наверное стоит уточнить, что значит в query? Т.е. может быть открытый курсор, в котором определенным запросом выбраны данные, а другой транзакцией в таблицу записана новая запись?
А если запись прочитана в одной транзакции, а в другой изменена это будет считаться той-же записью или новой? Насчет уровней изоляции ничего в условии задачи не сказано...

В качестве решения видится следующее (это мысли, на базе не пробовал).
В запросе вытаскивать максимальную дату создания (модификации).
При проверке записи проверять на соответствие условиям выборки и на то, что дата создания (модификации) не больше контрольной.
Это правда не гарантирует 100% точность, если нет уверенности что все вставки в таблицу правильно устанавливают время создания (модификации).
Старый 08.06.2012, 08:25   #4  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ещё иедя появилась. Можно превратить курсор постоянной таблицы во временный буфер методом common.setTmp(). Вставить в этот временный буфер интересующую строку. Подсунуть этот временный буфер в QueryRun при помощи метода QueryRun.SetRecord(). И выполнить запрос по временной таблице, состоящей из одной строки.

Если запрос состоит из соединения нескольких таблиц, то процедуру замены постоянного курсора на временный в общем случае нужно будет сделать для всех таблиц. Иначе можно получить ошибку Временные таблицы должны быть вложенными... Да и производительность только тогда и улучшится. Т.е. идея в том чтобы выполнить запрос не в БД а в оперативной памяти на клиенте.

To AlexMoskvichev: На сколько я понял речь о том, что Query ещё не выполнен, а только сконструирован.

Последний раз редактировалось S.Kuskov; 08.06.2012 в 08:32.
За это сообщение автора поблагодарили: Logger (2).
Старый 08.06.2012, 09:03   #5  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Допустим, есть у вас объект Query. И есть еще запись Record. Как красиво проверить факт того, что эта запись Record содержится в одной из записей данного Query?
1. Попробуйте сделать второй query, который будет копией исходного + криетрий на recId проверяемой записи;
2. Если queryRun.next() от нового query вернет запись - значит запись попадает в Query

Источник
За это сообщение автора поблагодарили: coolibin (1), S.Kuskov (1), AlexMoskvichev (1).
Старый 08.06.2012, 10:50   #6  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Спасибо!
Старый 08.06.2012, 14:47   #7  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Если походить абстрактно (т.е. нам не известен заранее ни сам Query, ни Record) то :
1) Query может состоять из более чем одного датасорса, и в нем может быть, а может и не быть датасорса по таблице, соответсвующей Record
2) В структуре Query может быть более одного датасорса по таблице соответсвующей Record

Если первый пункт можно разрешить, то при положительном втором пункте ответ на поставленный в теме вопрос становится неопределенным
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Теги
queryrun, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Calling the Query Service Blog bot DAX Blogs 0 18.02.2012 01:13
AIF: OData Query Service Blog bot DAX Blogs 0 24.08.2011 09:11
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 04.05.2009 14:05
palleagermark: Sample union query from AX 2009 Blog bot DAX Blogs 0 11.07.2008 20:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:30.