Вопрос по database, version-control, vba – Управление версиями Access 2007 базы данных и приложения

8

Мне нужно управление версиями базы данных и приложения Microsoft Access 2007. В настоящее время все содержится в одном файле MDB.

Приложение включает в себя:

ФормаVBA код Актуальная база данных

Я предполагаю, что мне нужно отделить базу данных от форм / кода. Я хотел бы иметь возможность контроля версий форм / кода в виде текста для поддержки различий версий.

В настоящее время у меня нет доступа к SourceSafe (я слышал, что может быть некоторая поддержка доступа), поэтому я бы предпочел решение, которое будет работать с Subversion или Git.

Ваш Ответ

3   ответа
3

позволяющую разделить БД на таблицы / запросы (бэкэнд) и формы / отчеты (интерфейс). Поскольку в вашем вопросе упоминается только версия, управляющая формами и модулями, это может быть более элегантным решением. Я не знаю, куда идут модули после разделения, поэтому это может стать камнем преткновения.

Microsoft предлагаетVSTO (Инструменты Visual Studio для Office), что позволит вам разрабатывать в VS и запускать управление версиями через любой плагин VS (CVS / SVN / VSS / и т. д.).

Наконец, вы можете напрямую подключиться к Visual Source Safe. Эта статья MSKB обладает хорошей информацией и опытом, а эта статья Office Online предназначен для того, чтобы заставить вас работать.

В конце концов, я бы посоветовал не выводить код из Access, если это вообще возможно. Предполагая, что редактор VBA является вашей основной средой разработки, вы будете добавлять дополнительные шаги в процесс разработки, которые не могут быть легко автоматизированы. Каждое внесенное вами изменение необходимо будет экспортировать, разложить и сохранить вручную, и нет события Application.OnCompile, которое вы могли бы использовать для экспорта изменений. Еще сложнее, вам придется вручную импортировать все измененные исходные файлы от других разработчиков, когда они делают проверки.

Я согласен ... похоже, что оставить все в Access - это, наверное, лучший маршрут. Я собираюсь разделить файл. Нужно будет просто держать подробную проверку в комментариях при изменении кода. С нетерпением жду возможности перенести эту штуку на что-то более дружелюбное для разработчиков Jesse Vogt
Бонусные баллы за несколько из этих методов - они проходят тест Джоэля за автоматизированный процесс сборки. Andrew Scagnelli
Визуальный источник Сейф нужно умереть! ja72
Синхронизация кода теперь не так сложна, как раньше. Надо было взять дело в свои руки. RubberDuck
2

el, вы можете изменить его для извлечения из Access.

Sub ExtractVBACode(strSource, objFSO, strExportPath, objLogFile)
Dim objExcel
Dim objWorkbook
Dim objVBComponent
Dim strFileSuffix
Dim strExportFolder


Set objExcel = CreateObject("Excel.Application")

objExcel.Visible = true

Set objWorkbook = objExcel.Workbooks.Open(Trim(strSource))

strExportFolder = strExportPath & objFSO.GetBaseName(objWorkbook.Name)

If Not objFSO.FolderExists(strExportFolder) Then
    objFSO.CreateFolder(strExportFolder)
End If

For Each objVBComponent In objWorkbook.VBProject.VBComponents
    Select Case objVBComponent.Type
        Case vbext_ct_ClassModule, vbext_ct_Document
            strFileSuffix = ".cls"
        Case vbext_ct_MSForm
            strFileSuffix = ".frm"
        Case vbext_ct_StdModule
            strFileSuffix = ".bas"
        Case Else
            strFileSuffix = ""
    End Select
    If strFileSuffix <> "" Then
        On Error Resume Next
        Err.Clear
        objVBComponent.Export strExportFolder & "\" & objVBComponent.Name & strFileSuffix
        If Err.Number <> 0 Then
            objLogFile.WriteLine ("Failed to export " & strExportFolder & "\" & objVBComponent.Name & strFileSuffix)
        Else
            objLogFile.WriteLine ("Export Successful: " & strExportFolder & "\" & objVBComponent.Name & strFileSuffix)
        End If
        On Error Goto 0
    End If
Next

objExcel.DisplayAlerts = False
objExcel.Quit

End Sub

Может быть, вы извлекаете формы как XML?

Интересная идея ... Я могу поиграть с ней чуть позже. Насколько легко это туда и обратно? В идеале я хотел бы иметь возможность перейти от проверки к работе над кодом без особых хлопот. Спасибо за ответ Jesse Vogt
В оба конца все вручную (импорт / экспорт). Вы можете экспортировать формы в виде кода, но вам все равно придется делать это вручную. Andrew Scagnelli
2

очень похожий на существующий ответ. Хитрость заключается в том, чтобы поместить все ваши модули в файловую систему, но у этого метода есть некоторые недостатки. Идя по этому пути, вы можете получать свои формы и отчеты из проектов VBA, но вы не можете вернуть их обратно. Итак, я создал библиотеку как часть нашегоRubberduck VBE Надстройка. Библиотека, которую я написал, заботится об импорте и экспортвс вашего кода в / из проекта VBA в / из репозитория, когда вы, кажется, без усилий толкаете, извлекаете и фиксируете. Это бесплатный проект с открытым исходным кодом, так что не стесняйтесь скачать и установить последнюю версию.

Вот пример того, как используется библиотека. Я добавлю фактическую интеграцию с редактором VBA в следующем выпуске.

Dim factory As New Rubberduck.SourceControlClassFactory 
Dim repo As Rubberduck.IRepository 
Dim git As ISourceControlProvider

Dim xl As New Excel.Application
xl.Visible = true
Dim wb As Excel.Workbook

Set wb = xl.Workbooks.Open("C:\Path\to\workbook.xlsm")

' create class instances to work with
Set repo = factory.CreateRepository(wb.VBProject.Name, "C:\Path\to\local\repository\SourceControlTest", "https://github.com/ckuhn203/SourceControlTest.git")
Set git = factory.CreateGitProvider(wb.VBProject, repo, "userName", "passWord")

' Create new branch to modify.
git.CreateBranch "NewBranchName"

' It is automatically checked out.
Debug.Print "Current Branch: " & git.CurrentBranch

' add a new standard (.bas) code module and a comment to that file
wb.VBProject.VBComponents.Add(vbext_ct_StdModule).CodeModule.AddFromString "' Hello There"

' add any new files to tracking
Dim fileStat As Rubberduck.FileStatusEntry
For Each fileStat In git.Status
    ' fileStat.FileStatus is a bitwise enumeration, so we use bitwise AND to test for equality here
    If fileStat.FileStatus And Rubberduck.FileStatus.Added Then
        git.AddFile fileStat.FilePath
    End If
Next

git.Commit "commit all modified files" 

' Revert the last commit, throwing away the changes we just made.
git.Revert

Похожие вопросы