将值从文本框传递到" TOP n" SQL查询

时间:2016-11-15 08:09:30

标签: sql ms-access

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

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

SELECT TOP 3 tbl.Example FROM TABLE TBL

我想要实现的是让用户在" Kat1"中写一些数字。以便Query返回这么多顶行。

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

我尝试了SELECT TOP [Start]![Kat1]!Value或simmilar。我的语法可能有问题,或者这可能是错的,还有另一种方法。 提前感谢您的帮助。

修改 对于未来的读者;)这就是我用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

代码将在用户将值放入TextBox后运行。

2 个答案:

答案 0 :(得分:2)

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

(可以在SQL Server中查看Dynamic SELECT TOP @var In SQL Server

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

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

SELECT TOP $count$ FROM table WHERE ...

$count$替换为您的号码,并将结果写入querydef。

修改

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

  1. 使用TOP n的样本值构建查询“qUnionTop”。
  2. 将SQL复制到存储模板SQL的表。
  3. 使用变量编辑SQL,例如
    SELECT TOP $c1$ col1 FROM tblx UNION SELECT TOP $c2$ col1 FROM TBLY UNION ...
  4. 在打开查询之前运行如下代码:
  5. 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.

答案 1 :(得分:0)

在表单属性上,转到“事件”选项卡。在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