-1

我用 2 个不同的组合框制作了一个表单。此工具的用户可以在组合框 1 中选择:表(必须过滤)和第二个组合框 2 是要过滤的条件(例如 Language=“EN”),并且此查询的输出必须位于 tablex .

我所拥有的问题是我找不到将combobox1 的值传递给sql 语句的解决方案。第二个就像:where [language] = forms!form!combo2.value,但我找不到解决方案的部分是:select * from (combobox1 value)?如何将组合框值作为要过滤的表名传递?谁能帮帮我吗?

4

2 回答 2

0

如果您在组合框的 afterupdate 事件中运行代码,您可以设置如下 SQL 语句:

Private Sub combobox2_AfterUpdate()
   someGlobalVar = "Select * FROM " & me.combobox1.value & " WHERE language = " & _
         me.combobox2.value
End Sub

然后在需要的地方使用 SQL 字符串调用全局。

于 2019-02-20T20:25:32.783 回答
0

您不能在WHERE查询的子句中使用表名(可能有一种很老套的方法,但无论如何都不鼓励这样做)。

如果要从多个表中的 1 个表中选择数据,最好的办法是使用 VBA 动态生成 SQL。执行此操作的一种方法(特别是如果您希望/需要在数据表视图中为最终用户打开查询)是有一个“虚拟”查询,您可以使用表单选择填充其 SQL。

例如,假设我们有 2 个表:tTable1tTable2. 这两个表都有一个名为Language. 您希望用户使用可选过滤器从第一个或第二个表中选择数据。

  1. 创建一个包含 2 个组合框的表单:一个用于表格,一个用于标准选择。听起来您已经完成了这一步。
  2. 在此表单上有一个用于打开查询的按钮。此按钮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 的记录集并对其进行处理。

于 2019-02-20T20:18:13.373 回答