Ms access 重新链接表格后的重新查询表单

Ms access 重新链接表格后的重新查询表单,ms-access,vba,Ms Access,Vba,我正在开发一个MS Access应用程序,其中的数据位于一个单独的后端数据库中,也是MS Access。主窗体包含用于打开设置对话框的按钮、窗体标题中的退出按钮和导航控件,其中有许多选项卡显示窗体详细信息中的子窗体。“设置”对话框是一个弹出窗口。在该对话框中,用户可以更改到后端数据库的路径,如果用户保存设置,所有链接表将自动重新链接。这一切都很好 但是,关闭对话框后,重新查询激活的子表单没有任何效果,只有关闭并重新打开表单(例如,通过单击其他选项卡),它才会显示新重新链接数据库中的数据 我认为这

我正在开发一个MS Access应用程序,其中的数据位于一个单独的后端数据库中,也是MS Access。主窗体包含用于打开设置对话框的按钮、窗体标题中的退出按钮和导航控件,其中有许多选项卡显示窗体详细信息中的子窗体。“设置”对话框是一个弹出窗口。在该对话框中,用户可以更改到后端数据库的路径,如果用户保存设置,所有链接表将自动重新链接。这一切都很好

但是,关闭对话框后,重新查询激活的子表单没有任何效果,只有关闭并重新打开表单(例如,通过单击其他选项卡),它才会显示新重新链接数据库中的数据

我认为这与我重新链接vba代码无关

我尝试直接打开我的子窗体,并使用链接表管理器,结果相同。点击功能区上的“刷新”按钮没有任何作用,只有当我切换到“设计”视图并返回到“表单”视图时,表单中的数据才会更新

我还尝试了重新绘制、刷新和重新查询的不同组合,但没有效果

我在我的代码中广泛使用了requery,它工作得很好,但在简单地重新连接链接表之后,它似乎不起作用。不同的后端数据库具有完全相同的结构,它们只是重复的,删除了一些记录以生成测试用例

这是怎么回事


关于Oliver,我认为如果使用子表单的SourceObject属性而不是绑定它们,则可以在不关闭表单的情况下强制更新

Form_myForm.mySubForm1.SourceObject = ""
Form_myForm.mySubForm2.SourceObject = ""
运行您的重新链接例程

Form_myForm.mySubForm1.SourceObject = "mySubFormQuery1"
Form_myForm.mySubForm2.SourceObject = "mySubFormQuery2"

Form_myForm.mySubForm1.requery
Form_myForm.mySubForm2.requery

这只是猜测,我从未遇到过需要在运行时重新链接的情况,但我认为它应该可以工作。

我认为如果使用子表单的SourceObject属性而不是绑定它们,则可以在不关闭表单的情况下强制更新

Form_myForm.mySubForm1.SourceObject = ""
Form_myForm.mySubForm2.SourceObject = ""
运行您的重新链接例程

Form_myForm.mySubForm1.SourceObject = "mySubFormQuery1"
Form_myForm.mySubForm2.SourceObject = "mySubFormQuery2"

Form_myForm.mySubForm1.requery
Form_myForm.mySubForm2.requery
这只是猜测,我从未遇到过需要在运行时重新链接的情况,但我认为它应该会起作用。

谢谢,您的回答为我指明了正确的方向。我不知道SourceObjectproperty。但是,这是保存实际子窗体的子窗体控件的属性。在导航控件的特殊情况下,导航子窗体控件保存在选项卡上定义为NavigationTargetName的活动子窗体

因此,我的代码如下所示:

' ContentContainer is the NavigationSubform control
srcObjStr = Me.ContentContainer.SourceObject
Me.ContentContainer.SourceObject = ""
UpdatePathes 'Relinking
Me.ContentContainer.SourceObject = srcObjStr
甚至不需要再询问。非常好

问候奥利弗谢谢你,你的回答为我指明了正确的方向。我不知道SourceObjectproperty。但是,这是保存实际子窗体的子窗体控件的属性。在导航控件的特殊情况下,导航子窗体控件保存在选项卡上定义为NavigationTargetName的活动子窗体

因此,我的代码如下所示:

' ContentContainer is the NavigationSubform control
srcObjStr = Me.ContentContainer.SourceObject
Me.ContentContainer.SourceObject = ""
UpdatePathes 'Relinking
Me.ContentContainer.SourceObject = srcObjStr
甚至不需要再询问。非常好


关于Oliver

正常情况下,在重新链接期间,将不会打开任何绑定表单,否则重新链接可能会失败。因此,关闭所有绑定表单,重新链接,打开绑定表单-将查看当前链接的数据。感谢您的快速回复。然后我必须更改布局,以便未绑定的设置窗体替换主窗体。我希望会有另一个解决方案。有几种方法可以解决这个问题。Jeffrey的答案中的方法可能是一种,但我也没有测试过。通常,在重新链接期间,您不会打开绑定表单,否则重新链接可能会失败。因此,关闭所有绑定表单,重新链接,打开绑定表单-将查看当前链接的数据。感谢您的快速回复。然后我必须更改布局,以便未绑定的设置窗体替换主窗体。我希望会有另一个解决方案。有几种方法可以解决这个问题。Jeffrey的回答中的方法可能是一种,但我也没有测试过。很好,我要补充的唯一一点是,如果在更新过程中发生意外崩溃,那么在重新打开数据库时,SourceObject仍然是。因此,在打开表单时始终设置该值可能是一个好主意,以确保不会导致错误。这一点很好!在我使用时,另一种解决方案是在代码中使用ErrEx.Catch和ErrEx.Finally块。在finally块中,我将把SourceObject重置为其初始值。但是,vbWatchdog不是免费的。对于纯VBA方法来尝试catch,请仔细研究一下。完美的是,我要补充的唯一一点是,如果在更新过程中发生意外崩溃,则在重新打开DB时,SourceObject仍然会存在。因此,在打开表单时始终设置该值可能是一个好主意,以确保不会导致错误。这一点很好!在我使用时,另一种解决方案是在代码中使用ErrEx.Catch和ErrEx.Finally块。在finally块中,我将把SourceObject重置为其初始值。但是,vbWatchdog不是免费的 看看这个。