我相信我有一个非常简单的问题,这将有助于我完成我的项目。我通常不会使用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后运行。
答案 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。
修改强>
在这种情况下,我肯定会去模板路线。
SELECT TOP $c1$ col1 FROM tblx UNION SELECT TOP $c2$ col1 FROM TBLY UNION ...
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