繁体   English   中英

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

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

首先,这里是相关表之间的关系。

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

这是我的表单目前的外观。 在 people_has_addresses 子表单中添加新条目时,如果我希望通过将其 ID 输入到addresses_addressID 列中来添加地址表中已经存在的地址,一切正常。 列的 rest 自动加载到地址中,并且 people_has_addresses 使用 PersonID 和 AddressID 的这种唯一组合自动填充新行。 当我想动态创建一个新地址,将其添加到地址表中,并用这个新组合填充 people_has_addresses 时,问题就来了。 如果我在子表单中自由输入新地址并按回车键,我会收到以下错误:“Microsoft Access 数据库引擎无法在表 'addresses' 中找到具有关键匹配字段 'addresses_AddressID' 的记录。”

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

好的,所以该行中的组合框让您 select 给定地址。 您并没有真正描述过,如果您有 10 个地址,您想在邮件列表中显示哪个地址,或者什么不是。 您可以做的是在您插入(保存)地址ID的表中添加一个额外的列,并添加一个“默认”复选框。 然后,您可以使用默认地址列 = true 进行查询,以仅提取一个地址用于邮寄等。因此,在此示例中,我确实有一个 select 复选框,默认情况下将使用许多地址。 我们可以为家庭、商业、度假地点或其他任何内容添加另一列。 这样,您可以将地址归类为它是什么。

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

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

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

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

请注意,子表单基于连接其他列的查询。 所以,当他们破解组合框的时候,他们其实是在选择一个PK。 就像魔术一样(并且没有代码),然后从另一个表中自动显示城市,省,描述列。

所以表格看起来像这样: 在此处输入图像描述

在上面,我们选择了几家酒店。 但是,请注意要使用哪个地址的复选框,因为我们可能有多个,但对于打印信函或信封,复选框将确定将出现哪个地址。

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

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

好的,所以我们构建了那个子表单。 驱动那个子表的表只有

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM