我用两个不同的组合框制作了一个表格。此工具的用户可以在combobox1中选择:表(必须进行过滤),第二个combobox2是要过滤的条件(例如Language =“EN”),此查询的输出必须位于tablex中。
我所遇到的问题是我无法找到将combobox1的值传递给sql语句的解决方案。第二个就是:where [language] = forms!form!combo2.value,但是我找不到解决方案的部分是:select * from(combobox1 value)?如何将组合框值作为要过滤的表名传递?谁能帮帮我吗?
您不能在查询的WHERE
子句中拥有表名(可能有一种hacky方式来执行此操作,但在任何情况下都应该不鼓励)。
如果要从多个表中的一个中选择数据,最好的办法是使用VBA动态生成SQL。一种方法(特别是如果您希望/需要在最终用户的数据表视图中打开您的查询)是一个“虚拟”查询,您可以使用表单选择填充SQL。
例如,假设我们有2个表:tTable1
和tTable2
。这两个表都有一个名为Language
的列。您希望用户使用可选过滤器从第一个或第二个表中选择数据。
press
事件的代码应如下所示:
Private Sub cmdRunQuery_Click()
Dim sSQL As String
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
If Not IsNull(Me.cboTableName.Value) Then
sSQL = "SELECT * FROM " & Me.cboTableName.Value
If Not IsNull(Me.cboFilter.Value) Then
sSQL = sSQL & vbNewLine & _
"WHERE Language=""" & Me.cboFilter & """"
End If
Set db = CurrentDb
Set qdf = db.QueryDefs("qDummyQuery")
qdf.SQL = sSQL
DoCmd.OpenQuery qdf.Name
End If
End Sub
请注意如何生成SQL。当然,使用此方法,您需要保护自己免受SQL注入:您应该只允许组合框中的预定义值。但这可以作为概念的证明。
如果您不需要显示查询结果,则不需要使用虚拟查询:您可以根据SQL和进程打开记录集。
如果在组合框的afterupdate事件中运行代码,则可以设置如下的SQL语句:
Private Sub combobox2_AfterUpdate()
someGlobalVar = "Select * FROM " & me.combobox1.value & " WHERE language = " & _
me.combobox2.value
End Sub
然后在任何需要的地方使用SQL字符串调用全局。