从窗体上的多个组合框控制Access SQL查询

时间:2011-03-25 11:55:39

标签: sql ms-access

在各种半相关教程试图找出如何将表单上驻留的组合框字段发送到查询之后,我已经陷入了混乱。

我正在使用该查询生成联系人详细信息的子集,从中为mailshot广告系列制作标签。我希望组合框可以为null或结合使用,因此我可以对选择组合进行过滤。 我让我的组合框执行查找以检索它们的值,并找到了一个使用IS NULL的好教程,但我不明白VBA必需创建'view results'和'clear form'命令按钮。

这些是我在查询字段条件中引用的组合框的名称:

[Forms]![SearchForm]![cboStatus]
[Forms]![SearchForm]![cboNewsletter]

这些字段分别称为状态和描述。

我正在过滤的查询称为

qryFilter

这些是我的命令按钮的名称:

cmdResults 
cmdClear

cmdResults应该将每个组合框值发送给查询,无论它们是空还是已选中,但我无法使其工作并且清除应该使组合框为空。

我希望扩展这个以包含更多标准,但我想让它先工作!

感谢任何帮助,提前谢谢, 罗布

编辑: 试图改编帕特里克的代码:

Private Sub cmdResults_Click()
 Dim tsSql As String
 tsSql = "SELECT * FROM qryAll WHERE "

If cboNewsletter <> "" And Not IsNull(cboNewsletter) Then
 tsSql = tsSql & "qryCorrespondence.NID = " & cboNewsletter & " "
    If (cboStatus <> "" And Not IsNull(cboStatus)) Then
    tsSql = tsSql & " AND "
    End If
 End If

If cboStatus <> "" And Not IsNull(cboStatus) Then
  tsSql = tsSql & "tblCustomers.Status = " & cboStatus & " "
End If

Dim rs As New ADODB.Recordset
rs.Open tsSql, CurrentProject.AccessConnection, 3, 3
End Sub

最后一行给出了一个错误,它突出显示了调试器中的以下行:

    rs.open tsSql, CurrentProject.AccessConnection, 3, 3,

并说WHERE子句中的语法错误

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

在Access中确实没有干净的方法。

假设我有三个名为的组合框:

cmbName cmbCity cmbState

一个名为:

的按钮

btnDoWork

现在如果我想根据按钮单击组合按钮的内容运行查询,请单击它可能如下所示:

Private Sub btnDoWork_Click()
     Dim tsSql as String
     tsSql = "SELECT * FROM tblUser WHERE "

  If cmbName <> "" and Not ISNull(cmbName) Then
     tsSql = tsSql & "user_name = " & cmbName & " "
    if (cmbCity <> "" and Not IsNull(cmbCity)) or (cmbState <> "" and Not IsNull(cmbState))
         tsSql = tsSql & " AND "
    end if
 End If

 if cmbCity <> "" and not isnull(cmbcity) then
      tsSql = tsSql & "city = " & cmbcity & " "
      if cmbState <> "" and Not IsNull(cmbState) then
           tsSql = tsSql & " AND "
      end if
 end if

if cmbState <> "" and not is null(cmbState) then
      tsSql = tsSql & "state = " & cmbState
end if

MyControl.RowSource = tsSql

End Sub 

如果您愿意,我确信您可以将其更改为包含空值。我的版本不包括空值。

如果您尝试在多列列表框或其他控件中返回结果,则需要确保控件Row Source Type设置为Table / Query,并且您将设置控件源:< / p>

MyControl.RowSource = tsSql

答案 1 :(得分:2)

这是“按表单查询”界面的典型情况。我的做法是在表单的模块中创建一个子例程来编写WHERE子句,如下所示:

  Private Function GetWhere() As String
    Dim strTemp As String

    If Not IsNull(Me!cboStatus) Then
       strTemp = strTemp & " AND tblCustomers.Status = " & Chr(34) & Me!cmbStatus & Chr(34)
    End If
    If Not IsNull(Me!cboNewsletter) Then
       strTemp = strTemp & " AND qryCorrespondence.NID = " & Chr(34) & Me!cboNewsletter & Chr(34)
    End If
    strTemp = Mid(strTemp, 6)
    If Len(strTemp) > 0 Then
       GetWhere = " WHERE " & strTemp
    End If
  End Function

(上面的代码假定tblCustomers.Status的SELECT语句中有qryCorrespondence.NIDqryAll

在cmdResults的OnClick()事件中,您可以这样使用它:

  Dim strSQL As String

  strSQL = "SELECT * FROM qryAll"
  strSQL = strSQL & GetWhere()

  [do with strSQL whatever you want]

如果两个组合框都没有选中值,上面的代码将返回所有记录。

对于你的cmbClear,你只需要将两个组合框设置为Null的代码。