Различные результаты кода доступа VBA в зависимости от того, установлена ​​ли точка останова

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

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

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

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

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

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

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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
78
1

Ответы 1

Создайте 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

Такое же точное поведение. Он работает, если я прохожу через него, но не работает, если я просто позволяю коду работать.

Emily Beth 02.05.2018 17:19

Похоже, что сработало другое событие? например OnCurrent вашей подчиненной? Если это так, «exit sub» или «exit function» прямо в верхней части кода VBA других событий (просто добавьте эти строки временно, в качестве теста), потому что приведенный выше код, цитируемый выше, работает нормально сам по себе в примере, который я высмеивал. вверх

Mike 11.05.2018 05:48

Другие вопросы по теме