Как сравнить 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

Отказ от ответственности: я ссылаюсь на ответ на аналогичный вопрос, который я опубликовал.

Другие вопросы по тегам