167 votes

Comment utilisez-vous le contrôle de version avec le développement d'Access?

Je suis impliqué avec la mise à jour d'une solution d'Accès. Il a une bonne quantité de VBA, un certain nombre de requêtes, une petite quantité de tableaux, et quelques formulaires pour la saisie des données et la génération de rapports. C'est un candidat idéal pour l'Accès.

Je veux apporter des modifications à la conception de la table, le VBA, les requêtes et les formulaires. Comment puis-je suivre mon évolution avec le contrôle de version? (nous utilisons la Subversion, mais cela vaut pour toute saveur) je peux coller l'ensemble de la mdb dans la subversion, mais qui sera le stockage d'un fichier binaire, et je ne serai pas en mesure de dire que je viens de changer une ligne de code VBA.

J'ai pensé à copier le code VBA pour séparer les fichiers, et la sauvegarde de ceux-ci, mais j'ai pu voir ces rapidement sortir de la synchronisation avec ce qui est dans la base de données.

184voto

Oliver Points 1790

Nous avons écrit notre propre script en VBScript, qui utilise les sans-papiers de l'Application.SaveAsText() dans l'Accès à l'exportation de la totalité du code, la forme, les macros et les modules de rapport. Ici, il est, il devrait vous donner quelques conseils. (Attention: certains messages sont en allemand, mais vous pouvez facilement changer cela.)

EDIT: Pour résumer les différents commentaires ci-dessous: Notre Projet suppose une .adp-fichier. Afin d'obtenir ce travail .mdb/.accdb, vous devez changer OpenAccessProject() pour OpenCurrentDatabase(). (Mis à jour pour utiliser OpenAccessProject() si elle voit un .adp extension, sinon utiliser OpenCurrentDatabase().)

avant de se décomposer.vbs:

' Usage:
'  CScript decompose.vbs <input file> <path>

' Converts all modules, classes, forms and macros from an Access Project file (.adp) <input file> to
' text and saves the results in separate files to <path>.  Requires Microsoft Access.
'

Option Explicit

const acForm = 2
const acModule = 5
const acMacro = 4
const acReport = 3

' BEGIN CODE
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

dim sADPFilename
If (WScript.Arguments.Count = 0) then
    MsgBox "Bitte den Dateinamen angeben!", vbExclamation, "Error"
    Wscript.Quit()
End if
sADPFilename = fso.GetAbsolutePathName(WScript.Arguments(0))

Dim sExportpath
If (WScript.Arguments.Count = 1) then
    sExportpath = ""
else
    sExportpath = WScript.Arguments(1)
End If


exportModulesTxt sADPFilename, sExportpath

If (Err <> 0) and (Err.Description <> NULL) Then
    MsgBox Err.Description, vbExclamation, "Error"
    Err.Clear
End If

Function exportModulesTxt(sADPFilename, sExportpath)
    Dim myComponent
    Dim sModuleType
    Dim sTempname
    Dim sOutstring

    dim myType, myName, myPath, sStubADPFilename
    myType = fso.GetExtensionName(sADPFilename)
    myName = fso.GetBaseName(sADPFilename)
    myPath = fso.GetParentFolderName(sADPFilename)

    If (sExportpath = "") then
        sExportpath = myPath & "\Source\"
    End If
    sStubADPFilename = sExportpath & myName & "_stub." & myType

    WScript.Echo "copy stub to " & sStubADPFilename & "..."
    On Error Resume Next
        fso.CreateFolder(sExportpath)
    On Error Goto 0
    fso.CopyFile sADPFilename, sStubADPFilename

    WScript.Echo "starting Access..."
    Dim oApplication
    Set oApplication = CreateObject("Access.Application")
    WScript.Echo "opening " & sStubADPFilename & " ..."
    If (Right(sStubADPFilename,4) = ".adp") Then
        oApplication.OpenAccessProject sStubADPFilename
    Else
        oApplication.OpenCurrentDatabase sStubADPFilename
    End If

    oApplication.Visible = false

    dim dctDelete
    Set dctDelete = CreateObject("Scripting.Dictionary")
    WScript.Echo "exporting..."
    Dim myObj
    For Each myObj In oApplication.CurrentProject.AllForms
        WScript.Echo "  " & myObj.fullname
        oApplication.SaveAsText acForm, myObj.fullname, sExportpath & "\" & myObj.fullname & ".form"
        oApplication.DoCmd.Close acForm, myObj.fullname
        dctDelete.Add "FO" & myObj.fullname, acForm
    Next
    For Each myObj In oApplication.CurrentProject.AllModules
        WScript.Echo "  " & myObj.fullname
        oApplication.SaveAsText acModule, myObj.fullname, sExportpath & "\" & myObj.fullname & ".bas"
        dctDelete.Add "MO" & myObj.fullname, acModule
    Next
    For Each myObj In oApplication.CurrentProject.AllMacros
        WScript.Echo "  " & myObj.fullname
        oApplication.SaveAsText acMacro, myObj.fullname, sExportpath & "\" & myObj.fullname & ".mac"
        dctDelete.Add "MA" & myObj.fullname, acMacro
    Next
    For Each myObj In oApplication.CurrentProject.AllReports
        WScript.Echo "  " & myObj.fullname
        oApplication.SaveAsText acReport, myObj.fullname, sExportpath & "\" & myObj.fullname & ".report"
        dctDelete.Add "RE" & myObj.fullname, acReport
    Next

    WScript.Echo "deleting..."
    dim sObjectname
    For Each sObjectname In dctDelete
        WScript.Echo "  " & Mid(sObjectname, 3)
        oApplication.DoCmd.DeleteObject dctDelete(sObjectname), Mid(sObjectname, 3)
    Next

    oApplication.CloseCurrentDatabase
    oApplication.CompactRepair sStubADPFilename, sStubADPFilename & "_"
    oApplication.Quit

    fso.CopyFile sStubADPFilename & "_", sStubADPFilename
    fso.DeleteFile sStubADPFilename & "_"


