Переход к другой записи через поле со списком не работает при некоторых обстоятельствах

#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