3

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

基本上我想这样做:

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

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

我在这里读到有一种通过 VBA 的方法,但是我不知道如何将 VBA 与控件的行源结合使用。

4

4 回答 4

3

正如 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

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

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

Private Sub CompanyID_Control_AfterUpdate()
    Me.MyComboOrListBox.Requery
End Sub
于 2011-02-10T21:29:27.963 回答
3

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

  SELECT MyPassthrough.*
  FROM MyPassthrough
  WHERE [criteria here]

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

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

于 2011-02-11T23:41:23.167 回答
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"
于 2011-02-10T21:19:27.757 回答
0

I just figured it out after tons of trying, this is an easy fix, create your passthrough with what ever you want to call in the form but leave it blank so it calls everything and then save the passthrough. Close that out and create a new query and add every column from the passthrouh in. Now in the criteria of the new query thats calling the passthrough add [Forms]![Reporting]![CompanyID_Control]) and just make sure the form is open, should run just as fast but now you can use your forms

于 2011-03-09T21:40:46.030 回答