powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вешается форма из-за запроса на обновление
5 сообщений из 5, страница 1 из 1
Вешается форма из-за запроса на обновление
    #32718511
Partner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Существует ленточная форма - очередь заказов, в основе которой запрос. Записи в форме отсортированы по полю Номер_в_очереди. Это поле должно быть обновляемым, т. к. заказы в очереди перемещаются путём изменения этого самого номера. Но после исключения заказов из очереди (ставим галочку в соотв. поле) необходимо обновить номер в очереди, чтобы он снова стал последовательным от 1 до...На данный момент делаю это посредством запроса на обновление
DoCmd.RunSQL "UPDATE Очередь SET Очередь.номер_в_очереди = [Очередь]![index]"
, где [index] - поле в запросе, получаемое след. образом: index: DCount("[номер_в_очереди]";"[Очередь]";"[номер_в_очереди] <=" & CStr([номер_в_очереди]))

Этот запрос ужасно подвешивает форму, выполняется больше минуты...Подскажите, пожалуйста, какой-нибудь способ, как обновить номера заказов, не прибегая к такому запросу?
...
Рейтинг: 0 / 0
Вешается форма из-за запроса на обновление
    #32718790
Exquisite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Подскажите, пожалуйста, какой-нибудь способ, как обновить номера заказов, не прибегая к такому запросу?

Попробуйте пробежаться программно от первой записи до последней, присваивая необходимые порядковые номера, проверяя при этом необходимость в таком присваивании. Очень удобно - записи уже в том порядке в котором необходимо, порядковый номер храним в переменной и т.п.
Только "бежать" надо не по Набору Записей и даже не по Клону Набора Записей, а по клону клона набора записей :)

Что бы было понятней, приведу выдержку из собственных изысканий, кажется, в А2000:
При редактировании стандартного клона набора записей формы (Form.RecordsetClone) все изменения отображаются на экране сразу после обновления записи. Этого получается избежать через запрет перерисовки формы (Form.Painting = False). Данный вариант является очень медленным, т.к. редактирование одной записи занимает 0,045 секунды (Pentium 200 MMX).
Значительного ускорения получается добиться за счет редактирования специально созданного клона набора записей (Set rstClone = mfrmBaseForm.Recordset.Clone), вносимые изменения в котором не отображаются сразу на экране. Время редактирования одной записи составляет 0,003-0,005 секунды, что в 10 раз быстрее чем в варианте со стардартным клоном набора записей. В варианте со специально созданным клоном внесенные изменения отображаются на экране либо при перемещении каретки курсора на запись, либо при перемещении над записью курсора мыши. Данный эффект не следует использовать, т.к. остается вопрос с перересовкой неопределенного (Null) статуса поля "Selected", а так же из-за того, что в последующих версиях Access данный эффект может попросту исчезнуть, т.к. не является документированной фичей.

Насильная перерисовка экрана после редактирования клона может производиться либо через стандартный метод формы Repaint, либо через отключение и последующее безотлогательное включение перересовки формы (Painting).
В случае использования метода Repaint экран перерисовывается без "мерцаний", т.е. перерисовываются только изменившиеся поля без предварительной очистки экрана. Время выполнения перерисовки 0,2 секунды.
В случае отключения с последующим включением прорисовки формы экран перерисовывается с "мерцанием", т.е. перед перерисовкой экран очищается и затем отрисовывается заново. Время выполнения перерисовки порядка 0,135-0,150 секунды, что несколько меньше чем в случае с методом Repaint. Тем не менее далее рассматривается только метод Repaint, т.к. он не приводит к мерцанию...

З.Ы. Саныч, и тебе привет от реинкарнировавшего (местами) Свина :) //Саныч поймет...
...
Рейтинг: 0 / 0
Вешается форма из-за запроса на обновление
    #32718829
Partner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В том то и дело, что пробежаться программно не хватает опыта, может из знатоков кто подскажет, хоть в общих чертах, как это сделать. Спасибо.
...
Рейтинг: 0 / 0
Вешается форма из-за запроса на обновление
    #32719244
Exquisite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общих чертах? Ну, Вы сами захотели :)

Создаем объектную переменную (см. в Хелпе про Dim и еже с ним);
Создаем клон набора записей и присваиваем его нашей переменной (см. Set, Recordset и Clone);
В цикле (см. Do или For) пробегаем (см.MoveNext) по набору записей и меняем что надо (см. Edit и Update).
Закрываем клон (см. Close) и освобождаем переменную (см. Nothing).

И это... В хелпе везде есть примеры. Ознакомьтесь...
...
Рейтинг: 0 / 0
Вешается форма из-за запроса на обновление
    #32727336
Partner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось следующее...

Dim rs As Recordset
Dim Nmax As Integer
Dim Hmax As Integer

Nmin = DMin("[номер_в_очереди]", "[Очередь]")
Nmax = DCount("[номер_в_очереди]", "[Очередь]")

Set rs = Forms![Очередь].Recordset.Clone
Hmax = 0
For ind = Nmin To Nmax
No = Hmax + 1
rs.MoveNext
rs.Edit
rs("номер_в_очереди") = No

Next ind
rs.Close
Set rs = Nothing

Пишет "Не найдена текущая запись". Как её определить? rs.MoveFirst?
И ещё...Когда мы обращаемся к клону набора записей, обращение идёт к набору записей, который был до того момента, когда проставлены галочки и нужно обновить очередь, или к уже обновлённому запросу? Т. Е. нужно ли проверять условие необходимости присвоить заказу новый номер в очереди. заранее большое спасибо.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вешается форма из-за запроса на обновление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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