2

我有一个 Access 2003 数据库,它使用一个主窗体和一个子窗体中的数据表。主窗体允许用户从更新子窗体的记录源的菜单中进行选择。子表单还会根据表单记录源中的字段数量和类型更新可编辑的字段数量和类型。它基本上是一个动态数据表生成器。这在 Access 2003 中工作得很好,并且已经好几年了。如果我在 Access 2007(完整或运行时)中打开相同的数据库,则大多数菜单选择都有效。但是,如果我选择引用一个特定表的任何菜单选项,子表单会显示列标题,但不会显示任何数据行或显示任何错误。就好像查询返回零行一样。为什么 Access 2007 会有所不同?他们是否添加了新的保留字?

我尝试过的事情:

  • 更新表中的每个字段以确保没有空值(无变化)
  • 重命名每个字段和表名,以防有新的保留字(无变化)
  • 前后端压实修复(无变化)
  • 尝试一一包含和排除字段以查看是否有任何变化(没有变化)
  • 将表单的记录源放入新查询中。(它返回了预期的行数)
  • 检查以确保表单未设置为数据输入模式。(它不是)
  • 检查以确保没有在代码中应用过滤器。(没有)
  • 检查以确保查询在 Access 2007 中是可更新的。(它是)
  • 从源表中选择性地删除数据块。(不用找了)

我难住了。

4

1 回答 1

5

我终于能够解决这个问题。如上所述,我的数据表是一个子表单。父表单设置确定如何构建子表单的选项。在构建数据表时,子表单的源对象被替换为空白表单以隐藏先前的数据表并呈现到新数据表的平滑过渡。它在 Access 2000/2003 中运行良好。

在 Access 2007 中用新的数据表替换空白表单时,我发现Access 正在自动将子表单数据的主键分配给未绑定父表单的 LinkMasterFields 和 LinkChildFields 属性。这些属性以前是空白的,我从未在代码中设置它们。也许这是 Access 2007 试图提供帮助而不是错误的尝试,但在我能找到的任何技术参考资料中都没有注意到行为差异,包括内置帮助文件。由于父表单未绑定,因此具有过滤掉我所有子表单记录的效果。如果我在表单替换步骤中明确设置 LinkMasterFields="" 和 LinkMChildFields="" ,一切都会像以前一样工作。万岁!

同样,解决方案是,在设置子表单的 sourceobject 时,一定要显式设置 linkmastfields 和 linkchildfields 属性,以防止 Access 为您执行此操作。我希望这可以节省我经历的几个小时的挫败感。

于 2010-08-27T20:14:09.830 回答