【问题标题】:MS Access: Query Reuse / Supplying Query Parameters Using VBAMS Access:使用 VBA 查询重用/提供查询参数
【发布时间】:2011-01-08 00:29:13
【问题描述】:

我有两个非常复杂的查询,它们显示在同一个表单上,并且使用该表单提供的多个参数。我想在 VBA 函数和/或其他表单中重用查询。因此,我有两个问题:

  1. 有没有办法编写 SQL 语句,以便查询动态确定要从中读取其参数的表单,而不必指定表单的名称?例如,类似于 Me!startDate,而不是 Forms!myForm!startDate。

  2. 有没有办法在将查询作为 DAO 记录集打开时为其提供参数?

【问题讨论】:

  • 哈哈!尽管我只是提出了是或否的问题,但我确实希望得到的不仅仅是是/否的答案。 :)

标签: ms-access vba


【解决方案1】:

在大多数情况下,Jet (Access) 不会像其他数据库遇到同样的注入问题,因此它可能适合使用 VBA 编写 SQL 并使用新的 sql 更新查询,或者设置表单的记录来源。

非常粗略:

sSQL = "SELECT f1, f2 FROM tbl WHERE f3 = '" & Me.txt3 & "'"

CurrentDB.QueryDefs("aquery").SQL = sSQL

或者,您可以使用参数:

查询:

PARAMETERS txtCompany Text(150);

SELECT <...>
WHERE Company = txtCompany

代码:

Set qdf = db.QueryDefs("QueryName")

qdf.Parameters!txtCompany = Trim(frm!txtCompany)

【讨论】:

  • 感谢您的建议。这当然是可能的,但我不知道它在这种特殊情况下是否有效。 “非常复杂”是指非常复杂的查询。它们目前被分解为几个较小(但仍然很复杂)的查询。我相信从维护的角度来看,(1)将所有这些查询合并为一个,(2)将它们从查询对象(从用户界面可见)移动到 vba 函数(其中是在幕后,需要创建一个庞大的字符串)。
  • 在那种情况下,也许添加参数会合适?
【解决方案2】:

我几乎从不在保存的 QueryDef 中定义参数或存储对表单/报告控件的引用。对我来说,这些应该在您使用保存的 QueryDef 的运行时提供。

一般来说,我在代码中即时编写 SQL,而不是使用保存的 QueryDefs。

另外,请记住,您可以在其 OnOpen 事件中设置表单的 Recordsource,这意味着您可以使用那里的条件来决定您希望针对特定目的进行哪些过滤。这可以根据外部表单来确定,也可以使用 DoCmd.OpenForm 的 OpenArgs 参数来确定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2017-02-27
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多