End Function

Public Function getErr()
    Dim strError
    strError = vbCrLf & "----------------------------------------------------------------------------------------------------------------------------------------" & vbCrLf & _
               "From " & Err.source & ":" & vbCrLf & _
               "    Description: " & Err.Description & vbCrLf & _
               "    Code: " & Err.Number & vbCrLf
    getErr = strError
End Function

Si vous avez besoin d'un bouton de Commande, au lieu d'utiliser la ligne de commande, créez un fichier nommé "décomposer.cmd" avec

cscript decompose.vbs youraccessapplication.adp

Par défaut, tous les fichiers exportés aller dans un "Scripts", sous-dossier de votre Accès à l'application. L' .adp/mdb fichier est copié à l'emplacement (avec un "stub" suffixe) et dépouillé de tous les exportée modules, qui rend vraiment petit.

Vous DEVEZ d'archivage de ce talon à la source des fichiers, car la plupart des paramètres d'accès et de menu personnalisé-barres ne peuvent pas être exportées de toute autre manière. Juste être sûr de valider les modifications apportées à ce fichier uniquement si vous avez vraiment changé quelques réglages, ou un menu.

Remarque: Si vous avez n'importe quel fichier Autoexec-Makros définies dans votre Application, vous pouvez avoir à maintenir la touche Shift enfoncée lorsque vous appelez le décomposer pour l'empêcher de s'exécuter et d'interférer avec l'exportation!

Bien sûr, il y a aussi le revers de script, pour construire l'Application de la "Source"-Répertoire:

composer de la musique.vbs:

' Usage:
'  WScript compose.vbs <file> <path>

' Converts all modules, classes, forms and macros in a directory created by "decompose.vbs"
' and composes then into an Access Project file (.adp). This overwrites any existing Modules with the
' same names without warning!!!
' Requires Microsoft Access.

Option Explicit

const acForm = 2
const acModule = 5
const acMacro = 4
const acReport = 3

Const acCmdCompileAndSaveAllModules = &H7E

' BEGIN CODE
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

dim sADPFilename
If (WScript.Arguments.Count = 0) then
    MsgBox "Bitte den Dateinamen angeben!", vbExclamation, "Error"
    Wscript.Quit()
End if
sADPFilename = fso.GetAbsolutePathName(WScript.Arguments(0))

Dim sPath
If (WScript.Arguments.Count = 1) then
    sPath = ""
else
    sPath = WScript.Arguments(1)
End If


importModulesTxt sADPFilename, sPath

If (Err <> 0) and (Err.Description <> NULL) Then
    MsgBox Err.Description, vbExclamation, "Error"
    Err.Clear
End If

