MS Access通过依赖于表单值

时间:2011-02-08 20:18:26

标签: ms-access row pass-through

如何为依赖于表单中的其他值的行源分配传递查询?

基本上我想这样做:

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

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

我已阅读here有一个通过VBA的方法,但我不知道如何将VBA与控件的行源结合使用。

4 个答案:

答案 0 :(得分:3)

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

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

您还需要将AfterUpdate的{​​{1}}属性设置为:
CompanyID_Control

请注意,即使您使用Remou建议的链接表,您仍然需要[Event Procedure] AfterUpdate事件中的代码来刷新您的组合框/列表框RowSource:

CompanyID_Control

答案 1 :(得分:3)

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

  SELECT MyPassthrough.*
  FROM MyPassthrough
  WHERE [criteria here]

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

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

答案 2 :(得分:1)

如果表已链接,您只需对其进行查询,就像它是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"

答案 3 :(得分:0)

我只是在经过大量的尝试后想出来,这是一个简单的解决方案,创建你想要在表单中调用的东西,但留空,以便它调用所有内容,然后保存passthrough。关闭它并创建一个新查询并添加passthrouh中的每一列。现在在调用passthrough的新查询的条件中添加[Forms]![Reporting]![CompanyID_Control])并确保表单是打开的,应该运行得那么快但现在你可以使用你的表格

相关问题