【问题标题】:Why would a Microsoft Access form create records for one query but not another?为什么 Microsoft Access 表单会为一个查询而不是另一个查询创建记录?
【发布时间】:2024-04-27 15:05:01
【问题描述】:

我有一个 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 中提取数据。

现在,当您进入狗或猫时,一切都很好。一条记录被添加到 Animals 和 Dogs 或 Cats 中。

但是,当您输入鱼时,您得到的只是动物,没有鱼。

这可能是什么原因造成的?是否是由于 Fish 表上缺少其他列而导致的?

(让我们抛开使用选择查询更新表根本没有意义的事实。我没想到 Access 一开始就让我这样做,但 Access 的座右铭似乎是“犯错事情容易做,正确的事情做起来很尴尬。”虽然数据库相对简单且不经常使用,而且它比我开始研究它之前至少要好 100 倍,所以我并不太担心只要我能解决这个问题。)

【问题讨论】:

  • 这个表设置有很多问题。我希望这只是一个没有精心设计的例子。
  • 基本设计基于此:*.com/questions/554522/…
  • 这有很多问题,在google上搜索“访问表结构”。
  • 除非您有特定的评论或比谷歌搜索没有有用结果的术语更有用的东西,否则您没有帮助。

标签: ms-access


【解决方案1】:

“是否是由于 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

【讨论】:

  • 这听起来不错,但我无法让代码运行。它告诉我“限定符必须是一个集合”之类的东西。
  • 这取决于您使用的记录集/字段名称 - 基本上您必须将 Fish 记录的 animal_id 设置为主 animal_id
  • 我将字段名调整为对应,但Access还是不喜欢。
  • 需要有关用于更改记录源和字段名称等的代码的更多信息。
  • 数据源设置在 Select Case 块中,该块检查 enum 的值,然后将表单的 RecordSource 属性设置为字符串形式的相关查询的名称。到目前为止,这仍然不起作用,所以即使 * 可以,我也不认为这是答案。
【解决方案2】:

您是否考虑过在不同表上配置关系?鉴于上述设计,我将首先向特定动物表添加一个标识列,并将其设置为主键。例如:

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

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

【讨论】:

  • 是的,animal_id 上的一对多关系和参照完整性的执行是我将如何做到这一点。
  • 单独添加关系没有效果。也没有添加 ID 列。
【解决方案3】:

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

【讨论】:

  • 我没有。这会在某种程度上有所帮助吗?
  • 行业规范是有一个单独的 ID 列来标识特定行,并且可能是一个自动编号(即使它只是对所有三个表都称为“ID”)。它也可能触发该行被创建。
  • 尝试添加 ID 列。触发创建时运气不佳。
【解决方案4】:

撇开糟糕的设计不谈,您是否在各个表之间建立了关系?您是否设置了表以强制执行参照完整性?

【讨论】:

    最近更新 更多