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

пишу следующий код
Код: 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
ADO Как открыть один рекордсет на основе другого
    #32810483
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
set nrs = rs.clone ' или nrs.open rs
nrs.filter=rs.filter
Или я не правильно понял в чем проблема?
...
Рейтинг: 0 / 0
ADO Как открыть один рекордсет на основе другого
    #32810493
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема в том чтобы открыть новый рекорсет на основе имеющегося, но новый должен содержать только те данные которые возвращает первый рекордсет в режиме фильтра

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

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

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

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

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


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

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

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

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

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

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


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


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

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

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

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

Спасибо за совет, ну это все и так понятно, просто хотелось обойтись малой кровью, ан нет, у микрософта мало крови не бывает
...
Рейтинг: 0 / 0
ADO Как открыть один рекордсет на основе другого
    #32851665
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ADO Как открыть один рекордсет на основе другого
    #32851686
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 HandKot

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

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


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


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