回复您的评论:
当您使用“查找”字段时,您将在表之间强制建立新的关系。
避免访问的十诫中列出的问题(特别是:表中查找字段的弊端)的最佳方法是手动创建关系,然后使用它们在表单或报告中创建足够的“查找”控件.
假设您有以下表格:
tblCategories
id | catName
---+-----------
1 | Fruit
2 | Meat
3 | Vegetable
tblFood
id | idCat | foodName
---+-------+-------------
1 | 1 | Apple
2 | 1 | Banana
3 | 2 | Lamb
4 | 2 | Beef
5 | 3 | Broccoli
在此示例中,很明显这两个表之间存在一对多关系,并且idCat
in 字段tblFood
是外键。您可以在“关系”窗口中手动创建此关系。
通过以下查询,您可以正确获取foodName
和catName
字段(构建报告的好方法):
select f.*, c.catName
from tblFood as f
inner join tblCategories as c on f.idCat = c.id;
这会抛出这样的东西:
id | idCat | foodName | catName
---+-------+----------+------------
1 | 1 | Apple | Fruit
2 | 1 | Banana | Fruit
3 | 2 | Lamb | Meat
4 | 2 | Beef | Meat
5 | 3 | Broccoli | Vegetable
这是一个很好且有用的查询,您可以在报告中使用它......而无需在报告中使用组合框。
那么:究竟如何构建一个控件,例如 a ComboBox
,它仅根据foodName
值过滤catName
值?
第一:创建表格
然后:创建一个组合框并将其放入RowSource
属性中:
select id, catName from tblCategories
将控件设置为具有两列和列宽:0, 10
. 这将使id
下拉列表中的列“不可见”。一定要知道这个组合框的名称(假设它是命名的comboBox01
)。
现在,创建第二个组合框,保持RowSource
属性为空,并将列宽设置为0, 10
。还要确保知道第二个组合框的名称(假设它是命名的comboBox02
)。
现在让我们让 VBA 执行您需要的操作:在comboBox01
控件的属性表上,查找afterUpdate
事件,单击省略号按钮,选择“VBA 代码”并编写以下内容
Sub comboBox01_afterUpdate() ' This is added automatically by the VBA editor
strSQL = "select id, foodName from tblFood where idCat=" & comboBox01.Value
comboBox02.rowSource = strSQL
comboBox02.Requery
End Sub ' This is added automatically by the VBA editor
“查找控件”(没有“查找字段”)在表单中使用时非常有用。它们可以为您的数据库用户(包括您)省去很多麻烦。但我强烈建议您避免直接在表中创建它们。
希望这可以帮助。