powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Set rst = ... в цикле. А по-другому можно?
25 сообщений из 37, страница 1 из 2
Set rst = ... в цикле. А по-другому можно?
    #32359442
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблицу Main добавляю данные в поля (не новые записи!) из табл.Other.
В упрощённом виде(синтаксис не проверять):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Set rst = ...( "Main" )
rst.MoveFirst
For i= 1  To rst.RecordCount
Set rstNew = ...( "Select Other.Поле1 From Other Where(ID = rst!ID)" )
rst.Edit
rst!Поле = rstnew!Поле1
rst.Update
rst.MoveNext
Next i
Вопрос о повторяющейся в цикле ссылке на табл.Other: а один раз нельзя сослаться?
Есть такие наборы записей, что на строке ссылки на них программа заметно притормаживает, а если ещё и в цикле......
--------------
На возможный вопрос "а зачем вообще?". При открытии базы создаётся некая таблица, с которой потом и работают. В принципе, всё проделывается одним запросом, но:
- запрос с большим числом таблиц
- огромное число записей
- медленные машины
- база сетевая
В итоге несколько минут задержки, когда на экране висит заставка "Ждите...".
Пользователь царапает ногтями экран, рвёт на себе одежду и т.д. Бывает ситуация, когда после "ожидания" выясняется, что комп висит.
Вот я и разбил процедуру создания таблицы на этапы, первыми заносятся "базовые" данные - ключи и т.п., а потом - остальные. Всё в коде, сплошное Insert и Update. Это позволило вывести на экранн ProgressBar (не ActiveX, а самодельный) и сообщения об текущем этапе. Теперь, может в сумме и помедленней, но не так тоскливо.
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359451
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по нормальному
надо использовать запросы
на обновления,
а не циклы гонять
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359549
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По нормальному надо иметь машины >> чем 500MHz.... и много чего ещё.
В случае же использования запросов проблематична индикация процесса. А псевдо-ПрогрессБар, когда индицируется не реальный процесс, а нечто с потолка, не дают пользователю "эффекта присутствия". Или, проще: на экране что-то крутится, а хрен знает может комп и висит!
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359559
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"еффект присутствия"
у меня никогда не бывает.
хоть дай прогресс=бар
хоть песочные часы
в обоих вариантах
комп с тобой не разговаривает
а занимается сам собой.
и ты никогда не узнаешь
то ли он висит, то ли он
считает
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359796
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и ты никогда не узнаешь
то ли он висит, то ли он
считает

Как это? А если ПрогрессБар "самописочный" и обновляется из того же кода, его остановка и есть признак зависания программы(при условии, конечно, что программа изначально разбита на "не долгие" отрезки, иначе замирание ПрогрессБара можно расценить как "машина думает").
-----------------------------------
Что-то мы всё о своём, да о своём...
Сам вопрос так и "неотвеченный". Так можно ли обойтись без присвоения Set rst=... в цикле или никак?
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359805
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно открывать в рекордсет все записи и делать поиск или фильтрацию
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359807
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну дык обойдись.
Кто ж тебе мешает.
Открой один раз рекордсет и бегай по нему.
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359816
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но лучше поставить хотябы MSDE2000 , запихнуть обработчик в хранимую процедуру или в триггер формирующий результат на стадии ввода и навсегда забыть про ЖДИТЕ , прогресбар, песочные часы, анимации и зависания ))))
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359838
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поставить хотябы MSDE2000 , запихнуть обработчик в хранимую процедуру или в триггер формирующий результат на стадии ввода
Тёмный лес.......

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

Dim rs As DAO.Recordset

фильтр
rs.Filter "F1"


