powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Set rst = ... в цикле. А по-другому можно?
12 сообщений из 37, страница 2 из 2
Set rst = ... в цикле. А по-другому можно?
    #32362408
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АндрейК
Млин, написали, как создаются 2 рекордсета и второй фильтруется в цикле на основе первого.
Млин, ну я написал рабочий пример, трудно найти 10 отличий - вот эту строку rs_filt.Filter = "" куда дели? В моём примере подсчёт количество записей я для своего удовольствия делал - нет, оъясню для чего, чтобы такие как вы запустили и посмотрели.

Я ж уже 2 раза описал ход работы - А вам 20 раз всё разжевали - МАЛО?

Как же вы работаете-то у себя на работе, если вы мало того, что слушать не хотите, о чём вам люди говорят, так ещё и нормальные примеры не верно переписываете.
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32362500
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К Hummer:
Я использовал совет АлексеяК. Цитата:
Код: plaintext
1.
2.
тебе же сказали что вместо set rst в цикле делай фильтр, будет лучше 

rst.Filter =  "ID = "  & ГЛАВНЫЙРЕКОРДСЕТ!Id 

Вашем советом воспользоваться не смог - каких-то библиотек не хватает, например не воспринимается "CurrentProject", "rs.Open".
А может не только библиотек, а и Access у меня "не такой" - 97?
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32362508
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо человек *** либо это навсегда.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Set rst = ...( "Main" )
Set rstNew = ...( "Select Other.Поле1 From Other;" )
For i= 1  To rst.RecordCount
    Debug.Print rstNew.RecordCount ' много записей
    rstNew.Filter = "ID = rst!ID" ' мало записей
    rst.Edit
    rst!Поле = rstnew!Поле1
    rst.Update
    rst.MoveNext
    rstNew.Filter = "" ' опять много
    Debug.Print rstNew.RecordCount
Next i
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32363065
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да можете изгаляться хоть со ***, хоть с ###, но не работает!
Разница в моём коде и коде Hummer-a в одной строке, где фильтр приравнивается к ""?
Ну добавил я ёё - результат тот же.
Из справки по Filter:
Задает или возвращает значение, определяющее записи, которые будут включены в открываемый объект Recordset
Т.е. вроде сначала задают Filter, а потом уже открывают Recordset. А у меня (и у Hammer) все Recordset-ы уже открыты.
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32363175
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочешь сказать что изменение фильтра на уже открытом DAO рекордсете не изменит набор записей?
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32363182
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не буду больше изголяться - если понимания нет, то это навсегда.

Вот рабочий код - передалать под себя (и на дао рекордсеты) и всё будет работать.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Public Sub tst_recordset_New()
Dim rs As New ADODB.Recordset
Dim rs_filt As New ADODB.Recordset

rs.Open  "select * from Menu where idMenu in (1670 ,  1701 )", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rs_filt.Open  "select * from MenuItem order by caption" , CurrentProject.Connection, adOpenStatic, adLockReadOnly
Do While Not rs.EOF
    Debug.Print rs_filt.RecordCount
    Debug.Print rs_filt!Caption
    rs_filt.Filter =  "IDMenu = "  & rs!IdMenu 
    Debug.Print rs_filt.RecordCount
    Debug.Print rs_filt!Caption &  " "  & rs.RecordCount &  " "  & rs!TEST_Cap
    rs!TEST_Cap = rs_filt!Caption
    rs.Update
    Debug.Print rs!TEST_Cap
    rs.MoveNext
    rs_filt.Filter = "" 
    Debug.Print rs_filt.RecordCount
Loop
End Sub
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32363195
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АлексейК
хочешь сказать что изменение фильтра на уже открытом DAO рекордсете не изменит набор записей?
Именно так. Для DAO .
Придется делать примерно следующее
Код: plaintext
1.
2.
3.
Set rstMain = .....( "Select * From ...." )
....
rstMain.Filter =  "фильтр" 
Set rstFiltered = rstMain.OpenRecordset()


Это, в общем-то, тоже самое что и пресловутые "Set rst = ... в цикле"
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32363212
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, действительно ....
но ускори ли процесс такой способ?


почему бы не использовать ADO?

там фильтр работает "правильно"


Public Sub tst2()
Dim rs As New adodb.Recordset
'из Set rs = CurrentDb.OpenRecordset("select * from t1", dbOpenDynaset)
rs.Open "select * from t1", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rs.MoveLast
Debug.Print rs.AbsolutePosition
rs.MoveFirst
rs.Filter = "id =1 "
rs.MoveLast
Debug.Print rs.AbsolutePosition

rs.Close
Set rs = Nothing

End Sub
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32363237
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, для дао фильтр не изменяет кол-во записей - просто всё делал на адо - там в порядке. Извиняюсь:) Сейчас проверил всё на дао просто...

Всё-таки, думаю что в этой ситуации можно написать запрос на обновление записей...
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32363255
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но ускори ли процесс такой способ?
Сомнения

почему бы не использовать ADO?
там фильтр работает "правильно"
Тоже сомнения
В ADO фильтр не только устанавливать нужно, но еще и сбрасывать. С другой стороны рекордсеты не надо создавать/убивать.

Я еще раз предлагаю скидывать результаты во временную таблицу (дабы бороться с необновляемостью рекордсета)

И еще один вариант. Открываем набор-источник отсортированный по ID. Открываем набор приемник отсортированный по ID. И бежим сразу по обоим отслеживая ключевые поля.
1. Если ключи совпадают - апдейтим приемник, перемещаем приемник на следующую запись.
2. Если не ключ в применике больше, чем в источнике - то перемещаем источник на след. запись, и, если ключи все еще отличаются - то перемещаем приемник до тех пор, пока ключ в приемнике не больше ключа в источнике.
3. Если ключ в приемнике меньше, чем в источнике - бежим по приемнику до тех пор, пока ключ в приемнике не меньше чем ключ в источнике

Такой вот Client-side VBA-based INNER JOIN
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32363308
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каком смысле сбрасывать ?
Нарастающих итогов в фильтре рекордсета нет

t1 = 13 записей id - ключ


Public Sub tst2()
Dim rs As New adodb.Recordset
'Set rs = CurrentDb.OpenRecordset("select * from t1", dbOpenDynaset)
rs.Open "select * from t1", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rs.PageSize = 1
Debug.Print rs.PageCount ' = 13'
rs.Filter = "id =1 "
Debug.Print rs.PageCount ' = 1'
rs.Filter = "id =3"
Debug.Print rs.PageCount ' = 1'
rs.Filter = ""
Debug.Print rs.PageCount ' = 13'


rs.Close
Set rs = Nothing
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32363351
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АлексейК
Был неправ. Туплю что-то

Проверил скорость в DAO-шном варианте (наложить фильтр и сделать OpenRecordset) и в ADO-шном (просто наложить фильтр)
Результат... гм... мягко говоря... шокирующий.
Разница в 14 раз. В пользу DAO.
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Set rst = ... в цикле. А по-другому можно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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