Получает поисковую форму Runtime Ошибка 2185, когда нет результатов - PullRequest
1 голос
/ 21 января 2020

У меня есть форма, которая показывает все записи таблицы с несколькими фильтрами в верхней части.

У меня есть текстовое поле, в которое я могу вставить имя, и каждый раз, когда изменяется содержимое поля, оно перезапускает запрос и возвращает фокус на поле.

Код:

Private Sub FilterName_Change()
Me.Requery
Me.FilterName.SetFocus
Me.FilterName.SelStart = Nz(Len(Me.FilterName), 0)
Me.FilterName.SelLength = Nz(Len(Me.FilterName), 0)
End Sub

, и вот часть запроса:

WHERE
    tbl_geraete.Geraetename Like "*" &[forms]![frm_geraete]![FilterName] & "*" 
  OR
    IsNull([forms]![frm_geraete]![FilterName])<>False

Это прекрасно работает. Я могу продолжать печатать, и он всегда будет показывать соответствующие записи. Однако, когда я что-то набираю, и он не находит записей, я получаю сообщение об ошибке:

Ошибка выполнения 2185 Невозможно ссылаться на свойство или метод для элемента управления, если элемент управления не имеет фокуса.

Если я правильно понимаю, то почему-то set.focus не работает должным образом, если в форме нет записей. Любые идеи?

1 Ответ

2 голосов
/ 21 января 2020

Это происходит, если ваш Forms-Proptery AllowAdditions установлен на False. Если никакие записи не соответствуют фильтру, отображается новая пустая запись (вы можете проверить, добавив часы на Me и точку останова после Me.requery. Если вы установили AllowAdditions на True, Me.NewRecord будет True (- 1)). Если это запрещено, возникает ошибка.

Вы можете избежать этой ошибки, установив AllowAdditions в True или отметив .RecordCount. Если нет записей, не устанавливайте .SelStart и .SelLength

Private Sub FilterName_Change()
With Me
    .Requery
    With .FilterName
        .SetFocus
        If Me.Recordset.RecordCount > 0 Then
            .SelStart = Len(.Text)
            .SelLength = Len(.Text)
        End If
    End With
End With
End Sub

Имейте в виду, что Requery снова выполняет весь запрос, что может привести к отставанию, если время выполнения запроса больше чем 500 мс. Чтобы избежать Requery, используйте Filter, который будет повторно использовать набор записей и пропустить WHERE -выражение в SQL -Statement.

Private Sub FilterName_Change()
With Me
    .Dirty = False
    .Filter = "tbl_geraete.Geraetename LIKE '*" & .FilterName.Value & "*' OR " & Len(.FilterName.Value & vbNullString) & " = 0"
    .FilterOn = True
    With .FilterName
        .SetFocus
        If Me.Recordset.RecordCount > 0 Then
            .SelStart = Len(.Text)
            .SelLength = Len(.Text)
        End If
    End With
End With
End Sub

Чтобы сохранить ваш код простым, избегайте проверок на отсутствие ложных (<>False), вместо этого просто проверьте, является ли выражение True. If IsNull([forms]![frm_geraete]![FilterName]) Then и в sql, предпочитайте sql -выражение над vba-функцией: [forms]![frm_geraete]![FilterName] Is Null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...