2014-09-04 75 views
0

我的表单接受用户输入的数据,构造一条SQL语句并返回结果。如果找不到匹配项,我想要弹出一个消息框。SQL没有找到匹配项导致MsgBox

我当前的代码/主意:

If qdf.sql = 0 Then 
     MsgBox "No clients matching your information." & _ 
     vbCrLf & "have been found. Please try again." & _ 
     , vbCritical, "No Matches" 
    Else 
     DoCmd.OpenForm "frmSearchResults" 
     Me.Visible = False 
End If 

我无法找出正确的语法if qdf.sql = 0

UPDATE:全查询

Private Sub cmdSearch_Click() 

'On Error GoTo cmdSearch_Click_err 

Dim db As Database 
Dim strSQL As String 
Dim rs As DAO.Recordset 
Dim qdf As QueryDef 
Dim strClientID As String 
Dim strLastName As String 
Dim strFirstName As String 
Dim strDOB As String 

Set db = CurrentDb 
Set rs = db.OpenRecordset(qdf.sql) 

' call QueryCheck module to determine if query exists 
If Not QueryExists("qrySearch") Then 
    Set qdf = db.CreateQueryDef("qrySearch") 
Else 
    Set qdf = db.QueryDefs("qrySearch") 
End If 

' handle nulls in the user's entries 
    If IsNull(Me.txtClientID.Value) Then 
     strClientID = " Like '*' " 
     Else 
     strClientID = "='" & Me.txtClientID.Value & "' " 
    End If 

    If IsNull(Me.txtLastName.Value) Then 
     strLastName = " Like '*' " 
     Else 
     strLastName = " Like '" & Me.txtLastName.Value & "*' " 
    End If 

    If IsNull(Me.txtFirstName.Value) Then 
     strFirstName = " Like '*' " 
     Else 
     strFirstName = " Like '*" & Me.txtFirstName.Value & "*' " 
    End If 

    If IsNull(Me.txtDOB.Value) Then 
     strDOB = " Like '*' " 
     Else 
     strDOB = "='" & Me.txtDOB.Value & "' " 
    End If 

strSQL = "SELECT Clients.* " & _ 
     "FROM Clients " & _ 
     "WHERE Clients.clientid" & strClientID & _ 
     "AND Clients.namelast" & strLastName & _ 
     "AND Clients.namefirst" & strFirstName & _ 
     "AND Clients.birthdate" & strDOB & _ 
     "ORDER BY Clients.namelast,Clients.namefirst;" 

Debug.Print strSQL 

' check to see if the results form is open and close if it is 
DoCmd.Echo False 

If Application.SysCmd(acSysCmdGetObjectState, acForm, "frmSearchResults") = acObjStateOpen Then 
    DoCmd.Close acForm, "frmSearchResults" 
End If 

' run SQL statment 
qdf.sql = strSQL 

' check for no matches found 
    If rs.RecordCount = 0 Then 
     MsgBox "No clients matching your information were found." & _ 
     vbCrLf & "Please search again.", vbInformation, "No Matches" 
    Else 
     DoCmd.OpenForm "frmSearchResults" 
     Me.Visible = False 
    End If 

'cmdSearch_Click_exit: 
' DoCmd.Echo True 
' Set qdf = Nothing 
' Set db = Nothing 

'Exit Sub 

'cmdSearch_Click_err: 
'  MsgBox "An unexpected error has occurred." & _ 
'  vbCrLf & "Please note of the following details and contact the EIIS support desk:" & _ 
'  vbCrLf & "Error Number: " & Err.Number & _ 
'  vbCrLf & "Description: " & Err.Description _ 
'  , vbCritical, "Error" 
' Resume cmdSearch_Click_exit 

End Sub 

回答

0

If qdf.sql = 0 then不会执行正确检查的原因是qdf包含有关您的查询的信息,例如您在该语句中检查但未检查结果的SQL文本。

要获得查询结果,您需要在生成查询后将其分配给Recordset。所以首先建立您的查询,然后将其分配给记录集。

Dim db as DAO.Database 
Set db = CurrentDb 

Dim qdf as DAO.Querydef 
Set qdf = db.CreateQueryDef("qrySearch") 

Dim rs as DAO.Recordset 
Set rs = CurrentDb.OpenRecordset(qdf.sql) 

然后,您可以检查您的记录集已返回。

If rs.RecordCount = 0 then 

那么,你有你的线' run SQL statment你想放置Set rs线。

+0

我收到错误'运行时错误'91':对象变量或块变量未设置。 set rs行抛出错误。如果这会有帮助,我已经用完整查询更新了我的帖子。 – turkaffe 2014-09-05 12:47:07

+1

您正在收到此错误,因为您在打开它或修改SQL之前试图将查询def分配给记录集。你需要在'qdf.sql = strSQL'的行下面放置'Set rs'行 – Zaider 2014-09-05 13:59:33

0

如果你有,你可以使用像

dim strSQL as String 
dim conn as Connection 
dim cmd as Command 
dim rs as Recordset 

任何ADO经验(建立连接/指令这里)

cmd.commandtext = (your select query) 
set rs = Command.execute 

if rs.eof then   

(或者,如果rs.recordcount = 0但是返回的RecordCount需要正确的CursorType - 通常ADOPENSTATIC - 使用)

'msgbox no match 

else 
    'do stuff 

如果任何这是外星人,然后发布实际的查询,我会尽力并给你完整的代码。祝你好运!