Различные коды доступа VBA в зависимости от того, установлена ​​ли точка останова - PullRequest
0 голосов
/ 02 мая 2018

У меня есть странное обстоятельство, связанное с формой доступа. У меня есть родительская форма (показанная в представлении «Одна форма») с подчиненной формой (показанная в представлении «Непрерывные формы»). В родительской форме отображаются записи (по одной) для каждого проекта, а в подчиненной форме отображаются примечания (все они) для каждого проекта.

Подформа примечаний может содержать десятки или сотни записей для каждой записи проекта. И чтобы пользователям было удобно начинать вводить заметки в форму прямо при получении записи, у меня есть код в текущем событии родительской формы, который «позиционирует» записи в подчиненной форме, чтобы показать четыре нижние существующие записи а затем одна запись, где они могут начать вводить текст. Этот код выглядит следующим образом:

Dim mymove As Integer
Dim c As Integer

'' Attempt to scroll down in the CaseNotes subform to a convienent location
'' so that user can read the most recent note and has access to the next
'' blank note
With Me.CaseNotes.Form.Recordset

    ' Load the # of notes for this record
    c = .RecordCount

    ' The display shows only 5 notes.  Otherwise, you have to scroll.
    ' If there are more than 4 notes, we want to display just the last
    ' four and then have a blank line where a new note can be entered.
    ' The following code makes the moves necessary for this.
    If c <= 4 Then mymove = c Else mymove = 4

    If mymove > 0 Then
      .MoveLast
      .Move -mymove
    End If

    'move to new record
    .AddNew

End With

Этот код работал миллион лет, и с ним вообще никаких проблем. Однако недавно мы добавили элемент комбинированного списка в родительскую форму, который позволяет пользователям выбирать источник данных для родительской формы. Событие после обновления для этого поля со списком изменяет RecordSource родительской формы в соответствии со значением, выбранным пользователем.

После того, как мы реализовали это, наш код позиционирования больше не работает сразу после изменения источника данных. Таким образом, вы выбираете новый источник данных, он загружает новые данные в родительскую форму и в подчиненные формы, а затем подчиненная форма примечаний правильно позиционирует себя (используя приведенный выше код), но затем перед передачей управления пользователю, она возвращается к исходной (плохой) позиции для заметок. Непонятно почему. Код позиционирования работает (я установил точку останова и прошел по коду), но он каким-то образом отменяется.

В любом случае, чтобы перехитрить это, я добавил некоторый дополнительный код в поле со списком после обновления кода события, чтобы повторно запустить код позиционирования после установки RecordSource. Вот где все становится странным. Этот код работает нормально ... , пока я выполняю его вручную . Если я делаю это (устанавливаю точку останова и продолжаю нажимать F8), то она проходит через код позиционирования и оставляет меня там, где я хочу быть. Но если я не установлю точку останова и просто позволю коду катиться самостоятельно, это не сработает. Кажется, что он делает позиционирование, но затем он возвращается к исходной (плохой) позиции подчиненной формы, перед тем как вернуть мне контроль над формой.

Кажется, здесь нет абсолютно никакой разницы. В одном случае я делаю это вручную, а в другом случае код просто запускается сам по себе. Это должно дать тот же результат, я думаю. Почему это может дать разные результаты, и что я могу сделать, чтобы решить эту проблему?

У меня есть общее ощущение, что запускаются разные события в зависимости от того, установил ли я точку останова, но не уверен, с чего начать в плане отладки. Любая помощь очень ценится.

Я использую Access 2013 32-разрядную версию под Windows 7, если это вообще полезно.

1 Ответ

0 голосов
/ 02 мая 2018

Создать RecordsetClone, используя набор записей подчиненной формы

Затем после навигации по коду внутри вашего клонированного набора записей, установите Закладку вашей подчиненной формы равной Закладке клона.

, например

Dim rsClone As Recordset
Dim intMoveBack As Integer
Dim intCount As Integer

Set rsClone = Me.CaseNotes.Form.RecordsetClone
intMoveBack = 4


If Not (rsClone.EOF And rsClone.BOF) Then  'there is at least one record in the subform

    rsClone.MoveLast

    For intCount = 1 To intMoveBack - 1
        If Not (rsClone.BOF) Then
            rsClone.MovePrevious
        End If
    Next

    If rsClone.BOF Then   'we have moved back past the first record, so step forward one
        rsClone.MoveNext
    End If

    Me.CaseNotes.SetFocus   'setfocus to the subform

    With Me.CaseNotes.Form
        .Bookmark = rsClone.Bookmark
        .AnyControlOnYourSubform.SetFocus   'replace this with the name of a control on your subform
        .Recordset.AddNew
    End With

End If
...