Помогите с уточняемым ADO.Recordset в MDB (+)

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Помогите с уточняемым ADO.Recordset в MDB (+)

Сообщение Kundor » 13.05.2004 (Чт) 15:23

Есть такая задача: открываю набор так
recordset.open sqltext
к примеру получаю 100 записей. Затем надо при изменении критериев выбирать уже из этих записей, набор должен стать ещё меньше,потом возможно опять выбирать меньше и так далее.. Как это сделать получше? Никак не могу найти инфу по выборке из уже существующего recordset...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 13.05.2004 (Чт) 16:34

Можешь попробывать фильтровать свой рекодсет. Например, выбрать все значения, где в поле Field1 значения заканчиваются на строку money:
rs.Filter ="Field1 Like '%money'"

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Сообщение Kundor » 14.05.2004 (Пт) 12:32

Спасибо, как вариант я над этим думал, конечно.. но не хотелось бы не отходить от sql-формата запроса - дело в том, что первый запрос собирается именно по нему, а в Filter я так понимаю немного иной синтаксис... мне прийдётся вести две процедуры сборки запроса... 8(
Точно нельзя как-нибудь сделать через sql-запрос?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.05.2004 (Пт) 12:49

Код: Выделить всё
Set rs = OpenRecordset("...")
...
rs.Filter = ...
Set rs = rs.OpenRecordset
...
rs.Filter = ...
Set rs = rs.OpenRecordset
...


Но лучше через SQL.
Т.е. у тебя есть такая переменная:
SQLTemplate = "select * from table where {WHERE} order by 1"
И при запросе ты выполняешь приблизительно такой код:
Код: Выделить всё
Dim C() As String
ReDim C(1 To 5)
C(1) = "Name Like 'A%'"
C(2) = "Type = 2"
...
SQL = vbNullString
For I = 1 To 5
  If I > 1 Then SQL = SQL & " AND "
  SQL = SQL & "(" & C(I) & ")"
Next I
SQL = Replace(SQLTemplate, "{WHERE}", SQL)
Set rs = OpenRecordset(SQL)
Lasciate ogni speranza, voi ch'entrate.

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Сообщение Kundor » 17.05.2004 (Пн) 14:01

По второму варианту (которые вроде как и нужен): насколько я понял код - исполнение Set rs = OpenRecordset(SQL) будет делать выборку опять же из базы данных, а не из предыдущего набора. А как сделать что б каждая выборка записей происходила из предыдущего рекордсета (кроме первого канечно) ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.05.2004 (Вт) 11:39

Ну да, запрос будет каждый раз выполняться из всей таблицы. А какая тебе разница, если результат будет одинаков? В быстродействии ты не выиграешь (если запрос отрабатывает на реальной СУБД, а не на чем-то вроде mdb-бащы).

Использовать рекордсеты в запросах можно, этим ведает провайдер ADO Shape, но детали зарыты глубоко в недрах MSDN. Я сейчас поискал и найти не удалось, но пример использования рекордсета в запросе я встречал.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 18.05.2004 (Вт) 12:42

Да, в случае с шейпом это действительно запросто, но это уже совсем другая песня - не последовательное уточнение, а отношение Предок\Потомок.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.05.2004 (Пт) 11:28

Если надо фильтровать данные уже отобранные статическим Recordset-ом то по возможности надо пользоваться имеенно свойством Filter ибо при этом вся выборка делается на локальной машине - не напрягаем этой ерундой сервер и сеть.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

XATTAB
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 08.05.2004 (Сб) 23:48
Откуда: Russia,Saint-Peterburg

Сообщение XATTAB » 02.06.2004 (Ср) 1:36

Лучше всего использовать SQL так удобнее. Для поиска в найденном
просто предыдущиму фильтру добавлять новый, например:
Код: Выделить всё
sSQLQuery="SELECT * FROM Table WHERE Field _
LIKE '%anything%' AND '%anything1%' and '%Anytheng2%'

Просто объединяещь оператором AND все что ищещь. :twisted: :oops: :arrow:
Кто не был на марсе, тот много потерял!!!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList