У меня есть странное обстоятельство, связанное с формой доступа. У меня есть родительская форма (показанная в представлении единой формы) с подчиненной формой (показанная в представлении непрерывных форм). В родительской форме отображаются записи (по одной) для каждого проекта, а в подчиненной форме - примечания (все) для каждого проекта.
В подчиненной форме примечания могут быть десятки или сотни записей для каждой записи проекта. И чтобы пользователям было удобно просто начинать вводить заметки в форму, когда они открывают запись, у меня есть код в родительской форме для текущего события, который «позиционирует» записи в подчиненной форме, чтобы показать четыре нижних существующих записи. а затем одна запись, с которой они могут начать ввод текста. Этот код выглядит следующим образом:
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, если она вообще пригодится.
Создайте 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
Похоже, что сработало другое событие? например OnCurrent вашей подчиненной? Если это так, «exit sub» или «exit function» прямо в верхней части кода VBA других событий (просто добавьте эти строки временно, в качестве теста), потому что приведенный выше код, цитируемый выше, работает нормально сам по себе в примере, который я высмеивал. вверх
Такое же точное поведение. Он работает, если я прохожу через него, но не работает, если я просто позволяю коду работать.