回复您的评论:
当您使用“查找”字段时,您将在表之间强制建立新的关系。
避免访问的十诫中列出的问题(特别是:表中查找字段的弊端)的最佳方法是手动创建关系,然后使用它们在表单或报告中创建足够的“查找”控件.
假设您有以下表格:
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
在此示例中,很明显这两个表之间存在一对多关系,并且idCatin 字段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
“查找控件”(没有“查找字段”)在表单中使用时非常有用。它们可以为您的数据库用户(包括您)省去很多麻烦。但我强烈建议您避免直接在表中创建它们。
希望这可以帮助。