Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access MS访问通过取决于窗体值_Ms Access_Row_Pass Through - Fatal编程技术网

Ms access MS访问通过取决于窗体值

Ms access MS访问通过取决于窗体值,ms-access,row,pass-through,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; 但是,传递查询当然不支持对任何表单控件的引用 我已经读到有一种通过VBA的方法,但是我不知道如何将VBA与控

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

基本上我想这样做:

SELECT x.companyid, 
       x.companyname, 
       x.productid
  FROM x
 WHERE (((x.CompanyID) = [Forms]![Reporting]![CompanyID_Control]))
ORDER BY x.productid;
但是,传递查询当然不支持对任何表单控件的引用


我已经读到有一种通过VBA的方法,但是我不知道如何将VBA与控件的行源一起使用。

如果一个表被链接,您可以像访问表一样对它运行查询,这包括引用表单。因此:

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


正如Remou在他的回答中所说,链接表将使这更容易。但是,如果您有一个名为
MyQuery
的直通查询,则当
CompanyID\u控件的值更改时,您可以执行以下操作以使
mymboorListBox
控件的行源动态更新:

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\u控件的
AfterUpdate
属性设置为:
[事件过程]

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

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

在某些情况下,您可以使用passthrough查询作为源编写SQL SELECT,从而获得高效的结果:

  SELECT MyPassthrough.*
  FROM MyPassthrough
  WHERE [criteria here]
这很可能与在代码中编辑passthrough的QueryDef一样有效,并且只有当passthrough没有返回到它自己的选择需要过滤的字段时,它才会失败。它是否值得更改取决于您使用passthrough的目的以及它的复杂性


通常,我总是避免编辑保存的querydfs。考虑一下:你多久用DDL更改一个SQL Server视图?不经常!在Access中,它可能会导致轻微的膨胀(或者在某些情况下不是很小),我总是尽可能避免任何导致前端膨胀的事情。

我经过大量尝试才发现,这是一个简单的解决方案,使用您希望在表单中调用的内容创建passthrough,但将其保留为空,以便它调用所有内容,然后保存passthrough。关闭它,创建一个新的查询,并添加passthrouh-in中的每一列。现在在调用passthrough的新查询的条件中添加
[Forms]![报道]![CompanyID_Control]
)并确保表单处于打开状态,运行速度应与表单一样快,但现在您可以使用表单了

如何在VBA中更新查询的sql,以便发送值而不是引用?这也让我想知道为什么您没有简单地链接表。表是链接的。你能给我一个例子,说明我如何在VBA中更新查询的SQL,以便发送值而不是引用吗?你认为使用第一个选项时没有性能损失吗?特别是如果后端是非MS的,比如DB2或Oracle……据我所知,这并不是说很多,在Access中运行一个适度简单、可搜索的查询应该没有太大区别。如果有花哨的东西或表格扫描,通过可能是一个好主意。谢谢。因为我正试图通过直通查询直接访问后端,所以无法直接参照SQL区域中的表单控件编辑查询。我知道我需要使用VBA。我将把上面提到的VBA代码放在哪里?我已经添加了一些注释,但是把代码放在哪里取决于应用程序的工作方式。合适的常用事件包括控件的更新后事件和窗体的当前事件。我不确定我是否看到使用类似于链接表的传递以及使用从使用传递的条件中的控件派生的值来更改传递的WHERE子句的优点。太好了,我想我终于得到了它,谢谢大家。我必须使用DAO还是ADO?这是否必须在VBA中明确给出?如果您使用Jet,则应坚持使用DAO。MS在创建新的.mdb时来回地将哪个设置为默认设置。您可以在同一个项目中使用这两个库,但这两个库在对象和方法方面有很多重叠。如果将两者都设置为引用,则它们在引用列表中的顺序变得很重要。如果您想在代码中显式,您可以完全限定对方法或对象的引用,正如我在示例代码中所做的那样:
qdfas DAO.querydf
.Wow。几年后,这篇文章救了我一命。我正在绞尽脑汁想办法将表UDF用作Access报告的记录源。这个答案非常有效。这不是我在回答中建议的吗?你不应该选择它作为正确答案吗?还是你做了一些与我建议的不同的事情?
  SELECT MyPassthrough.*
  FROM MyPassthrough
  WHERE [criteria here]