Access:你真的需要使用子表单吗?

Access: Do you actually need to use subforms?

所以我有一个关于 MS Access 的潜在愚蠢问题。如果我想制作一个可用于填充关系数据库中多个表的表单,这些其他表是否必须由子表单表示?据我了解,您可以手动更改主窗体的 RecordSource 以包含罕见的一对一关系,但是有什么方法可以使一对多或多对多工作关系?

从表面上看,在我看来这是不可能的 -- 毕竟,Access 如何知道如何在页面上以一对多关系排列多个元素?

我 90% 确定这个问题的答案是 "No, you must use subforms when designing a form which represents a relational model, unless it only contained one-to-one relationships",但我仍然觉得如果我不仔细检查这个我会失职,因为我基本上一头扎进了 Access 开发,没有以前的经验,我想确保我没有犯明显的错误。

不,您当然不需要子表单。加载相关记录、更新删除、切换记录、过滤等所有代码都可以自己写。

只是子表单是一个非常方便的工具,随时可供您使用。

如果你不得不问这个问题,你可能应该使用子表单,而不是尝试重新发明轮子。

我实际上已经编写了代码,在不使用子表单的情况下在单个表单中包含大约 100 条相关记录,同时支持读取和更新,因为它满足了特定目标,但我不推荐它任何人

实际上,您可以编辑连接到主 table 和子 table.

的结果记录

要做到这一点,需要做一些事情。 您必须对子 table 使用左连接(否则查询将不会 return 任何记录。)

只要子 table 的 FK 列和父 table 的 PK 列包含在查询中,就可以工作。

所以说我们在关系中有这个设置。

注意非常接近它是如何进行左连接的。这允许(并且意味着)父记录可以存在,而不是子记录。

现在构建这样的查询:

请注意前几列来自主 table,接下来的 3 列来自子 table。

因此,当您打开查询时,假设没有子记录,您会得到:

请注意子记录不存在的原因。如果我在子 table 列中键入或输入数据(例如发票编号),然后继续保存,那么您会得到:

所以在上面的例子中,数据引擎确实知道要设置什么 FK 值,因为你在一个主记录上。当然,你不能在这里做的是添加多个子记录,因为你不能 select 或者重新输入主记录。但是,如果您单独添加(比如使用子表单)多个子记录,那么您会得到:

再一次,我可以编辑每一行,甚至可以编辑子列。

当然,因为这是一个左连接,所以每次对每个子记录重复主记录。

您可以绑定此查询并将其用于表单。

所以这样的设置没有多大用处,因为您不能将新的子记录添加到父记录,但是您当然可以通过这种方式编辑此类数据。它确实允许您添加 "one" 记录,或 "edit" 一个子记录。因此,如果子记录不存在,则会添加它。如果子记录存在,那么您可以再次编辑该子记录中的值。但是,您不能使用此 UI.

添加超过一个子记录

因此,虽然可以进行编辑,但没有多大用处 UI。