Как сравнить MS-Access с созданными и последними изменениями дат таблиц, запросов, форм и т. Д.?
Мне нравится создавать список, когда таблицы, запросы, формы и т. Д. Создавались и обновлялись в базе данных Access 2010.
Теоретически это возможно с небольшим кодом VBA, но, к сожалению, этот код показывает неверную информацию. Я проверил это сам, и это подтверждается Microsoft здесь: https://support.microsoft.com/en-us/kb/299554
Access отображает правильную дату изменения на панели навигации, но, кажется, невозможно получить доступ к этой информации через VBA или в любой таблице. Некоторое время назад я искал это в интернете, и пара человек подтвердила проблему, но ни у кого не было ответа.
Теперь мой вопрос: кто-нибудь знает, как экспортировать правильную информацию о дате изменения из Access (показанной на панели навигации)?
Если это невозможно (мои нынешние исследования предполагают это), знает ли кто-нибудь надежный способ сравнить один файл базы данных с другим и показать все различия в таблицах, запросах, формах и т. Д.?
Это все о дизайне объектов Access, а не о каких-либо данных, хранящихся в таблицах.
1 ответ
Эта связанная статья описывает, почему LastUpdated
свойство не дает вам то, что вы хотите для объектов базы данных, таких как формы и отчеты. К сожалению, это не говорит вам, что вы можете использовать DateModified
из соответствующего CurrentProject
Коллекция для тех.
Например, рассмотрим этот снимок экрана формы на панели навигации:
При ссылке на эту форму в коллекции документов, LastUpdated
а также DateCreated
оба возвращают одно и то же значение:
? 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
Обратите внимание, вы также можете получить DateCreated
с помощью AllForms
:
? 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
Отказ от ответственности: я ссылаюсь на ответ на аналогичный вопрос, который я опубликовал.