【问题标题】:Passing value from the textbox to "TOP n" clause in SQL query将值从文本框传递到 SQL 查询中的“TOP n”子句
【发布时间】:2016-11-15 08:09:30
【问题描述】:

我相信我有一个非常简单的问题,这将帮助我完成我的项目。我通常不使用 Access,但我被要求帮助某人,所以我在这里。

我的问题:我有一个名为“Start”的 Form1,其中有一个名为“Kat1”的 TextBox1。 我也有一个 SQL 查询:

SELECT TOP 3 tbl.Example FROM TABLE TBL

我想要实现的是让用户在“Kat1”中写入一些数字,以便查询返回这么多的顶部行。

我希望有一种不使用 VBA 的方法,因为我的查询相当复杂,有更多的文本框,更多的子查询选择顶行等。

我尝试输入SELECT TOP [Start]![Kat1]!Value 或类似名称。我的语法可能有问题,或者这一切都错了,还有另一种方法。 提前感谢您的帮助。

编辑: 对于未来的读者;)这就是我用 VBA 解决它的方法:

Sub Query_Change()

SQLstring = "SELECT TOP KAT1 col1 FROM TBL UNION SELECT TOP KAT2 col1 FROM TBL etc..."`

CurrentDb.QueryDefs("MyQuery").SQL = SQLstring

For i = 1 To 4
    SQLstring = Replace(SQLstring, "KAT" & i, Forms!Start!("Kat" & i).Value)
Next i

CurrentDb.QueryDefs("MyQuery").SQL = SQLstring
End Sub

代码将在用户将值放入文本框后运行。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    这在 Access 查询中是不可能的,“TOP n”部分不能带变量/参数。

    (在 SQL Server 中可以,请参阅Dynamic SELECT TOP @var In SQL Server

    您需要 VBA 才能做到这一点。要么,因为它位于 SELECT 语句的第一部分,请阅读原始 Querydef.SQL 并对其进行编辑(替换第三个“单词”)。

    或者有一个带有模板 SQL 代码的表,例如

    SELECT TOP $count$ FROM table WHERE ...
    

    $count$ 替换为您的号码并将结果写入查询定义。

    编辑

    在这种情况下,我肯定会走模板路线。

    1. 使用 TOP n 的示例值构建查询“qUnionTop”。
    2. 将 SQL 复制到存储模板 SQL 的表中。
    3. 使用变量编辑 SQL,例如
      SELECT TOP $c1$ col1 FROM tblx UNION SELECT TOP $c2$ col1 FROM TBLY UNION ...
    4. 在打开查询之前运行如下代码:
    Sub DynamicQueryFromTemplate()
    
        Dim S As String
        Dim i As Long
    
        ' Read template SELECT SQL from tblTemplates
        S = DLookup("Sql", "tblTemplates", "Key = 'qUnionTop'")
        ' Replace $c[x]$
        For i = 1 To 4
            S = Replace(S, "$c" & i & "$", Forms!Start("Kat" & i).Value)
        Next i
    
        CurrentDb.QueryDefs("qUnionTop").SQL = S
    
    End Sub
    

    当您的查询需要更改时,重复步骤 2.+3。

    【讨论】:

    • 好的,所以我应该使用 VBA(这很糟糕)。你能指导我一点吗?在我的表单中,我有 4 个文本框(kat1、kat2、kat3、kat4),因此用户可以输入 4 个值,这些值稍后会进入查询:SELECT TOP kat1.value col1 FROM tblx UNION SELECT TOP kat2.value col1 FROM TBLY UNION etc 创建一个将转到 n 的 VBA 脚本是个好主意吗? - 查询中的第一个位置(放置在 TOP 之后和列名称之前)并将其替换为 TextBox 值?然后用不同的 n 值重复 4 次?
    • 感谢您的帮助。我通过在我的 SQL 中放置一些占位符来避免构建另一个查询,这些占位符稍后会替换为您的 VBA 代码并进行一些调整。
    【解决方案2】:

    在表单属性上转到事件选项卡。在on load 事件中,您应该创建一个如下所示的事件过程:

    Option Compare Database
    
    Private Sub Command0_Click()
    Dim kat As String
    
    kat = "SELECT TOP " +Me.Kat1.Value + "TableName.TableField "
    
    
    CurrentDb.QueryDefs("QueryName") .SQL = kat
    On Error Resume Nest
    DoDmd.RunQuery "QueryName"
    End Sub
    
    Private Sub Form_Load()
    End Sub
    
    Private Sub testrun()
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2016-04-22
      相关资源
      最近更新 更多