如何在 Access 表单的多对多关系中填充第三个 table? (MySQL 后端)

How can I populate the third table in a many-to-many relationship in an Access form? (MySQL backend)

Firstly, here is the relationship between the relevant tables.

我正在开发一个 Access 前端,作为底层 MySQL 数据库的 CRUD,我大部分时间都在正确地表示 table 并与之交互多对多的关系。我按照 this tutorial 中的说明进行操作,我的表单大部分都可以正常使用。但是教程示例的局限性在于关系中的第三个 table(在我的例子中是地址)是静态的,不能从表单中更改。

Here's how my form looks currently. 在 people_has_addresses 子表单中添加新条目时,如果我想添加地址 table 中已经存在的地址,方法是在 addresses_addressID 列,一切正常。其余列自动加载地址,people_has_addresses 自动使用 PersonID 和 AddressID 的这种独特组合填充新行。当我想即时创建一个新地址,将其添加到地址 table,并用这个新组合填充 people_has_addresses 时,问题就来了。如果我在子表单中自由输入一个新地址并按回车键,我会收到以下错误:"The Microsoft Access database engine cannot find a record in the table 'addresses' with key matching fields 'addresses_AddressID'."

我的问题是,我需要做什么才能允许在地址中创建新行?理想情况下按照我上面描述的方式工作。我觉得我快要做到这一点了,但不知道接下来该做什么。

好的,所以该行中的组合框可以让您 select 一个给定的地址。你并没有真正描述如果你有 10 个地址,你想在邮件列表中显示哪个,或者什么不显示。您可以做的是在 table 中添加一个额外的列,您在其中输入(保存)地址 ID,然后添加一个 "default" 复选框。然后你可以使用默认地址列 = true 进行查询,只提取一个地址用于邮寄等。所以在这个例子中,我确实有一个 select 的复选框,可能会使用很多地址默认。我们可以为家庭、公司、度假地点或其他任何内容添加另一列。这样您就可以将地址分类为它是什么。

但是,问题和你的问题当然是如何添加新地址?

有多种方法可以做到这一点,就像冰淇淋的口味一样。换句话说,这取决于您的创造性思维。一种方法是使用不在列表事件中的组合框。因此,如果您输入的地址 ID 不存在,系统可能会提示您输入它。但是,用户在数据输入过程中永远不必看到、知道或使用一些愚蠢的 "id"。事实上,用户在使用应用程序期间甚至不应该看到 PK 或 FK id。

我建议您在允许您 select 地址的组合框旁边放置一个按钮以添加新地址。您可以使用 + 号之类的图形图像。因此,他们可以使用组合框 select 现有地址,或单击 + 按钮添加新地址。按钮后面的代码会启动一个表单来编辑地址,但会以添加模式启动表单。当您 close/save 表单时,代码 could/would 将您刚刚添加到地址的 FK Address_ID 列中的新地址的 PK id 填充。

为了虐待动物和您的用户?他们不需要知道、看到或输入一些 "number"。组合框可以隐藏第一个 PK 列。因此,当您 select 给定地址(在此示例中为酒店,但它可能只是一个地址)时,您会显示名称。因此,用户无需展开组合框,只需开始输入酒店名称即可。公平地说,对于地址,您确实没有 "name" 可以输入,因此您的情况有所不同。在大多数情况下,您 selecting 的东西有一些名称,或部分 name/number,或者在我们的例子中是酒店名称。

请注意,子表单基于连接其他列的查询。所以,当他们破解组合框的时候,其实是在selectPK。就像魔术一样(没有代码),然后城市、省、描述列自动显示来自其他 table.

所以表格看起来像这样:

在上面,我们 select 浏览了几家酒店。但是,请注意关于使用哪个地址的复选框,因为我们可能有多个,但对于打印信件或信封,则复选框将决定将显示哪个地址。

并且在上面,如果我们没有找到或没有我们想要使用的酒店(或地址),那么我们可以点击组合框旁边的 + 号。这将启动一个很好的单一表单布局来输入一个新的酒店(或地址)。如前所述,如何设置 UI 以工作是一个开放的 canvas。获得创意的一种好方法是查看您使用的其他软件。那么,如何给outlook用户添加多个地址呢?因此,关于您要如何执行此操作,存在大量的方法和想法。它不是真正如何做到这一点,而是您希望它如何工作,因为您可以根据自己的心意设计它,以随心所欲地工作。

所以,PK id 不应该在这里暴露。用户不会关心或知道这些事情。我的意思是,当我输入此响应时,毫无疑问驱动堆栈溢出的 SQL 服务器为此 post 生成了一个新数字 - 但这不是用户的事情,只是开发人员需要关心的事情。

好的,所以我们构建该子表单。 table 驱动那个子表单只是

ID  (PK) 
Customer_ID   (FK to parent form driving this)
Hotel_ID      (FK to hotel - or in your case address)
DefaultAddress (true/false column)

如前所述,我们应该再添加一列,将地址设置为要使用的默认地址。 例如:默认地址。

。所有其他列显示为左连接的结果。 (此子表单的左连接非常重要)。

现在,如果酒店不在我们的选择列表中,那么用户只需点击组合框旁边的 + 号,我们就会弹出一个漂亮的表格 edit/add 新酒店。请注意,当您使用 Outlook、会计系统或任何软件时?您看不到并输入 PK id 值 - 只有开发人员才能真正看到,最终用户永远不会看到或必须处理实际的 PK 编号。