Обновление данных в форме

Источник: msdatabase

Обновление данных на форме методом 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

  •  


    Страница сайта http://test.interface.ru
    Оригинал находится по адресу http://test.interface.ru/home.asp?artId=8272