2

以下のコード行を参照してください。

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 の場合、評価対象のフィールドに一致する Null 値を持つレコードがある場合でも、rst.NoMatch は常に true を返します。この動作は予期されるものですか、それとも別の根本的な問題がある可能性があります。msdnページを確認しましたが、この種の動作に関する情報は提供されませんでした。

4

2 に答える 2

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) 
于 2013-02-06T14:50:57.383 に答える
1

コントロール値が Null の場合、.FindFirst 基準は、対応するフィールドIs Nullがコントロールの値と等しいかどうかを確認する必要があります。2 つのコントロール/フィールドのペアを調べる、より単純な例から始めます。

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
于 2013-02-06T15:45:15.153 に答える