Ms access Access Forms-Catch 22试图将数据插入多个相关表

Ms access Access Forms-Catch 22试图将数据插入多个相关表,ms-access,ms-access-2010,Ms Access,Ms Access 2010,我刚接触Access,但有多年使用“企业”数据库的经验。我在执行一项简单的任务时遇到困难,并且怀疑我的先入之见导致我没有抓住要点,所以我请求一些帮助 简单的任务是使用访问表单进行数据输入,它填充两个表:Customer和CustomerAddress(每个客户可以有多个地址) Customer表具有主键CustomerID。CustomerAddress表将主键CustomerAddressID和CustomerID作为外键,并在该关系上具有RI Form1绑定到Customer表。在输入各个字

我刚接触Access,但有多年使用“企业”数据库的经验。我在执行一项简单的任务时遇到困难,并且怀疑我的先入之见导致我没有抓住要点,所以我请求一些帮助

简单的任务是使用访问表单进行数据输入,它填充两个表:Customer和CustomerAddress(每个客户可以有多个地址)

Customer表具有主键CustomerID。CustomerAddress表将主键CustomerAddressID和CustomerID作为外键,并在该关系上具有RI

Form1绑定到Customer表。在输入各个字段的信息后,用户可以单击按钮显示绑定到CustomerAddress并启用多个地址的数据输入的Form2

Form1将CustomerID(由Access分配)传递给Form2。由于大小的原因,Form2不是子表单,但如果这样可以解决问题,它可能是子表单

在一个完美的世界里,我希望来自Form1和Form2的所有新数据都能一起提交。大概我可以使用未绑定的表单并在单个事务中对insert语句进行编码

问题1:有没有办法使用绑定表单来实现这一点

如果我使用Form1时没有单击“地址”按钮,则会成功地将一行添加到Customer表中。在将Customer行添加到表之前,尝试在Form2中添加CustomerAddress行时会出现问题

在Form2中,如果未使用CustomerID,则会出现插入错误,因为在没有CustomerID的情况下无法添加CustomerAddress行。 如果使用了CustomerID,则会出现插入错误,因为CustomerID在Customer表上还不存在(尽管ID似乎已被“保留”)

在打开Form2之前强制添加客户行是不切实际的,因为工作流中的某些客户必填字段此时不存在

问题2:有办法解决这个问题吗?这似乎是一个共同的要求

我可以通过删除RI来解决这个问题,这样就可以首先添加CustomerAddress行,但这似乎是一个糟糕的DB设计,而且我还需要清理逻辑,以便在随后取消CustomerAdd的情况下进行清理


如前所述,我可能没有抓住重点,还有更好的方法。非常感谢您的帮助。

我认为,如果您强制执行引用完整性,那么无论使用哪种RDBMS,您都会遇到同样的问题。CustomerID需要先存在于Customer表中,然后记录才能存在于CustomerAddress表中。我猜CustomerID是一个自动编号。可能令人困惑的是,Access会在新记录启动后立即“保留”自动编号。但是,它不存在于Customer表中。如果该记录从未保存,则该自动编号值将丢失,下一条记录将获得下一个编号。要求在保存客户记录之前填写地址,听起来像是设计问题。这似乎不合逻辑。就我个人而言,我会重新考虑设计。也就是说,一种解决方案是为地址创建临时表,并将CustomerAddress表单绑定到该临时表。然后,在保存客户记录时,您将运行追加查询以将新地址添加到CustomerAddress表中。但是,请记住,如果用户输入了一些地址,而客户记录从未保存,则所有数据输入都将丢失。

我认为答案就在您的问题1中。是的,有一种方法可以通过绑定表单实现这一点,这就是我将使用的方法

Form1绑定到Customer表。将表格2作为子表格添加到表格1中。选择/突出显示表格2,转到属性表。在“数据”选项卡上,将链接主字段设置为CustomerID,将子字段设置为CustomerID

然后在对表格1采取任何行动后,重新查询表格2


我认为这将让您开始,至少应该让您了解完成后如何继续。

我不明白为什么必须同时提交客户和子表中的记录

如果您想添加一个额外的地址,那么现在添加地址按钮和代码必须检查并测试主客户是否已经存在,如果客户记录存在或不存在,则使用单独的逻辑进行处理。如果用户输入了客户名称和信息,但还没有地址,因为电话中的客户可能刚搬家,必须用新地址回电,该怎么办。我可以想到另外六种情况,在这种情况下,必须同时添加客户和客户地址记录

正如其他人所指出的,任何关系数据库(包括Access)都会遇到这个问题。我还应该指出,如果使用Access作为SQL server或Oracle的前端,Access在这里的工作原理完全相同

因此,构建一个不同的UI和编码过程来添加客户和地址,然后构建一组不同的规则和UI来随着时间的推移添加额外的地址是没有意义的。因此,构建一个表单来搜索并查找客户,然后添加该客户并显示该客户。完成该过程后,您将添加该过程(和UI部分),以允许用户查看或向该客户添加地址。我想我从来没有见过一个UI,它有单独的表单来添加/编辑客户,还有一个单独的表单来允许其他地址同时提交

如果用户因为意识到地址不可用、错误等原因而退出该地址,这不应表明目前输入的客户信息已被转储而未添加。如果用户在退出添加地址后(比如关闭或取消该表单),则返回客户表单。如果