如何比较 MS-Access 创建和上次修改表、查询、表单等的日期?
How to compare MS-Access created and last modified dates of tables, queries, forms, etc.?
我喜欢在 Access 2010 数据库中创建和更新 tables、查询、表单等时创建一个列表。
理论上,使用少量 VBA 代码就可以做到这一点,但不幸的是,这段代码显示了错误的信息。我自己测试了它,微软在这里确认了它:https://support.microsoft.com/en-us/kb/299554
Access 在导航面板上显示正确的修改日期,但似乎无法通过 VBA 或任何 table 访问此信息。前段时间我在互联网上搜索了这个,有几个人确认了这个问题,但没有人有答案。
现在我的问题是:有人知道如何从 Access 导出正确的修改日期信息(显示在导航面板中)吗?
如果这是不可能的(我目前的研究表明这一点),有没有人知道一种可靠的方法来将一个数据库文件与另一个数据库文件进行比较,并显示 tables、查询、表单等的所有差异?
这都是关于 Access 对象的设计,而不是关于存储在 table 中的任何数据。
该链接文章描述了为什么 LastUpdated
属性 没有为您提供您想要的数据库对象(例如表单和报告)。不幸的是,它没有告诉您可以使用来自相应 CurrentProject
集合的 DateModified
。
例如,考虑一下导航窗格中表单的屏幕截图:
在 Documents 集合中引用该表单时,LastUpdated
和 DateCreated
都 return 相同的值:
? CurrentDb.Containers("Forms").Documents("Form1").DateCreated
8/20/2012 10:51:07 PM
? CurrentDb.Containers("Forms").Documents("Form1").LastUpdated
8/20/2012 10:51:07 PM
但是 DateModified
对于 CurrentProject.AllForms
集合中的相同表单,您会得到显示在导航窗格中的值:
? CurrentProject.AllForms("Form1").DateModified
7/1/2015 6:47:40 AM
请注意,您还可以通过 AllForms
:
获得 DateCreated
? CurrentProject.AllForms("Form1").DateCreated
8/20/2012 10:51:07 PM
其他 CurrentProject
合集包括:AllMacros
; AllModules
;和 AllReports
。请注意,模块是一起保存的,因此 DateModified
会向您显示项目上次保存的时间。这意味着每个模块将显示相同的时间,与导航窗格中显示的相同。
这是一个可以检索正确信息的函数(模块除外):
Public Function fGetObjectModifiedDate(Object_Name As String, Object_Type As Integer) As Variant
' Get the correct Modified Date of the passed object. MSysObjects and DAO are not accurate for all object types.
' Based on a tip from Philipp Stiefel <https://codekabinett.com>
' Getting the last modified date with this line of code does indeed return incorrect results.
' ? CurrentDb.Containers("Forms").Documents("Form1").LastUpdated
'
' But, that is not what we use to receive the last modified date, except for queries, where the above line is working correctly.
' What we use instead is:
' ? CurrentProject.AllForms("Form1").DateModified
Select Case Object_Type
Case 5 ' Query
fGetObjectModifiedDate = CurrentDb.QueryDefs(Object_Name).LastUpdated
Case -32768 ' Form
fGetObjectModifiedDate = CurrentProject.AllForms(Object_Name).DateModified
' fGetObjectModifiedDate = CurrentDb.Containers("Forms").Documents(Object_Name).LastUpdated
Case -32764 ' Report
fGetObjectModifiedDate = CurrentProject.AllReports(Object_Name).DateModified
Case -32766 ' Macro
fGetObjectModifiedDate = CurrentProject.AllMacros(Object_Name).DateModified
Case -32761 ' Module
' This will report the date that *ANY* module was last saved.
' The CurrentDb.Containers method and MSysObjects will report the date created.
fGetObjectModifiedDate = CurrentProject.AllModules(Object_Name).DateModified
Case Else
' Do nothing. Return Null.
End Select
End Function
免责声明:我引用的是我发布的类似 的答案。
我喜欢在 Access 2010 数据库中创建和更新 tables、查询、表单等时创建一个列表。
理论上,使用少量 VBA 代码就可以做到这一点,但不幸的是,这段代码显示了错误的信息。我自己测试了它,微软在这里确认了它:https://support.microsoft.com/en-us/kb/299554
Access 在导航面板上显示正确的修改日期,但似乎无法通过 VBA 或任何 table 访问此信息。前段时间我在互联网上搜索了这个,有几个人确认了这个问题,但没有人有答案。
现在我的问题是:有人知道如何从 Access 导出正确的修改日期信息(显示在导航面板中)吗?
如果这是不可能的(我目前的研究表明这一点),有没有人知道一种可靠的方法来将一个数据库文件与另一个数据库文件进行比较,并显示 tables、查询、表单等的所有差异?
这都是关于 Access 对象的设计,而不是关于存储在 table 中的任何数据。
该链接文章描述了为什么 LastUpdated
属性 没有为您提供您想要的数据库对象(例如表单和报告)。不幸的是,它没有告诉您可以使用来自相应 CurrentProject
集合的 DateModified
。
例如,考虑一下导航窗格中表单的屏幕截图:
在 Documents 集合中引用该表单时,LastUpdated
和 DateCreated
都 return 相同的值:
? CurrentDb.Containers("Forms").Documents("Form1").DateCreated
8/20/2012 10:51:07 PM
? CurrentDb.Containers("Forms").Documents("Form1").LastUpdated
8/20/2012 10:51:07 PM
但是 DateModified
对于 CurrentProject.AllForms
集合中的相同表单,您会得到显示在导航窗格中的值:
? CurrentProject.AllForms("Form1").DateModified
7/1/2015 6:47:40 AM
请注意,您还可以通过 AllForms
:
DateCreated
? CurrentProject.AllForms("Form1").DateCreated
8/20/2012 10:51:07 PM
其他 CurrentProject
合集包括:AllMacros
; AllModules
;和 AllReports
。请注意,模块是一起保存的,因此 DateModified
会向您显示项目上次保存的时间。这意味着每个模块将显示相同的时间,与导航窗格中显示的相同。
这是一个可以检索正确信息的函数(模块除外):
Public Function fGetObjectModifiedDate(Object_Name As String, Object_Type As Integer) As Variant
' Get the correct Modified Date of the passed object. MSysObjects and DAO are not accurate for all object types.
' Based on a tip from Philipp Stiefel <https://codekabinett.com>
' Getting the last modified date with this line of code does indeed return incorrect results.
' ? CurrentDb.Containers("Forms").Documents("Form1").LastUpdated
'
' But, that is not what we use to receive the last modified date, except for queries, where the above line is working correctly.
' What we use instead is:
' ? CurrentProject.AllForms("Form1").DateModified
Select Case Object_Type
Case 5 ' Query
fGetObjectModifiedDate = CurrentDb.QueryDefs(Object_Name).LastUpdated
Case -32768 ' Form
fGetObjectModifiedDate = CurrentProject.AllForms(Object_Name).DateModified
' fGetObjectModifiedDate = CurrentDb.Containers("Forms").Documents(Object_Name).LastUpdated
Case -32764 ' Report
fGetObjectModifiedDate = CurrentProject.AllReports(Object_Name).DateModified
Case -32766 ' Macro
fGetObjectModifiedDate = CurrentProject.AllMacros(Object_Name).DateModified
Case -32761 ' Module
' This will report the date that *ANY* module was last saved.
' The CurrentDb.Containers method and MSysObjects will report the date created.
fGetObjectModifiedDate = CurrentProject.AllModules(Object_Name).DateModified
Case Else
' Do nothing. Return Null.
End Select
End Function
免责声明:我引用的是我发布的类似