Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ADO Как открыть один рекордсет на основе другого / 24 сообщений из 24, страница 1 из 1
02.12.2004, 18:02:21
    #32810432
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
сабж

пишу следующий код
Код: plaintext
1.
2.
3.
4.
5.
   rs.Open sSQL, cnn
   rs.Filter = ...
   Set nrs = New ADODB.Recordset
   nrs.Open rs, cnn
   nrs.Sort = ...

так вот, после сортировки получается что nrs содержит теже данные что и rs, тоесть фильтр отработал на rs, но при открытии nrs в нем находятся все равно все данные, без учета установленного фильтра

как победить?
...
Рейтинг: 0 / 0
02.12.2004, 18:17:10
    #32810483
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
Код: plaintext
1.
set nrs = rs.clone ' или nrs.open rs
nrs.filter=rs.filter
Или я не правильно понял в чем проблема?
...
Рейтинг: 0 / 0
02.12.2004, 18:20:40
    #32810493
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
проблема в том чтобы открыть новый рекорсет на основе имеющегося, но новый должен содержать только те данные которые возвращает первый рекордсет в режиме фильтра

rs(в режиме фильтра) = nrs(без фильтра)
...
Рейтинг: 0 / 0
02.12.2004, 18:30:16
    #32810523
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
могу объяснить зачем это надо

дело в том что фильтр сложный и задать его строкой нельзя, поэтому фильтр задается на основе массива букмаков, но после того как происходить сортировка фильтр отваливается, что и логично, так как после сортировки букмаки соответственно портятся
...
Рейтинг: 0 / 0
03.12.2004, 11:40:47
    #32811373
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
Неужели нет такой возможности, или никто ничего не знает

возникает тогда закономерный вопрос:
чем отличается
nrs.Open rs, cnn
от
Set nrs = rs.Clone

получается что ничем
и тогда возникает другой закономерный вопрос:
а какого хрена?
...
Рейтинг: 0 / 0
03.12.2004, 13:08:58
    #32811698
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
почти всегда можно не букмарки в список составлять а значения ключевого поля таблицы.

когда нужно открыть фильтрованный рекордсет
SQL = " select ... where id in (" & списокИД & ")"


по крайней мере я делаю так.
...
Рейтинг: 0 / 0
03.12.2004, 13:18:40
    #32811734
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
это и так понятно, но ведь вопрос был не про это

дело в том что у меня отсойдененный ркордсет, который хранит реестр объектов моей базы данных, на крупных предприятиях этот реестр на данный момент уже превышает 50000 записей, а так как реестр объектов это таблица наиболее часто используемая в приложении, то получается очень накладно гонять такое количество данных по сети, что бы их них потом отсортировалось всего пару тысяч

аксеес это всетаки не SQL сервер, а сразу на SQL перескочить возможности нету, так как основная часть приложения с использованием DAO
...
Рейтинг: 0 / 0
03.12.2004, 13:20:57
    #32811747
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
из данной ситуации я вижу пока только один выход, это сортировать начальный рекордсет, до наложения на него фильтра, но это тоже очень накладно (как сказал уже выше 50000 реестра объектов это не мало)
...
Рейтинг: 0 / 0
03.12.2004, 13:44:50
    #32811850
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
отсойдененный ркордсет - может стоит найти ему замену? Например коллекцию или массив.
...
Рейтинг: 0 / 0
03.12.2004, 13:53:51
    #32811872
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
marvan отсойдененный ркордсет - может стоит найти ему замену? Например коллекцию или массив.

ага, а с формами как потом работать?

мне не нужно другой метод, мне нужно открыть рекордсет с нужными мне данными сделав это с наименьшими затратами ресурсов

вот и возникает вопрос: зачем микрософт сделала возможность открывать один рекордсет на основе другого, если этот механизм у них как я понял не отличается от механизма клонирования рекордсета? это ихняя ошибка, или тут нужно глубже копать?
...
Рейтинг: 0 / 0
05.12.2004, 04:34:03
    #32813290
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
А нельзя так


nrs.Open "select rs.BBB from rs where ..."?
...
Рейтинг: 0 / 0
06.12.2004, 14:28:15
    #32814534
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
Andrey13А нельзя так


nrs.Open "select rs.BBB from rs where ..."?

