我用2个不同的组合框访问了一个表单。的用户 该工具可以在combobox1中选择:表(必须过滤),第二个combobox2是要过滤的条件(例如Language =“ EN”),并且此查询的输出必须位于tablex中。
我的缺点是我找不到将combobox1的值传递给sql语句的解决方案。第二个就像:[语言] = form!form!combo2.value,但是我找不到解决方案的部分是:从*(combobox1值)中选择*?如何将组合框值作为要过滤的表名传递?谁能帮我吗?
答案 0 :(得分:0)
您不能在查询的WHERE
子句中使用表名(这样做可能有一些骇人听闻的方法,但在任何情况下都不应使用)。
如果要从多个表的其中一个中选择数据,最好的选择是使用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打开记录集并对其进行处理。
答案 1 :(得分:0)
如果在组合框的afterupdate事件中运行代码,则可以这样设置SQL语句:
Private Sub combobox2_AfterUpdate()
someGlobalVar = "Select * FROM " & me.combobox1.value & " WHERE language = " & _
me.combobox2.value
End Sub
然后在需要的地方使用SQL字符串调用全局变量。