将单元格从 Excel 复制/粘贴到 Access 子窗体中时,如果没有创建父记录,将导致错误 - 正如预期的那样。
问题是,发生此错误后,访问被锁定在一种状态,即输入的所有后续数据都会导致事务中不支持的操作错误。当您打开该表时,您可以看到新添加的数据尚未出现在该表中 - 因此看起来 Access 实际上正在从事某种事务。
我试过点击“保存”..“刷新”..甚至添加一个 AfterInsert 事件来强制执行 commitTrans() 但没有运气 - Access 声称没有正在进行的交易
如果手动输入记录,则没有错误。该问题似乎仅在粘贴记录时发生。我猜测 Access 正在创建一个事务来处理多个记录操作,并且没有从错误中正确恢复。
我可以删除“必需”标志,它会起作用 - 但是你有孤儿记录。我在想,也许可以使用 After Insert Data Macro 来添加具有默认批次名称的新批次,并将新的 BatchID 自动填充到 Items 表中。然而,我不确定如何做到这一点。
我确实尝试使用更改前数据宏删除“必需”标志并捕获错误 - 但是虽然它减少了错误 - 它仍然产生了事务错误中不支持的相同操作。
我在 Microsoft 知识库上查找了错误,但没有找到任何特定于我的情况的信息。我在 stackoverflow 中搜索了错误消息,但一无所获。
我创建了一个新数据库并能够复制该问题。
复制步骤
设置数据库
我写了一个版本控制模块。每当我或其他维护者之一登录时,AutoExec 宏都会启动它。它会查找自上次更新以来已创建或修改的数据库对象,然后向版本表添加一个条目,然后打开该表(过滤为最后一条记录),这样我就可以输入我所执行的更改的摘要。
它对于表、查询、表单、宏等非常有效,但我无法让它在模块中正常工作。
我发现两个不同的属性表明了上次修改日期......
CurrentDB.Containers("Modules").Documents("MyModule").Properties("LastUpdated").Value
CurrentProject.AllModules("MyModule").DateModified
Run Code Online (Sandbox Code Playgroud)
第一个 (CurrentDB) 始终将“LastUpdated”显示为创建日期,除非您修改模块的描述或界面中的某些内容。这告诉我这个属性纯粹是针对容器对象的 - 而不是其中的内容。
第二个效果要好得多。它准确地显示了我修改和编译/保存模块的日期。唯一的问题是,当您保存或编译模块时,它会再次保存/编译所有模块,因此将 DateModified 字段全面设置为相同的日期。这有点违背了在各个模块上拥有 DateModified 属性的目的,不是吗?
所以我的下一步行动将会更加激烈。我想我需要维护所有模块的列表,并使用 VBA 扩展计算每个模块中的代码行数。然后,如果代码行与列表记录的不同 - 那么我知道该模块已被修改 - 我只是不知道什么时候,除了“自从我上次检查以来”
有人有更好的方法吗?我宁愿不执行下一步操作,因为我可以看到它明显影响数据库性能(以不好的方式)