Function importModulesTxt(sADPFilename, sImportpath)
    Dim myComponent
    Dim sModuleType
    Dim sTempname
    Dim sOutstring

    ' Build file and pathnames
    dim myType, myName, myPath, sStubADPFilename
    myType = fso.GetExtensionName(sADPFilename)
    myName = fso.GetBaseName(sADPFilename)
    myPath = fso.GetParentFolderName(sADPFilename)

    ' if no path was given as argument, use a relative directory
    If (sImportpath = "") then
        sImportpath = myPath & "\Source\"
    End If
    sStubADPFilename = sImportpath & myName & "_stub." & myType

    ' check for existing file and ask to overwrite with the stub
    if (fso.FileExists(sADPFilename)) Then
        WScript.StdOut.Write sADPFilename & " existiert bereits. Überschreiben? (j/n) "
        dim sInput
        sInput = WScript.StdIn.Read(1)
        if (sInput <> "j") Then
            WScript.Quit
        end if

        fso.CopyFile sADPFilename, sADPFilename & ".bak"
    end if

    fso.CopyFile sStubADPFilename, sADPFilename

    ' launch MSAccess
    WScript.Echo "starting Access..."
    Dim oApplication
    Set oApplication = CreateObject("Access.Application")
    WScript.Echo "opening " & sADPFilename & " ..."
    If (Right(sStubADPFilename,4) = ".adp") Then
        oApplication.OpenAccessProject sADPFilename
    Else
        oApplication.OpenCurrentDatabase sADPFilename
    End If
    oApplication.Visible = false

    Dim folder
    Set folder = fso.GetFolder(sImportpath)

    ' load each file from the import path into the stub
    Dim myFile, objectname, objecttype
    for each myFile in folder.Files
        objecttype = fso.GetExtensionName(myFile.Name)
        objectname = fso.GetBaseName(myFile.Name)
        WScript.Echo "  " & objectname & " (" & objecttype & ")"

        if (objecttype = "form") then
            oApplication.LoadFromText acForm, objectname, myFile.Path
        elseif (objecttype = "bas") then
            oApplication.LoadFromText acModule, objectname, myFile.Path
        elseif (objecttype = "mac") then
            oApplication.LoadFromText acMacro, objectname, myFile.Path
        elseif (objecttype = "report") then
            oApplication.LoadFromText acReport, objectname, myFile.Path
        end if

    next

    oApplication.RunCommand acCmdCompileAndSaveAllModules
    oApplication.Quit
End Function

Public Function getErr()
    Dim strError
    strError = vbCrLf & "----------------------------------------------------------------------------------------------------------------------------------------" & vbCrLf & _
               "From " & Err.source & ":" & vbCrLf & _
               "    Description: " & Err.Description & vbCrLf & _
               "    Code: " & Err.Number & vbCrLf
    getErr = strError
End Function

Encore une fois, cela va avec un compagnon de "composer.cmd" contenant:

cscript compose.vbs youraccessapplication.adp

Il vous demande de confirmer l'écrasement de votre demande actuelle et crée d'abord une sauvegarde, si vous le faites. Ensuite, il recueille toutes les sources des fichiers dans le Source de Répertoire ou de ré-insère dans le talon.

Amusez-Vous!

19voto

Brettski Points 5485

Il semble être quelque chose de tout à fait disponible dans l'Accès:

Ce lien à partir de msdn explique comment installer un contrôle de source de add-in pour Microsoft Access. Cette expédiés en téléchargement gratuit dans une partie de l'Accès Developer Extensions pour Access 2007 et séparés comme complément gratuit pour Access 2003.

Je suis content que vous posiez cette question et j'ai pris le temps de le chercher, que je voudrais que cette capacité de trop. Le lien ci-dessus a plus d'informations sur ce sujet et des liens vers les add-ins.

Mise à jour:
J'ai installé l'add-in pour Accéder à 2003. Il ne fonctionne qu'avec VSS, mais il ne me permettre de le mettre Accéder à des objets (formulaires, des requêtes, des tables, des modules, ect) dans le référentiel. Quand vous allez modifier n'importe quel élément dans le repo vous êtes invité à vérifier, mais vous n'avez pas à. Ensuite, je vais vérifier comment il gère être ouvert et modifié sur un système sans l'add-in. Je ne suis pas un fan de VSS, mais j'aime vraiment la pensée de stocker les objets d'accès dans une pension.

Update2:
Machines sans le complément sont pas en mesure de faire des changements à la structure de base de données (ajouter les champs de la table, les paramètres de la requête, etc.). Au début, j'ai pensé que cela pourrait être un problème si quelqu'un en avait besoin, car il n'y avait pas vraiment de moyen de supprimer la base de données Access à partir de la source de contrôle si l'Accès n'ai pas les ajouter chargé.

Id découvert que l'exécution de "compacter et réparer une base de données" vous demande si vous souhaitez supprimer la base de données à partir de la source de contrôle. J'ai opté oui et a été en mesure de modifier la base de données sans l'add-in. L'article dans le lien ci-dessus donnent également des instructions de configuration de l'Accès à 2003 et 2007 afin d'utiliser le Système d'Équipe. Si vous pouvez trouver un fournisseur MSSCCI pour SVN, il ya une bonne chance que vous pouvez obtenir que cela fonctionne.

