MS Access 2007:查找使用表单/查询/报告的位置

Posted

技术标签:

【中文标题】MS Access 2007:查找使用表单/查询/报告的位置【英文标题】:MS Access 2007: Find Where a Form / Query / Report is Used 【发布时间】:2011-10-14 18:55:14 【问题描述】:

历史:我继承了一个使用 MS Access 编写的相当大的应用程序,其中包含大量表单、查询和报告。因为看起来这些项目中有一些是作为备份的方式被复制的,所以我不知道它们是否真的在任何地方使用过。

问题:我正在开始清理应用程序,需要一种方法来查找是否以及在何处使用了表单、报告或查询,以便我知道是否可以删除或重构它们.有没有一种好方法让 Access 在按钮事件中搜索表单/报告的名称?

(Access 的查找功能似乎只查找记录,除非我缺少设置) 编辑 - 解决方案:

1.) 正如在下面的答案和 cmets 中所提到的,通过创建一个新的 Access 文件然后逐个表单、从登录屏幕开始并查看缺少的内容来重建应用程序将是一个宝贵的教训.这将提供对整个应用程序的深入了解。

2.) 我发现this post 讨论了使用“Database Documenter”转储与给定表单中使用的对象、VBA 等相关的所有信息。使用单个特定查询、报告或表单可以轻松搜索生成的文本文件。它不会为我提供与重新构建整个应用程序相同的知识水平,但对于有针对性的知识/可能的清理来说,这是一个很好的权宜之计。

【问题讨论】:

【参考方案1】:

假设你有一个名为 frmOne 的表单,它有一个命令按钮,代码隐藏为:

DoCmd.OpenReport "rptFoo"

而 rptFoo 使用 qryFoo 作为其记录源。

启用轨道名称自动更正,然后查看 frmOne 的对象依赖关系不会通知您 frmOne 需要 rptFoo。但是,它可以告诉您 rptFoo 需要 qryFoo。另一个问题是对象依赖项不会通知您 frmOne 已被弃用 --- 当前版本是 frmTwo。

同样,使用Application.SaveAsText 为数据库对象创建文本文件,然后对文本文件进行 grepping 不会告诉您 frmOne 已被弃用。

您可以尝试不同的方法来确定需要哪些数据库对象。创建一个新的数据库文件。从旧数据库导入启动表单。打开新数据库,并在表单中找出它需要的缺失项目。导入那些。起泡,冲洗,重复。

如果应用程序不是从启动表单驱动的,请询问用户他们使用哪些表单和报告,然后将其导入。

这种方法很繁琐,可能需要几个小时。但是,我怀疑其他方法会快得多。从好的方面来说,您几乎可以保证不会将不需要的对象导入新数据库。如果你错过了任何需要的东西,你可以从旧数据库的保存副本中导入。

【讨论】:

是否有一种简单的方法可以确定新数据库文件需要 rptFoo?似乎您需要运行每个报告才能找到丢失的报告。当然,这可能是对继承应用程序的一项有价值的练习。 这可能取决于应用程序的组织方式。如果用户仅从数据库窗口 (Access = 2007) 打开 rptFoo,则无法通过检查数据库属性或代码来确定它是否需要。如果所有用户操作都是从类似于交换机菜单表单的东西驱动的,那么您可以检查代码/宏/交换机表以确定需要哪些 db 对象。但是,我认为您的第二点更重要。在重构任何东西之前,他应该先与用户核实。避免重构不需要的部分... 不再。避免清理代码以更好地执行操作,结果发现必须根据当前需要更改该操作。在对继承的应用程序进行任何更改之前,没有什么可以替代的。询问用户。 @HansUp 该应用程序是从主菜单驱动的。你的解决方案很可能就是我会做的。由于各种原因,我试图避免填写所有表格,但正如芯片所指出的那样,这将是一次重要的学习经历。您与用户核对的观点是正确的。我尽我所能确保他们在我正在开发的新功能中得到了他们需要的东西。我希望他们会花时间/抽出时间检查其他一些较旧的物品,并向我展示满足他们需求的物品。 @chip 你说得对,强迫自己完成所有表格将是一个非常有价值的练习,可以帮助您了解应用程序中发生了什么。【参考方案2】:

这可能是使用跟踪名称自动更正的情况,启用此选项后,您可以跟踪对象依赖关系。

使用 VBA 检查表单引用的代码和事件并非不可能。

【讨论】:

感谢曲目名称自动更正的建议。没错,签入 VBA 很容易。寻找附加到按钮的表单/报告是我更关心的。我来看看曲目名称自动更正。 @Taylor 我的意思是For each frm In Currentproject.AllForms ... For Each Ctl In Forms(frm.Name).Controls ... 等等。相当短的 VBA 应该可以做到。【参考方案3】:

我继承了一个具有 20 多个 mdb 前端的应用程序,其中一些前端使用其他文件中的查询。除了 Remou 提到的解决方案之外,我还使用此 script 的变体将所有表单、查询和报告导出到文本文件,然后通过 grep 检查是否使用了该对象。

它并不完美,但它也允许我检查 mdb 之间的依赖关系——我不确定你是否可以使用内置工具来做到这一点。当我编写它时,我可能一直在遭受 NIH 的折磨。

您可能还想查看mz-tools,它有一些工具可以找到未使用的代码。

【讨论】:

感谢您研究的项目。我会看看这些。【参考方案4】:

有一个免费且有用的小插件vtools,除其他可能性外,它特别允许您在所有访问对象(表、查询、代码、表单...)中搜索值或引用.

【讨论】:

感谢vtools的建议。我会看看他们。它们听起来可能很有用。我可能会使用@HansUp 建议的解决方案,只是为了了解这个特定应用程序中发生了什么。【参考方案5】:

很简单。

进入 VBA 代码编辑器(在某处找到查看代码) CTRL + F 拉出查找选项并单击搜索项目

因此,如果您浏览表单和报告名称,您将能够找到每次以编程方式引用它们的时间。这将无法查找是否使用了查询,因为您需要 Database Documenter。

【讨论】:

以上是关于MS Access 2007:查找使用表单/查询/报告的位置的主要内容,如果未能解决你的问题,请参考以下文章

MS-ACCESS-2007 在表格的表格中可视化研究结果

数据表中的 MS-Access 未绑定组合框?

MS Access 2007 - OpenArgs 没有将值传递给下一个表单?

MS access 2007 使用组合框填充图片

在 MS Access 中查找哪个表单字段指向哪个数据库字段

MS Access:Access 2016 应用程序能否与 Access 2007 一起使用?