如何为依赖于表单中的其他值的行源分配传递查询?
基本上我想这样做:
SELECT x.companyid,
x.companyname,
x.productid
FROM x
WHERE (((x.CompanyID) = [Forms]![Reporting]![CompanyID_Control]))
ORDER BY x.productid;
但是,传递查询当然不支持对任何表单控件的引用。
我已阅读here有一个通过VBA的方法,但我不知道如何将VBA与控件的行源结合使用。
答案 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]
)并确保表单是打开的,应该运行得那么快但现在你可以使用你的表格