#ms-access #vba
#ms-access #vba
Вопрос:
У меня есть две формы: ‘frmClient’ (у которого есть подчиненная форма, в которой перечислены кандидаты) и ‘frmDisclosure’, в которой отображаются сведения о кандидатах. В frmClient есть командная кнопка, которая открывает указанную запись в frmDisclosure. Процедура является частной субкомандой10_click() — смотрите ниже. Это работает.
Проблема в том, что после того, как вы попали в frmDisclosure через frmClient, невозможно перейти к другой записи. Процедура открытия другой записи во frmDiscloure находится в элементе управления выпадающего списка: Private Sub ComboFind_AfterUpdate(). Обычно это работает, но это никогда не сработает, если frmDiscloure был открыт через frmClient. Я пробовал ‘requery’ и ‘refresh’ в различных ситуациях и пытался закрыть frmClient, как только откроется frmDisclosure. Ничего из этого не работает. Если я хочу перейти к другой записи, единственное решение, которое у меня есть на данный момент, — закрыть frmDisclosure и снова открыть его.
\\\\\\\\\\\\\\
Private Sub Command10_Click()
If NumForms > 0 Then
DoCmd.OpenForm "frmDisclosure"
Forms!frmDisclosure.FilterOn = False
DoCmd.OpenForm "frmDisclosure", acNormal, "", "[DiscPK]=" amp; Me.DiscPK, , acNormal
Else
DisplayMessage ("No form ref for this application.")
Exit Sub
End If
End Sub
\\\\\\\\\\\\\\\\
\\\\\\\\\\\\\\\\
Private Sub ComboFind_AfterUpdate()
Dim rs As Object
Set rs = Me.RecordsetClone
rs.FindFirst "[DiscPK] = " amp; Str(Nz(Me![ComboFind], 0))
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub
\\\\\\\\\\\\\\\\
Комментарии:
1. frmDisclosure открывается для одной записи, других записей для навигации нет. В RecordsetClone есть только одна запись, поэтому, конечно, код не найдет другие. Попробуйте сначала очистить фильтр:
Me.FilterOn = False
. Если DiscPK имеет числовой тип, зачем преобразовывать параметр в строку?2. Спасибо. Указание filteron= false в событии before update в окне combox приводит к ошибке времени выполнения 2115 — это не позволяет Access сохранять данные в поле. При вводе условия whre я был «на автопилоте» — делал это таким образом так часто, что я не думаю. Я переделаю это число.
3. Изменение параметра на number не имеет значения.
4. Я не понял, что frmDisclosure открывается для одной записи, других записей для навигации нет. Может быть подсказкой, которая мне нужна.
5. Я ожидаю, что
"[DiscPK]=" amp; Me.DiscPK
ограничивается одной записью.
Ответ №1:
frmDisclosure открывается для одной записи, других записей для навигации нет. В RecordsetClone есть только одна запись, поэтому, конечно, код не найдет другие. Сначала отключите фильтр:
Private Sub ComboFind_AfterUpdate()
Me.FilterOn = False
With Me.RecordsetClone
.FindFirst "[DiscPK] = " amp; Nz(Me.ComboFind, 0)
If Not .NoMatch Then Me.Bookmark = .Bookmark
End With
End Sub
Как вы можете видеть, объявление и установка объектной переменной recordset не требуется. .EOF
вероятно, сработало бы так же хорошо, я просто всегда использовал NoMatch. Это установит фокус на запись, а не на фильтрацию формы.
Если вы предпочитаете отображать одну запись, установите свойство Filter.
Private Sub ComboFind_AfterUpdate()
Me.Filter = "DiscPK=" amp; Nz(Me.ComboFind, 0)
End Sub