我是Access的新手,但我已经完成了这些教程,并且拥有一些使用Excel的VBA经验,所以我不应该没有希望。
我还没有进展到表单,现在我专注于定义和填充表格,并定义关系。
我在这里更改了示例中的实际表格,但上下文和问题仍然存在。
表1是食品。除了autofield键,它有两个字段
FoodCat FoodType
Fruit banana
Fruit apple
Fruit pear
Meat lamb
Meat beef
Meet Chicken
Vegetable Broccoli
等...
此表由另一个表在查找和关系设置中使用。 设置起来很容易,因此另一个表的字段仅限于包含FoodCat字段中项目的条目(尽管它是重复的)。我还可以使用FoodType字段将下一个字段限制为条目,但这为我提供了所有选择。
我想在新表中做的是将FoodType选项限制为具有匹配FoodCat选项的条目。
因此,如果在FoodCat下的新表上选择的项目是Meat,我只希望FoodType选择为羊肉,牛肉或鸡肉。
这甚至可以在桌子内吗?我是否需要使用Forms来完成这项工作?
答案 0 :(得分:3)
回答你的评论:
当您使用“查找”字段时,“您正在强制表格之间建立新的关系。”
避免Ten Commandments of Access中列出的问题(特别是:The evils of the lookup fields in tables)的最佳方法是手动创建关系,然后使用它们在表单中创建足够的“查找”控件或报告。
假设您有以下表格:
<强> 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
中的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
这是一个非常有用的查询,您可以在报告中使用...而无需在报告中使用组合框。
那么:如何构建一个控件,例如ComboBox
,只根据foodName
值过滤catName
个值?
首先:创建表单
然后:创建一个组合框并将其放在RowSource
属性中:
select id, catName from tblCategories
将控件设置为包含两列和列宽:0, 10
。这会使下拉列表中的id
列“不可见”。请务必知道此组合框的名称(假设它名为comboBox01
)。
现在,创建第二个组合框,将RowSource
属性保留为空,并将列宽设置为0, 10
。另外一定要知道第二个组合框的名称(假设它名为comboBox02
)。
现在让我们让VBA做你需要的事情:在comboBox01
控件的属性表上,查找afterUpdate
事件,省略省略号按钮上的clic,选择“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
“查找控件”(没有“查找字段”)在表单中使用时非常有用。它们可以为数据库用户(包括在内)节省很多麻烦。但我强烈建议您不要直接在表格中创建它们。
希望这有帮助。
答案 1 :(得分:2)
是的,可以在表格内完成。但是,通过表单更容易,通过表单更实用。您永远不会希望您的用户直接与表进行交互。