将单元格从 Excel 复制/粘贴到 Access 子窗体中时,如果没有创建父记录,将导致错误 - 正如预期的那样。
问题在于,发生此错误后,访问被锁定在输入的所有后续数据导致事务错误中不支持的操作的状态。当您打开表格时,您可以看到新添加的数据尚未在表格中 - 因此看起来好像 Access 实际上正在进行某种事务。
我试过点击“保存”..“刷新”..甚至添加一个 AfterInsert 事件来强制执行 commitTrans() 但没有运气 - Access 声称没有正在进行的交易
如果记录是手动输入的,则不会出错。该问题似乎仅在粘贴记录时出现。我猜测 Access 正在创建一个事务来处理多个记录操作,并且没有从错误中正确恢复。
我可以删除“必需”标志,它会起作用 - 但是你有孤儿记录。我在想也许可以使用 After Insert Data Macro 添加一个具有默认批次名称的新批次,并将新的 BatchID 自动填充到 Items 表中。但是,我不确定如何做到这一点。
我确实尝试使用更改前数据宏删除“必需”标志并捕获错误 - 但是虽然它减少了错误 - 它仍然产生了相同的操作不支持事务错误。
我在 Microsoft 知识库中查找了该错误,但没有找到任何特定于我的情况的内容。我在 stackoverflow 中搜索了错误消息,但一无所获。
我创建了一个新数据库并能够复制该问题。
复制步骤
设置数据库
- 在 Access 2010 中创建一个新的 ACCDB 数据库
- 创建一个名为“Batches”的表,其中包含以下字段:
- BatchID(自动编号)(主键)
- 批次名称(文本)
- 创建一个名为“Items”的表,其中包含以下字段:
- RecordID(自动编号)(主键)
- BatchID(长整数)
- 将必需属性设置为 True
- 数据 - 文本
- 创建关系,将 Batches.BatchID 链接到 Items.BatchID
- 包括批次中的所有记录,以及项目中的匹配记录
- 强制参照完整性
- 级联更新/删除
- 创建一个名为“表格”的表格
- 将记录源设置为批处理
- 添加 BatchID 和批次名称文本框
- 添加一个 SubForm/SubReport 控件
- 将源对象设置为“Table.Items”
- 将链接主字段设置为“BatchID”
- 将链接子字段设置为“BatchID”
- 设置“空主过滤器”=是
- 创建示例数据(使用表单)
- 批量创建新记录。
- 设置 BatchName = "测试"
- 在项目中创建新记录。
- 参考批记录。
- 设置数据=“测试”
- 批量创建新记录。
如您所见,手动操作很好。
从 Excel 复制和粘贴数据
- 在 Excel 中
- 从 A1-A10 向下每个单元格输入一个字母:A、B、C、D、E、F、G、H、I、J
- 突出显示单元格 A1-A10
- 复制(Control+C)
- 在 Access 中,使用表单:
- 添加新的批次记录。它应该在 BatchID TextBox 中显示“(新)”
- 不要输入批次名称
- 在子表单中,单击新记录的记录选择器 (*) 以选择整行。键入 Control+V 进行粘贴。
- 单击“您必须在 'Data.BatchID' 字段中输入一个值。错误
- 此错误可能会重复。继续点击确定
- 如果它询问“你想抑制更多的错误消息......”回答是
- 单击“确定”以查看“Microsoft Access 无法粘贴的记录已插入到名为“粘贴错误”的新表中。通知
- 用“TestName”填写批次名称文本框
- 尝试优雅地恢复。点击逃生。更改记录。
此时 - 您应该看到输入的 BatchID、批次名称和新数据。一切似乎都按预期工作。如果您尝试刷新或导航到另一个批次记录 - 您将收到错误Operation not supported in transactions。Access 将继续显示此错误消息,直到我们关闭并重新打开表单。您粘贴的数据不会进入数据库。
通常,具有一点技术知识的人会意识到某些事情进展不顺利并关闭数据库并重新打开......但不幸的是,我有用户使用任何弹出框玩“whack-a-mole”然后尝试继续 - 所以我想让事情尽可能地防弹。
所需的解决方案
我想要一个解决这个问题的方法,它最终不会导致访问、重复值等其他怪癖。
以我自己的经验,使用 VBA 来“修复”密钥是不可靠的。数据宏似乎更可靠-但设置起来可能很棘手-它们还不是很主流(我想说stackoverflow上应该有一个ms-access-data-macros标签,但没有然而)