|
Обновление данных в форме
Обновление данных на форме методом Refresh
В проектах ADP обновление формы методом Refresh проявляет себя так же, как и Requery
В качестве альтернативы можно выбрать один из способов
Обновление одной, текущей записи
Me.Recordset.Resync adAffectCurrent, adResyncAllValues
(Предварительно нужно корректно указать свойства «Однозначная таблица» UniqueTable и «Команда синхронизации» ResyncCommand)
Обновление всего набора с последуещей установкой текущей записи
On error Resume Next
Dim bm
' запоминаем положение указателя формы
bm = Me.Bookmark
Me.Requery
' Ждем пока закончится загрузка данных в рекордсет
Do WhileMe.RecordsetClone.State And adStateFetching
DoEvents
Loop
Me.Bookmark = bm
вариант более безглючный
On error Resume Next
Dim bm
' запоминаем положение указателя формы
bm = Me.Bookmark
Me.Requery
' Ждем пока закончится загрузка данных в рекордсет
Dim rs
'хитро но так надо для безглючности
set rs = me.recordsetclone.clone
WaitEndOfRequery RS 'Процедура приведена ниже
Me.Bookmark = bm
rs.close
setrs = Nothing
Использовать пользовательскую функцию
Обновление набора записей другими способами
(формы, подчиненной формы, элементов управления список и поля со списком)
Одно из:
Me.Requery
Me.Recordset.Requery
Me.Recordsource = Me.Recordsource
DoCmd.RunCommand acCmdRefresh
обновление значения главного поля для подчиненной формы
обновление значения поля - являющегося источником входного параметра
после любого обновления желательно дождаться загрузки всех записей:
Стандартный вариант:
Do WhileMe.Recordset.State And adStateFetching
DoEvents
Loop
Продвинутый вариант, работающий на медленных соединениях:(by Latuk)
Public Sub WaitEndOfRequery(rs AsADODB.Recordset, Optional SleepTime Asinteger = 33)
'Дождатся заполнения рекордсета
'Public Declare Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)
DimT As Single
T = Timer
Do
DoEvents
Sleep SleepTime
Loop Until(rs.State = adStateOpen) OrTimer - T > GetOption("OLE/DDE Timeout (sec)")
End Sub
Прим. : не во всех случаях корректно выполняется
обновление подчиненной формы без установки на нее фокуса.
Поэтому всегда перед вызовом метода обновление объекта - установите на него фокус.
Для подчиненных форм , которые вложены друг в друга фокус нужно устанавливать
на все объекты последовательно 1 Главная форма.Setfocus,
подчиненная главной формы.Setfocus , подчиенная подчиненной.Setfocus
| |