【问题标题】:how to add rows to more than one table at same time?如何同时向多个表添加行?
【发布时间】:2012-02-07 07:55:42
【问题描述】:

我有四个表格,每个表格都有自己的表格,所有这些表格共享同一列,即唯一 ID。当我同时以一种形式添加新行时,如何更新其他表,即如何在其他表中获取唯一 id 且其他列为空的行?

有没有办法为唯一的 id 字段指定多个控制源?

我尝试了在一个表中的唯一 ID 与其他表的唯一 ID 之间建立一对一关系的方法,但这不起作用。

【问题讨论】:

  • 您应该发布一些表模式。看看这个stackoverflow.com/questions/7397949/…,看看它是否描述了你想要做什么。最后,发布您将使用的 Access 版本。
  • 我使用的是MS Access 2007。这三个表分别是reference、field data、lab data。每个表都有自动增量字段和记录号(每个表中的每一行都应该相同)。也分别有三种形式。所以当用户向引用表添加新记录时,我需要向其他两个表添加记录号。
  • 您希望在每个表中添加一条记录吗?如果是这样,您可能希望将参考作为您的主要表单,其中包含字段和实验室表的子表单。如果您想要一个正确的答案,您必须发布架构或示例数据。您可以编辑您的问题以添加信息。

标签: ms-access


【解决方案1】:

您可以在表单的插入事件之前或之后执行 INSERT 语句。如果您的表单有一个名为 txtID 的文本框绑定到表单记录源中的 ID 字段:

Private Sub Form_AfterInsert()
Dim db As DAO.Database
Set db = CurrentDb
db.Execute "INSERT INTO Table2 (ID) VALUES (" & Me.txtID & ");", dbFailOnError
db.Execute "INSERT INTO Table3 (ID) VALUES (" & Me.txtID & ");", dbFailOnError
db.Execute "INSERT INTO Table4 (ID) VALUES (" & Me.txtID & ");", dbFailOnError
Set db = Nothing
End Sub

该方法假定这些表中除 ID 字段之外的所有字段都将接受 Null 值(在表设计视图中,Required 属性为 No)。

但最好从插入事件之前执行此操作,如果任何其他插入失败,则取消当前表单的插入。在这种情况下,您可能还想回滚任何其他成功的插入 --- 这很容易变得更复杂。

编辑:我给了你一个非常粗略的大纲。既然您收到的参数消息太少,建议您按照这些行修改它,以便查看您要求数据库引擎执行的确切 INSERT 语句。

Private Sub Form_AfterInsert()
Dim db As DAO.Database
Dim strSql As String
Set db = CurrentDb
strSql = "INSERT INTO Table2 (ID) VALUES (" & Me.txtID & ");"
Debug.Print strSql
db.Execute strSql, dbFailOnError
strSql = "INSERT INTO Table3 (ID) VALUES (" & Me.txtID & ");"
Debug.Print strSql
db.Execute strSql, dbFailOnError
strSql = "INSERT INTO Table4 (ID) VALUES (" & Me.txtID & ");"
Debug.Print strSql
db.Execute strSql, dbFailOnError
Set db = Nothing
End Sub

您可以在立即窗口中查看这些 Debug.Print 语句的输出。 (您可以使用 Ctrl+g 进入即时窗口)您还可以通过从即时窗口复制这些语句,然后将其粘贴到新查询的 SQL 视图中来测试其中的任何语句。

Edit2:如果 Record_Num 是文本(例如 R98609)而不是数字数据类型,请在构建 INSERT 语句时在值周围添加引号。

strSql = "INSERT INTO Table2 (ID) VALUES ('" & Me.txtID & "');"

【讨论】:

  • 我收到此错误:运行时错误 3061 我尝试的此代码的参数太少:Private Sub Form_AfterInsert() Dim db As DAO.Database Set db = CurrentDb db.Execute "INSERT INTO Lab_Data (Record_Num) VALUES (" & Form_Reference.recordNum & ");", dbFailOnError db.Execute "INSERT INTO Field_Data (Record_Num) VALUES (" & Form_Reference.recordNum & ");", dbFailOnError Set db = Nothing End Sub
  • 好的,我解决了这个问题,但我收到错误 424 object required
  • 这一行 db.Execute "INSERT INTO Lab_Data (Record_Num) VALUES (" & Form_Reference.recordNum & ");"
  • 嗯。 db 对象变量是否仍然有效? ---没有被摧毁? INSERT 语句的 Debug.Print 是什么样的?将其粘贴到新查询的 SQL 视图中是否有效?
  • 我试过这个: Private Sub Form_AfterInsert() Dim db As DAO.Database Dim strSql As String Set db = CurrentDb strSql = "INSERT INTO Lab_Data (Record_Num) VALUES (" & Me.recordNum & ") ;" Debug.Print strSql db.Execute strSql, dbFailOnError strSql = "INSERT INTO Field_data (Record_Num) VALUES (" & Me.recordNum & ");" Debug.Print strSql db.Execute strSql, dbFailOnError Set db = Nothing End Sub
【解决方案2】:

也许更好的问题是为什么您有四个具有相同主键的表,您是否考虑过将所有数据放在一个表中

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2019-07-11
    • 2013-06-18
    • 2018-02-12
    • 2022-11-19
    • 2013-02-11
    相关资源
    最近更新 更多