08.06.2012, 07:15 | #1 |
MCTS
|
Как узнать, подходит ли Record к Query?
Допустим, есть у вас объект Query. И есть еще запись Record. Как красиво проверить факт того, что эта запись Record содержится в одной из записей данного Query?
|
|
08.06.2012, 08:12 | #2 |
Участник
|
Добавить в Query условие фильтрации по RecId и выполнить запрос. Если запись вернулась, то запись Record содержится в Query
Чтобы запрос выполнился ещё быстрее можно его преобразовать (убрать сортировку, группировку, выборку лишних значений) как в методе sysQuery::countPrim(). Если задачу можно свести к проверке "Попадает ли значение в фильтр Range?", то можно воспользоваться функцией Global::inRange(). |
|
|
За это сообщение автора поблагодарили: mazzy (5), Eldar9x (3), kornix (2). |
08.06.2012, 08:12 | #3 |
Участник
|
Цитата:
А если запись прочитана в одной транзакции, а в другой изменена это будет считаться той-же записью или новой? Насчет уровней изоляции ничего в условии задачи не сказано... В качестве решения видится следующее (это мысли, на базе не пробовал). В запросе вытаскивать максимальную дату создания (модификации). При проверке записи проверять на соответствие условиям выборки и на то, что дата создания (модификации) не больше контрольной. Это правда не гарантирует 100% точность, если нет уверенности что все вставки в таблицу правильно устанавливают время создания (модификации). |
|
08.06.2012, 08:25 | #4 |
Участник
|
Ещё иедя появилась. Можно превратить курсор постоянной таблицы во временный буфер методом common.setTmp(). Вставить в этот временный буфер интересующую строку. Подсунуть этот временный буфер в QueryRun при помощи метода QueryRun.SetRecord(). И выполнить запрос по временной таблице, состоящей из одной строки.
Если запрос состоит из соединения нескольких таблиц, то процедуру замены постоянного курсора на временный в общем случае нужно будет сделать для всех таблиц. Иначе можно получить ошибку Временные таблицы должны быть вложенными... Да и производительность только тогда и улучшится. Т.е. идея в том чтобы выполнить запрос не в БД а в оперативной памяти на клиенте. To AlexMoskvichev: На сколько я понял речь о том, что Query ещё не выполнен, а только сконструирован. Последний раз редактировалось S.Kuskov; 08.06.2012 в 08:32. |
|
|
За это сообщение автора поблагодарили: Logger (2). |
08.06.2012, 09:03 | #5 |
MCP
|
Цитата:
2. Если queryRun.next() от нового query вернет запись - значит запись попадает в Query Источник |
|
|
За это сообщение автора поблагодарили: coolibin (1), S.Kuskov (1), AlexMoskvichev (1). |
08.06.2012, 10:50 | #6 |
MCTS
|
Спасибо!
|
|
08.06.2012, 14:47 | #7 |
Мрачный тип
|
Если походить абстрактно (т.е. нам не известен заранее ни сам Query, ни Record) то :
1) Query может состоять из более чем одного датасорса, и в нем может быть, а может и не быть датасорса по таблице, соответсвующей Record 2) В структуре Query может быть более одного датасорса по таблице соответсвующей Record Если первый пункт можно разрешить, то при положительном втором пункте ответ на поставленный в теме вопрос становится неопределенным
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|