为什么Microsoft Access表单会为一个查询而不是另一个查询创建记录?

时间:2009-04-13 20:23:04

标签: ms-access

我有一个Access数据库。让我们假装它是一家宠物商店。

有一张动物桌。

Animals (animal_id, birth_date, price)

然后是我们出售的不同类型动物的特定表格。

Dogs (animal_id, bark_volume)
Cats (animal_id, collar_size, shedding_rate)
Fish (animal_id)

鱼没有趣味,所以它们没有任何特殊领域。 Fish表存在,因此您知道Animals表中的哪些记录是鱼。

现在,我有一个将动物添加到宠物商店的通用表格。在你获得表格之前,首先要说明你要添加什么样的动物。基于此,表单显示/隐藏字段,更改其记录源,并将字段绑定到适当的数据列。表单从查询DogInfo,CatInfo和FishInfo中提取数据。

现在,当你进入一只狗或一只猫时,一切都很好。一个记录被添加到动物和狗或猫。

然而,当你进入一条鱼时,你得到的只是一只动物,没有鱼。

可能导致这种情况的原因是什么?是不是因为Fish桌上缺少其他栏目而引起的?

(让我们不要理会用select查询更新表格根本没有意义。我没想到Access首先让我这么做,但Access的座右铭似乎是“做错了”容易做的事情和正确的事情很难做到。“数据库相对简单且不经常使用,并且它比我开始工作之前至少好100倍,所以我真的不太担心这个问题,只要我能使它发挥作用。)

4 个答案:

答案 0 :(得分:7)

“Fish表上缺少其他列是否会导致它?”

是 - 当你在子记录(狗和猫)上输入数据时,Access会自动填写父ID(animal_id)

由于鱼类记录没有数据条目,因此无法创建。你必须在代码中这样做。不确定您的表单和数据源是如何设置的,但您可以在其中一个表单事件上执行以下操作:

Fish![animal_id] = Animal![animal_id]

修改

在您的FishInfo查询中,您必须为Fish.[animal_id]添加别名 - 您不能有两个具有相同名称的字段 - 称之为Fish_animal_id

然后在Form_BeforeUpdate事件中输入:

Me.Fish_animal_id = Me.animal_id

答案 1 :(得分:2)

您是否考虑过在不同的表上配置关系?鉴于上面的设计,我首先会在特定动物表中添加一个识别列,并将其设置为主键。 E.g:

Dogs(DOG_ID, animal_id, bark_volume)
Cats(CAT_ID, animal_id, collar_size, shedding_rate)

等。在关系视图中,您可以定义从Animals.ANIMAL_IDDogs.animal_id的一对多(一对一?)关系。然后,您可以将Animals表连接到表单上的组合/列表框控件,以从该表中选择记录。我认为如果正确配置控件,您甚至可以从该控件创建新记录(或者您可以使用子窗体)。

答案 2 :(得分:0)

Dogs / Cats / Fish桌子没有单独的ID吗?假设唯一的区别是列数,我很好奇,如果突然修复它。

答案 3 :(得分:0)

除了糟糕的设计之外,您是否在各种表之间建立了关系?你是否设置了表来强制引用完整性?