Идентичный код ApplyFilter работает при загрузке отчета, но не работает при нажатии кнопки формы - PullRequest
0 голосов
/ 29 мая 2018

Я работаю над формой, которая фильтрует данные запроса по дате рождения.Должно быть просто.Сначала я собирался сделать это как отчет, но решил, что форма будет лучше.В отчете мой код фильтра работает нормально;он проверяет значения из несвязанных полей в форме выбора и фильтрует соответственно.Примерно так:

Private Sub Report_Load()

Dim start_dob As String
Dim end_dob As String

If CurrentProject.AllForms("frm_Birth_range_selector").IsLoaded = True Then
    start_dob = Forms!frm_Birth_range_selector!txt_DOB_start
    end_dob = Forms!frm_Birth_range_selector!txt_DOB_end
    Me.FilterOn = True
    DoCmd.ApplyFilter , "DOB >= '" & start_dob & "' and DOB <= '" & end_dob & "'"
End If

End Sub

Я пытался сделать то же самое с формой, используя несвязанные поля для себя и кнопку, чтобы применить фильтр.Тот же запрос.Тот же код за исключением ссылки на разные поля.Те же свойства ящиков, я даже пробовал вставлять копии из формы селектора, чтобы убедиться, что ничего не пропустил.Этот код возвращает ошибку 3464 во время выполнения, ошибку Data type mismatch in criteria expression:

Private Sub Command33_Click()

Dim start_dob As String
Dim end_dob As String

start_dob = Me.txt_DOB_start
end_dob = Me.txt_DOB_end
Me.FilterOn = True
DoCmd.ApplyFilter , "DOB >= '" & start_dob & "' and DOB <= '" & end_dob & "'"

End Sub

Я попытался заменить Me. на Forms!frm_birth_log!.Без изменений.

1 Ответ

0 голосов
/ 30 мая 2018

Эта ошибка может быть связана с датой - если день> 12, ваш код может работать неправильно, потому что дата должна быть в американском формате.Используйте что-то вроде этого:

Private Sub Command33_Click()
    Dim start_dob As Date
    Dim end_dob As Date

    If IsDate(Me.txt_DOB_start) And IsDate(Me.txt_DOB_end) Then
        start_dob = CDate(Me.txt_DOB_start)
        end_dob = CDate(Me.txt_DOB_end)
        Me.Filter = "DOB >= #" & Format(start_dob, "mm\/dd\/yyyy") & "# and DOB <= #" & Format(end_dob, "mm\/dd\/yyyy") & "#"
        Me.FilterOn = True
    Else
        MsgBox "Invalid date"
    End If
End Sub

И я бы рекомендовал всегда использовать директиву Option Explicit в каждом модуле.С этой директивой компилятор выдаст вам ошибку, потому что вы объявили send_dob и использовали end_dob.Такие добрые ошибки иногда приводят к непредсказуемым результатам и их трудно найти.

...