причем тут это? читай внимательно заголовок темы...
...
Рейтинг: 0 / 0
09.12.2004, 15:15:19
    #32821137
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
делаю вывод что нельзя так сделать?
...
Рейтинг: 0 / 0
09.12.2004, 15:21:39
    #32821150
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
ведь используя DAO я писал:
Код: plaintext
1.
2.
3.
    Set objRst = CurrentDb.OpenRecordset(...)
    objRst.Filter = "...'"
    Set objRstNew = objRst.OpenRecordset
и все было нормально, а почему так в ADO не работает?
...
Рейтинг: 0 / 0
10.12.2004, 17:35:39
    #32823941
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
...
Рейтинг: 0 / 0
14.12.2004, 11:57:37
    #32826327
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
Mik Prokoshin Читайте первоисточники

первоисточники не говорят о том как решить мою проблему

то что фильтры в ADO и DAO работают поразному, это я и без первоисточников знаю, а вот в очередной раз говорю, что если одновременно попробовать сначала отфильтровать, а потом отсортировать отфильтрованное то фильтр отваливается, возникает вопрос кто виноват...
...
Рейтинг: 0 / 0
14.12.2004, 16:47:17
    #32827174
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
MS говорит прямо, что получить рекордсет на базе отфильтрованного невозможно. Значит, надо либо делать в отсоединенном рекордсете Index (а потом Sort и Filter), это ускорит работу с полным рекордсетом, либо, как сказал АлексейК, использовать WHERE с фильтрующими значениями ключевого поля.
...
Рейтинг: 0 / 0
14.12.2004, 16:59:51
    #32827211
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
Индексы там есть, а WHERE мне не подходит, по причине того что вопрос как раз и заключается в том чтобы фильтровать данные без перезапроса к базе данных (отсоединенный рекордсет используется)
В общем козлы одни в этом микрософте, самые нужные вещи не реализовывают, а мы потом удевляемся куда машинные ресурсы уходят, а вот на такую вот фигню и уходят
...
Рейтинг: 0 / 0
14.12.2004, 17:28:47
    #32827281
Mik Prokoshin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
Ну, если такая нужда - делай просто врукопашную еще один disconnected sorted recordset, куда и копируй (удаляй) нужные (отфильтрованные) записи. Ручками работы, конечно, побольше. Если этот фильтрованный рекордсет будет по объему большой, то может проще первый вызов делать все же с WHERE непосредственно из базы - это опытным путем надо смотреть.
...
Рейтинг: 0 / 0
14.12.2004, 17:30:52
    #32827289
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
Mik ProkoshinНу, если такая нужда - делай просто врукопашную еще один disconnected sorted recordset, куда и копируй (удаляй) нужные (отфильтрованные) записи. Ручками работы, конечно, побольше. Если этот фильтрованный рекордсет будет по объему большой, то может проще первый вызов делать все же с WHERE непосредственно из базы - это опытным путем надо смотреть.

Спасибо за совет, ну это все и так понятно, просто хотелось обойтись малой кровью, ан нет, у микрософта мало крови не бывает
...
Рейтинг: 0 / 0
30.12.2004, 15:01:16
    #32851665
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
Lenivec
можно попробовать так:

Код: plaintext
1.
2.
3.
4.
rs.open strSQL, cnn
rs.filter = ...
rs.save "c:\tmp\tmp.xml"
nrs.open "c:\tmp\tmp.xml"

по крайней мере обещают сохранить данные с учетом фильтра

авторIf the Filter property is in effect for the Recordset, then only the rows accessible under the filter are saved
...
Рейтинг: 0 / 0
30.12.2004, 15:12:06
    #32851686
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
2 HandKot

обещать то они обещают, а вот выполнять не выполняют :) уроды
да и извращенный это метод какойто...
ну да ладно, все равно сохраняет без учета фильтра
...
Рейтинг: 0 / 0
30.12.2004, 15:17:54
    #32851698
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
2 Lenivec
не знаю как у тебя у меня все нормально сохраняет с учетом фильтра (токо что специально проверил)

ЗЫЖ вместо файла можно использовать и поток (STREAM)
должно быстрее получится и не надо парится о именах файла
...
Рейтинг: 0 / 0
30.12.2004, 16:46:49
    #32851903
Lenivec
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Как открыть один рекордсет на основе другого
HandKot2 Lenivec
не знаю как у тебя у меня все нормально сохраняет с учетом фильтра (токо что специально проверил)


если в качестве фильтра задана строка, до да все нормально, а вот если в качестве фильтра задан массив букмаков, то нифига не работает, сохраняет без учета фильтра
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ADO Как открыть один рекордсет на основе другого / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]