Неожиданное поведение с функцией.FindFirst VBA MS Access: .NoMatch всегда возвращает true
Просмотрите следующие строки кода ниже.
Dim rst As DAO.Recordset
Dim strSql As String
strSql = "SELECT * FROM MachineSettingsT;"
Set rst = DBEngine(0)(0).OpenRecordset(strSql)
rst.FindFirst "Microwave = " & "'" & Me.Microwave & "'" & " AND WashingMachine =" & "'" & Me.WashingMachine & "'" & " AND Element1 =" & "'" & Me.Element1 & "'" _
& "AND Element3 =" & "'" & Me.Element3 & "'" & "AND Dryer =" & "'" & Me.Dryer & "'" & "AND SettingID <>" & "'" & Me.SettingID & "'"
If Not rst.NoMatch Then
Cancel = True
If MsgBox("Setting already exists; go to existing record?", vbYesNo) = vbYes Then
Me.Undo
DoCmd.SearchForRecord , , acFirst, "[SettingID] = " & rst("SettingID")
End If
End If
rst.Close
Проблема: Если какое-либо из значений в выражении rst.FindFirst равно Null, то rst.NoMatch всегда возвращает true, даже если в оцениваемом поле есть запись с совпадающим значением Null. Это поведение следует ожидать или может быть другая основная проблема. Я проверил страницу msdn, но она не предоставила информацию о таком поведении.
2 ответа
Решение
Рассмотрим другой подход. Обратите внимание, что это для набора текстовых полей типа данных.
Dim rst As DAO.Recordset
Dim strSql As String
Dim db As Database
Set db=CurrentDB
strSql = "SELECT * FROM MachineSettingsT WHERE 1=1 "
''Set rst = db.OpenRecordset(strSql)
If not IsNull(Me.Microwave) Then
strWhere = " AND Microwave = '" & Me.Microwave & "'"
End if
If not IsNull(Me.WashingMachine) Then
strWhere = strWhere & " AND WashingMachine ='" & Me.WashingMachine & "'"
End if
If not IsNull(Me.Element1) Then
strWhere = strWhere & " AND Element1 ='" & Me.Element1 & "'"
End if
If not IsNull(Me.Element3) Then
strWhere = strWhere & " AND Element3 ='" & Me.Element3 & "'"
End if
If not IsNull(Me.Dryer) Then
strWhere = strWhere & " AND Dryer ='" & Me.Dryer & "'"
End if
Set rst = db.OpenRecordset(strSql & strWhere)
Когда контрольным значением является Null, ваш .FindFirst
Критерии должны проверить, является ли соответствующее поле Is Null
вместо того, чтобы равняться значению элемента управления. Начните с более простого примера, рассматривая две пары управления / поля.
Dim strCriteria As String
If IsNull(Me.Microwave) Then
strCriteria = " AND Microwave Is Null"
Else
strCriteria = " AND Microwave = '" & Me.Microwave & "'"
End If
If IsNull(Me.WashingMachine) Then
strCriteria = strCriteria & " AND WashingMachine Is Null"
Else
strCriteria = strCriteria & " AND WashingMachine = '" & Me.WashingMachine & "'"
End If
If Len(strCriteria) > 0 Then
' discard leading " AND "
strCriteria = Mid(strCriteria, 6)
Debug.Print strCriteria
rst.FindFirst strCriteria
End If