在各种半相关教程试图找出如何将表单上驻留的组合框字段发送到查询之后,我已经陷入了混乱。
我正在使用该查询生成联系人详细信息的子集,从中为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子句中的语法错误
有什么建议吗?
答案 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.NID
和qryAll
在cmdResults的OnClick()事件中,您可以这样使用它:
Dim strSQL As String
strSQL = "SELECT * FROM qryAll"
strSQL = strSQL & GetWhere()
[do with strSQL whatever you want]
如果两个组合框都没有选中值,上面的代码将返回所有记录。
对于你的cmbClear,你只需要将两个组合框设置为Null的代码。