14voto

DaveParillo Points 1894

Les Olivers répondent aux roches, mais la référence CurrentProject ne fonctionnait pas pour moi. J'ai fini par déchirer les tripes au milieu de son exportation pour la remplacer par celle-ci, basée sur une solution similaire d' Arvin Meyer . A l'avantage d'exporter des requêtes si vous utilisez un mdb au lieu d'un adp.

 ' Writes database componenets to a series of text files
' @author  Arvin Meyer
' @date    June 02, 1999
Function DocDatabase(oApp)
    Dim dbs 
    Dim cnt 
    Dim doc 
    Dim i
    Dim prefix
    Dim dctDelete
    Dim docName

    Const acQuery = 1

    Set dctDelete = CreateObject("Scripting.Dictionary")

    Set dbs = oApp.CurrentDb() ' use CurrentDb() to refresh Collections
    Set cnt = dbs.Containers("Forms")
    prefix = oApp.CurrentProject.Path & "\"
    For Each doc In cnt.Documents
        oApp.SaveAsText acForm, doc.Name, prefix & doc.Name & ".frm"
        dctDelete.Add "frm_" & doc.Name, acForm
    Next

    Set cnt = dbs.Containers("Reports")
    For Each doc In cnt.Documents
        oApp.SaveAsText acReport, doc.Name, prefix & doc.Name & ".rpt"
        dctDelete.Add "rpt_" & doc.Name, acReport
    Next

    Set cnt = dbs.Containers("Scripts")
    For Each doc In cnt.Documents
        oApp.SaveAsText acMacro, doc.Name, prefix & doc.Name & ".vbs"
        dctDelete.Add "vbs_" & doc.Name, acMacro
    Next

    Set cnt = dbs.Containers("Modules")
    For Each doc In cnt.Documents
        oApp.SaveAsText acModule, doc.Name, prefix & doc.Name & ".bas"
        dctDelete.Add "bas_" & doc.Name, acModule
    Next

    For i = 0 To dbs.QueryDefs.Count - 1
        oApp.SaveAsText acQuery, dbs.QueryDefs(i).Name, prefix & dbs.QueryDefs(i).Name & ".txt"
        dctDelete.Add "qry_" & dbs.QueryDefs(i).Name, acQuery
    Next

    WScript.Echo "deleting " & dctDelete.Count & " objects."
    For Each docName In dctDelete
        WScript.Echo "  " & Mid(docName, 5)
        oApp.DoCmd.DeleteObject dctDelete(docName), Mid(docName, 5)
    Next

    Set doc = Nothing
    Set cnt = Nothing
    Set dbs = Nothing
    Set dctDelete = Nothing

End Function
 

11voto

Philippe Grondier Points 6697

Nous avons développé notre propre outil interne, d'où:

  1. Modules: sont exportés en tant que fichiers txt, puis de les comparer avec "outil de comparaison de fichier" (freeware)
  2. Formes: sont exportés à travers le undocument de l'application.saveAsText de commande. Il est alors possible de voir les différences entre les 2 versions différentes ("outil de comparaison de fichier" une fois de plus).
  3. Macros: nous n'avons pas de macro pour comparer, nous avons seulement le "autoexec" macro avec une ligne de lancement de la principale procédure VBA
  4. Requêtes: sont simplement des chaînes de texte stockés dans une table: voir infra
  5. tables: nous avons écrit notre propre tableau de comparaison, la liste des différences dans les dossiers ET structure de la table.

L'ensemble du système est assez intelligent pour nous permettre de produire de "l'exécution" des versions de notre application Access, généré automatiquement à partir des fichiers txt (modules, et les formulaires recréé avec la undocument de l'application.loadFromText de commande) et les fichiers mdb (tables).

Cela peut paraître étrange, mais ça fonctionne.

9voto

mnieto Points 1160

Sur la base des idées de ce post et des entrées similaires dans certains blogs, j'ai écrit une application qui fonctionne avec mdb et adp formats de fichier. Il importer/exporter tous les objets de base de données (y compris les tables, les références, les relations et les propriétés de la base) pour les fichiers de texte brut. Avec ces fichiers, vous pouvez travailler avec n'importe quelle source de contrôle de version. La prochaine version permettra d'importer les fichiers de texte brut à la base de données. Il y aura également un outil de ligne de commande

Vous pouvez télécharger l'application ou le code source à partir de: http://accesssvn.codeplex.com/

ce qui concerne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X