我有一个Access DB,还有表格和表单。在一个表中,我有客户;在第二个表中,作为子数据表,在第一个表中,我有标记。我创建了一个表单,它显示客户列表和子数据表,该表显示客户拥有的所有标记。我想根据主数据表的字段和标签的子数据表进行筛选。
例如,在customer_name = "Peter“和tag =”邻居“的地方,我看到了这段代码,但在尝试使用它时失败了。Filter on Subdatasheet
当尝试设置mainDS = Me.Controls(dataSheetName).Form时,在哪里可以找到datasheetName?我尝试输入表单名称、表名、在表单属性中搜索,但没有找到解决方案。
发布于 2022-10-07 07:11:55
根据您的问题,这听起来好像您是新的访问,您应该检查表规范化。
一切都从规范化的表结构开始。不幸的是,您从相对困难的开始--多到多关系。每个客户都可以有多个标签,这是一对多的关系,但是除非客户有相同的标签,否则比较客户就没有什么意义了,这意味着每个标签也可以有很多客户。例如,使用相应的主键和外键创建表,并通过点击色带并选择relationships工具告诉access关系:

CustomersTags表中的原始数据是您感兴趣的,但它并不是用户友好的。
----------------------------------------------------------------
| CustomerTagID | CustomerID | TagID |
----------------------------------------------------------------
| 1 | 1 | 1 |
----------------------------------------------------------------
| 2 | 3 | 1 |
----------------------------------------------------------------
| 3 | 2 | 3 |
----------------------------------------------------------------
| 4 | 2 | 4 |
----------------------------------------------------------------
| 5 | 2 | 5 |
----------------------------------------------------------------
| 6 | 3 | 1 |
----------------------------------------------------------------
| 7 | 2 | 1 |
----------------------------------------------------------------
| 8 | 3 | 5 |
----------------------------------------------------------------
| 9 | 2 | 2 |这就是我们使用表单输入和查看数据的原因。为了提高速度,选择CustomersTags并点击create:

这是不对用户友好的,所以我们不显示主键和替换(右键单击并选择更改)所有的i‘d与用户友好的组合框。我还将表单格式更改为数据表。

我继续使表单更漂亮,并在标题中添加两个未绑定的组合框来过滤表单。您也可以使用列表框或复选框等来完成此操作。例如,一个多选择列表框,以便您可以选择多个标签。在所有情况下,只需设置窗体筛选器即可。

Option Compare Database
Option Explicit
'select the combobox afterupdate property to get these events
'you can use macro's if you want
'the exact code is very dependent on things like whether you have default values. I just show the most necessary case
Private Sub cmbCustomer_AfterUpdate()
If (IsNull(Me.cmbCustomer) Or IsNull(Me.cmbTag)) Then
'do nothing
Else
'filter the forms record source
Me.filter = "(CustomerID = " & Me.cmbCustomer & ") AND TagID = " & Me.cmbTag
Me.FilterOn = True
End If
End Sub
Private Sub cmbTag_AfterUpdate()
If (IsNull(Me.cmbCustomer) Or IsNull(Me.cmbTag)) Then
'do nothing
Else
'the filter is just the WHERE PART of an sql statement without the where
Me.filter = "(CustomerID = " & Me.cmbCustomer & ") AND TagID = " & Me.cmbTag
Me.FilterOn = True
End If
End Sub接下来,我将表单格式切换到连续表单并继续精化,因为令我惊讶的是数据表格式阻止了设置筛选字符串。


以下是制作组合框的一些指导,组合框用于显示用户友好的值,而不是ID。例如,我们不显示原始的CustomerID,而是显示Customer_name,但是组合框中的值是CustomerID。未绑定组合框的值是与用户选择的用户友好的CustomerID对应的Customer_Name。无论组合框是绑定的还是未绑定的,您都以相同的方式设置它们。从某个表或查询中选择一组列,然后声明要显示多少列及其宽度。若要隐藏列,请将其宽度设置为0。列的顺序决定数字的顺序。我绑定到表,这两个表都是ID,然后是用户友好的描述,所以列宽度是0,1。

此示例允许选择不可能的Customer和tag组合,这将导致错误。避免这种情况的一种方法是在选择第一个值时设置备用组合框的行源。例如,当您选择一个客户时,您会限制可以在下一个组合框中选择的标记。这是级联式组合框:
Option Compare Database
Option Explicit
Private Sub cmbCustomer_AfterUpdate()
'it helps to use the query designer to get the sql right
Me.cmbTag.RowSource = "SELECT Tags.TagID, Tags.FriendlyDescription" & _
" FROM Tags INNER JOIN (Customers INNER JOIN CustomersTags ON Customers.CustomerID = CustomersTags.CustomerID)" & _
" ON Tags.TagID = CustomersTags.TagID WHERE (((CustomersTags.CustomerID)= " & Me.cmbCustomer & "))"
Me.cmbTag.Visible = True
End Sub
Private Sub cmbTag_AfterUpdate()
Me.filter = "(CustomerID = " & Me.cmbCustomer & ") AND TagID = " & Me.cmbTag
Me.FilterOn = True
Me.cmbCustomer.SetFocus
Me.cmbTag.Visible = False 'quick and dirty reset 'can't invis a focused control
Me.Refresh
End Subhttps://stackoverflow.com/questions/73952618
复制相似问题