查找和多列关系

时间:2013-08-21 21:49:10

标签: ms-access ms-access-2010

我是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来完成这项工作?

2 个答案:

答案 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字段是外键。您可以在“关系”窗口中手动创建此关系。

通过以下查询,您可以正确获取foodNamecatName字段(构建报告的好处):

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)

是的,可以在表格内完成。但是,通过表单更容易,通过表单更实用。您永远不会希望您的用户直接与表进行交互。