版本控制Access 2007数据库和应用程序

时间:2009-07-05 20:53:51

标签: database ms-access version-control vba ms-access-2007

我需要版本控制Microsoft Access 2007数据库和应用程序。目前,所有内容都包含在一个mdb文件中。

该申请包括:

  • 表单
  • VBA代码
  • 实际数据库

我认为我需要将数据库与表单/代码分开。我希望能够将表单/代码的版本控制为文本以支持版本差异。

目前我无法访问SourceSafe(我听说可能有一些访问支持),所以我更倾向于使用subversion或git的解决方案。

3 个答案:

答案 0 :(得分:3)

Access 2007具有以下功能:您可以将数据库拆分为其表/查询(后端)和表单/报表(前端)。由于您的问题仅提到控制表单和模块的版本,因此这可能是更优雅的解决方案。我不知道拆分后模块在哪里,所以这可能是一个绊脚石。

Microsoft提供VSTO (Visual Studio Tools for Office),它允许您在VS中开发并通过任何VS插件(CVS / SVN / VSS /等)运行版本控制。

最后,您可以直接连接到Visual Source Safe。 This MSKB article有一些很好的信息和背景可供使用,而this Office Online article则是为了帮助您启动和运行。

最终,如果可能的话,我建议不要将代码从Access中删除。假设VBA编辑器是您的主要开发环境,您将在开发过程中添加额外的步骤,这些步骤无法轻松实现自动化。您所做的每个更改都需要手动导出,差异和存储,并且没有可用于导出更改的Application.OnCompile事件。更难的是,您必须在签入时手动从其他开发人员导入所有已更改的源文件。

答案 1 :(得分:2)

我使用下面的代码从Excel文件中提取vba代码,您可以将其修改为从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?

答案 2 :(得分:2)

我一直在努力解决同样的问题。我最初编写的代码与现有的答案非常相似。 The trick is to get all of your modules onto the file system,但该方法有一些缺点。走这条路线,你可以从VBA项目中获取表格和报告,但是你无法让他们重新进入。所以,我created a library作为Rubberduck VBE Add-in的一部分。我编写的库负责将您的代码的所有导入和导出到VBA项目/从存储库导出/导出,无需推送,拉取和提交。它是一个免费的开源项目,所以请download and install the latest version随意。

以下是如何使用库的示例。我将在以后的版本中添加与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