【问题标题】:MS Access pass through dependent on form valueMS Access 传递依赖于表单值
【发布时间】:2011-06-23 16:51:06
【问题描述】:

如何将传递查询分配给依赖于表单中另一个值的行源?

基本上我想这样做:

SELECT x.companyid, 
       x.companyname, 
       x.productid
  FROM x
 WHERE (((x.CompanyID) = [Forms]![Reporting]![CompanyID_Control]))
ORDER BY x.productid;

当然,传递查询不支持对任何表单控件的引用。

我已经阅读here 说有一种通过 VBA 的方法,但是我不知道如何将 VBA 与控件的 Row Source 结合使用。

【问题讨论】:

  • 如何在 VBA 中更新查询的 sql,以便发送值而不是引用?
  • 这也让我想知道为什么你没有简单地链接表格。
  • 表已链接。你能给我一个例子,说明如何在 VBA 中更新查询的 SQL,以便我可以发送一个值而不是引用?

标签: ms-access row pass-through


【解决方案1】:

正如 Remou 在他的回答中所说,链接表将使这更容易。但是,如果您有一个名为 MyQuery 的传递查询,则可以执行以下操作以使 MyComboOrListBox 控件的 RowSource 在 CompanyID_Control 的值更改时动态更新:

Private Sub CompanyID_Control_AfterUpdate()
Dim SQL As String, qdf AS DAO.QueryDef
    Set qdf = CurrentDB.QueryDefs("MyQuery")
    qdf.SQL = " SELECT  x.companyid, x.companyname, x.productid " & _
              " FROM x " & _
              " WHERE x.CompanyID =" & Me.CompanyID_Control & _
              " ORDER BY x.productid;"
    Me.MyComboOrListBox.RowSource = "MyQuery"
End Sub

您还需要将CompanyID_ControlAfterUpdate 属性设置为:
[Event Procedure]

请注意,即使您按照 Remou 的建议使用链接表,您仍然需要 CompanyID_ControlAfterUpdate 事件中的代码来刷新您的组合框/列表框行源:

Private Sub CompanyID_Control_AfterUpdate()
    Me.MyComboOrListBox.Requery
End Sub

【讨论】:

  • 太好了,我想我终于明白了,谢谢大家。我必须使用 DAO 还是 ADO?是否必须在 VBA 中明确给出?
  • 如果您使用 Jet,您应该坚持使用 DAO。在创建新的 .mdb 时,MS 反复选择了将哪个设置为默认值。您可以在同一个项目中同时使用这两个库,但是两个库之间在对象和方法方面存在很多重叠之处。如果您将两者都设置为参考,那么它们在参考列表中的顺序就变得很重要。如果您想在代码中明确说明,您可以完全限定对方法或对象的任何引用,就像我在示例代码中所做的那样:qdf As DAO.QueryDef
  • 哇。多年后,这篇文章救了我的培根。我正在努力寻找一种方法来使用表 UDF 作为 Access 报告的记录源。这个答案非常有效。
【解决方案2】:

在某些情况下,您将通过使用传递查询作为 FROM 源编写 SQL SELECT 来获得有效的结果:

  SELECT MyPassthrough.*
  FROM MyPassthrough
  WHERE [criteria here]

这很可能与在代码中编辑 passthrough 的 QueryDef 一样有效,并且只有当 passthrough 未在其自己的 SELECT 中返回您需要过滤的字段时,它才会失败。是否值得更改取决于您使用直通的目的以及它的复杂程度。

一般来说,我总是避免编辑保存的 QueryDef。考虑一下:您多久会使用 DDL 更改 SQL Server VIEW?不经常!在 Access 中,它可能会导致轻微的膨胀(或者在某些情况下不是那么轻微),而且我总是尽可能避免导致前端膨胀的任何事情。

【讨论】:

    【解决方案3】:

    如果一个表是链接的,您可以对它运行一个查询,就像它是一个 Access 表一样,这包括引用表单。所以:

    SELECT * FROM MyLinkedTable
    WHERE ID = Forms!MyForm!MyID
    

    会正常工作。

    要永久更改查询的 SQL,可以使用 QueryDef 的 SQL 属性:

     Set qdf = CurrentDB.QueryDefs("MyQuery")
     qdf.SQL = "SELECT * FROM MyLinkedTable " & _
               "WHERE ID = " & Forms!MyForm!MyID  ''Or on MyForm, Me.MyID
    

    您还可以将表单记录源或组合或列表框的行源设置为 SQL 字符串,使用链接表很简单:

     Me.RecordSource = "SELECT * FROM MyLinkedTable " & _
               "WHERE ID = " & Forms!MyForm!MyID  ''Or on MyForm, Me.MyID
    

    或者

     Me.MyCombo.RowSource = "SELECT * FROM MyLinkedTable " & _
               "WHERE ID = Forms!MyForm!MyID"
    

    【讨论】:

    • 您认为使用第一个选项时没有性能损失吗?特别是如果后端不是 MS,比如 DB2 或 Oracle...
    • 据我了解,这并没有说太多,在 Access 中运行一个适度简单、可搜索的查询应该没有太大区别。如果有花哨的东西或表扫描,传递可能是个好主意。
    • 谢谢。因为我试图通过直通查询直接访问后端,所以我无法直接参考 SQL 区域中的表单控件编辑查询。我知道我需要使用 VBA。我会把你上面提到的 VBA 代码放在哪里?
    • 我已经添加了一些注释,但是你把代码放在哪里取决于你的应用程序是如何工作的。合适的常用事件包括控件的 After Update 事件和表单的 Current 事件。
    【解决方案4】:

    经过大量尝试,我才弄清楚,这是一个简单的解决方法,使用您想在表单中调用的任何内容创建您的传递,但将其留空,以便调用所有内容,然后保存传递。关闭它并创建一个新查询并添加来自 passthrouh 的每一列。现在在调用 passthrough 的新查询的条件中添加 [Forms]![Reporting]![CompanyID_Control]) 并确保表单是打开的,应该运行一样快但现在你可以使用你的表格

    【讨论】:

    • 这不是我在回答中建议的吗?你不应该选择它作为正确答案吗?还是您做了与我建议的不同的事情?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2019-11-04
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多