поиск
rs.FindFirst
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359895
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал про св-во Filter, насколько понял фильтр ограничивает данные в новом Recordset, который открыт на базе исходного Recordset-a. Опять получается Set... в цикле. И ещё и исходный надо "засетить", пусть и один раз.
--------------------------
Из того же Хелпа вычитал, что " при использовании больших динамических объектов Recordset, пользователь может обнаружить, что выполнение методов Find , а также использование свойств Sort или Filter является достаточно медленным. Для повышения быстродействия пользуйтесь запросами SQL со специализированными предложениями ORDER BY или WHERE"
----------------------------
Вобщем, хоть мне прямо об этом и не сказали(огорчать не хотели?), но выходит, что от Set в цикле мне никуда не деться. :(((
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359908
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему ЛП не слушаем?

Set rst = ...
("SELECT Main.Поле, Other.Поле1 FROM Main INNER JOIN Other ON Main.ID = Other.ID")
и дальше бегай себе сколько хошь.

Вот только rst.MoveFirst - зачем???
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32359921
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АндрейК
Фильтр фильтрует - мы увидим ограниченное число записей, потом сбрасываем фильтр и видим всё - зачем SET в цикле?
Set rstNew = ...("Select Other.Поле1 From Other")
А в цикле уже фильтруем rstNew, после каждого шага по внешнему набору просто удаляем фильтр из внутреннего и фильтруем с новым значением.


Ну уж где только не сказано - для изменения большого количества записей надо использовать запросы типа UPDATE, Insert - т.е. запросы действия, а не рекордсеты.
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32360899
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К Hummer:
1.Так в Хелпе пример приведён, там 2 присвоения. 1 - сам набор, потом создаётся его Filter, а 2 это Set rstNew = rst. Filter. Что-то вроде этого.
В моём случае поскольку фильтр будет каждый раз меняться, то и присвоение
Set rstNew = rst. Filter опять выходит в цикле?
2. Согласен, может надо не бегать по recordset-y. Может сохранёнными запросами и правильнее. Я уже писал, что в моём случае всё делается одним запросом на добавление, но... (см. сообщение №1)
--------------------------
к AlexJuice:
rst.MoveFirst - я написал, rst.MoveLast забыл. А всё это, чтобы получить корректное значение RecordCount (для организации цикла)
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32360933
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АндрейК
А почему AlexJuice не слушаем?
Хочешь бегать - бегай. Не хочешь миллион раз рекордсет открывать - не открывай.
Открой один раз, по нему беги и его же апдейть. Всего то делов - засунуть в один рекордсет и то, чем обновлять, и то, что обновлять. Если рекордсет обновляемым получится - считай победил.
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32360938
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цикл можно организовать и так:
Код: plaintext
1.
2.
Do While Not rsFT.EOF
    rsFT.MoveNext
Loop


Работа с фильтрами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Sub tst_recordset_new()
Dim rs As New ADODB.Recordset
Dim rs_filt As New ADODB.Recordset

rs.Open  "select * from MyTable where IdTable In (1 , 2 )", CurrentProject.Connection
rs_filt.Open  "select * from MySubTable" , CurrentProject.Connection, adOpenStatic, adLockReadOnly
Do While Not rs.EOF
    Debug.Print rs_filt.RecordCount
    rs_filt.Filter =  "IdSubTable = "  & rs!IdMenu
    Debug.Print rs_filt.RecordCount
    rs.MoveNext
    rs_filt.Filter = ""
    Debug.Print rs_filt.RecordCount
Loop
rs.Close: Set rs = Nothing
rs_filt.Close: Set rs_filt = Nothing
End Sub
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32361032
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АндрейКrst.MoveFirst - я написал
На самом деле при открытии рекордсета указатель автоматически устанавливается на первую запись (если они есть, конечно ;0) )
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32361068
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочёл всю ветку - кажется мы в итоге о разном стали говорить.
1. На данный момент есть запрос на добавление начального набора записей в таблицу. Всего 15 таблиц. Набор возвращает 17 полей, 2 из них - расчётные.
Всё нормально работает, с точки зрения результата, которого приходится ждать до нескольких минут. Результата можно и не дождаться. Ситуация зависания программы определяется эмпирически - после n минут ожидания выдвигается предположение: "что-то очень долго сегодня"....
2. Хотел сделать индикатор, который скрашивал бы пользователю ожидание. Полазил по форумам, выяснил, что либо применяют псевдо-индикатор, который показывает невесть что, либо привычную "линейку". Стандартный ActiveX решил не применять(надо, чтоб на каждой машине он был установлен и т.п.). Сотворил самоклёп - 50 прямоугольников (1прям. = 2% процесса).
3. Тут же возникла проблема - к чему привязать обновление индикатора?
4. Начал с того, что исходный 15-и табличный запрос записал в виде запроса на выборку SQL - строкой (жуткий монстр!). А потом построчно, инструкцией Update записывал его записи в таблицу. Индикация была, но перед ней - большая пауза. Выяснилось, что задержка на строке Set rst = <вот этот монстр с 15-ю таблицами>. А собственно запись идёт "бодро".
5. Разделил "монстра" на смысловые части. Получилось 3 куска. Задержка при Set значительно меньше, тем более, что в это время надпись на индикаторе гласит: "готовлю данные" (на своём компе прочесть не успеваю - 2,4 Ггц). Потом начинается "дёргаться" индикатор. Короче, пользователь не чувствует себя брошенным, наоборот - процесс виден.
--------------------------------------------------------
Теперь о сути темы:
При добавлении данных на этапах 2 и 3, когда отбор идёт по ключам уже находящимся в табл.Main, выражения типа:
Код: plaintext
1.
Set rst = ... 
( "SELECT Main.Поле, Other.Поле1 FROM Main INNER JOIN Other ON Main.ID = Other.ID" ) 

у меня не проходили:
1. Я так и не сообразил как объяснить программе куда она должна добавить записи? В сообщении №1 видно, что в каждый данный момент фокус в Main стоит на конкр.записи. Из этой же записи берётся ID, по нему отбирается запись из Other и данные пишутся в конкр.Поле записи табл.Main. Остаётся только обработать ошибку №3021(в Other вообще нет записи соответствующей ID табл.Main).
2. При попытке включить в выражение Set... таблицу Main, опять возникает значительная задержка на строке Set rst.... Замкнутый круг!
-------------------------------------------
Из опыта: если при выполнении чего-то очень долгого, на экране присутствует нечто, реально отражающее процесс - пользователь спокойнее это переносит.
Вроде загрузка "Одинэсины" по такому принципу устроена. Не видел ни одного бухгалтера, который вчитывался бы в сообщения программы, мелькают надписи серьёзного содержания - процесс идёт. А если убрать эти сообщения(условное предложение)? Сразу не поймёшь - грузит или висит?

-----------------------------------------------------------
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32361082
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ таблицу Main добавляю данные в поля ( не новые записи! ) из табл.Other
.............
прошло 15 постов, и
авторЯ так и не сообразил как объяснить программе куда она должна добавить записи?

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

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

а прогрессбар можно и в строке состояния показывать

максимальное значение прогрессбара - число записей главного рекордсета
текущее - absolutepositon
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32361137
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АлексейК
Ему уже много чего сказали. Но он до сих пор уверен, что "выходит, что от Set в цикле мне никуда не деться. "
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32361168
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бывают такие люди или состояния души
когда человек спрашивает - ему отвечают но он настолько занят созерцанием своей проблемы что даже не слышит что ему отвечают

Диалог немого с глухим

один :
мне так плохо, неуютно , ничего не получается

второй:
дык пойди прими душ, сделай зарядку - глядишь полегчает

первый:
мне так плохо, настроения нет, никто меня не любит, прогресбары из прямоугольников рисую - мерзкое зрелище


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

2 АлексейК
Именно так.
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32362364
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛП: Всего то делов - засунуть в один рекордсет и то, чем обновлять, и то, что обновлять. Если рекордсет обновляемым получится - считай победил.
Не получается обновляемым - считаю проиграл -> способ не подходит.
По поводу фильтра:
Фильтр имеет смысл, когда в recordsete есть что отбирать. Я ж уже 2 раза описал ход работы. В табл. Main ecть поля Дата_Max и Проц_Оплаты. Данных в них нет. Данные расчитываются в запросе из 3 таблиц и включаются в табл.Main программой. Включить в этот запрос саму табл.Main - опять столкнуться с задержкой. Поэтому и приходится изгаляться. Ну попробовал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Set rst = ...( "Main" )
Set rstNew = ...( "Select Other.Поле1 From Other;" )
For i= 1  To rst.RecordCount
rstNew.Filter =  "ID = rst!ID" 
rst.Edit
rst!Поле = rstnew!Поле1
rst.Update
rst.MoveNext
Next i
Set в цикле исчез, вместо него появился Фильтр, только в табл.Main значение Поля во всех записях одинаковое.................
Пример из Хелпа к св-ву Фильтр:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
' Возвращает ссылку на текущую базу данных.
	Set dbs = CurrentDb
' Запрашивает значение для фильтра.
	strInput = InputBox( "Введите название страны, по которому следует установить фильтр." )
	' Создает динамический объект Recordset.
	Set rstOrders = dbs.OpenRecordset("Заказы", dbOpenDynaset)
	' Задает условие отбора записей.
	rstOrders.Filter =  "СтранаПолучателя = '" & strInput & "'" 

' Создает динамический объект Recordset для отобранных записей.
	Set rstFiltered = rstOrders.OpenRecordset
	rstOrders.Close
	rstFiltered.Close

Здесь создаются два рекордсета - как раз второй и получается в цикле, если названия стран брать из какого-то набора.
...
Рейтинг: 0 / 0
Set rst = ... в цикле. А по-другому можно?
    #32362383
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается обновляемым
Запихни одним инсертом во временную таблицу данные, которыми надо обновлять.
Потом сджойни то, что надо обновлять со временной таблицей. Джойн получится обновляемым (первичный ключ не забудь во временной). На джойне открой один рекордсет, и беги по нему - Edit - Update - MoveNext - прогрессбар отрисовал.
Правда сначала будет длинный затык (вставка данных во временную таблицу), но возможно не такой уж и длинный
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Set rst = ... в цикле. А по-другому можно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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