Access geliştirme ile sürüm denetimini nasıl kullanıyorsunuz?


163

Bir Access çözümünü güncellemeyle ilgileniyorum. Çok sayıda VBA, bir dizi sorgu, az miktarda tablo ve veri girişi ve rapor oluşturma için birkaç formu vardır. Access için ideal bir aday.

Tablo tasarımında, VBA'da, sorgularda ve formlarda değişiklik yapmak istiyorum. Sürüm kontrolü ile değişikliklerimi nasıl takip edebilirim? (Subversion kullanıyoruz, ancak bu herhangi bir lezzet için geçerli) Subversiyonda mdb'nin tamamını yapıştırabilirim, ancak bu bir ikili dosya depolayacak ve VBA kodunun sadece bir satırını değiştirdiğimi söyleyemeyeceğim.

VBA kodunu ayrı dosyalara kopyalamayı ve bunları kaydetmeyi düşündüm, ancak veritabanında olanlarla hızlı bir şekilde senkronizasyondan çıkanlar görebiliyordum.


1
Bu çözümü Access db şemasını dışa aktarma ile ilgili soruya çapraz damgalama .
Eric G

1
Access SCC arabirimini destekler, bu nedenle bu arabirimle uyumlu tüm sürüm kontrolleri Access için hazırdır. Feragatname: plasticscm.com için çalışıyorum ve bunu Access ile kullanan birkaç müşterimiz var.
pablo

Yanıtlar:


180

VBScript'te, tüm kod, form, makro ve rapor modüllerini dışa aktarmak için Access'te belgesiz Application.SaveAsText () kullanan kendi komut dosyamızı yazdık. İşte size bazı işaretçiler vermeli. (Dikkat: mesajların bazıları Almanca'dır, ancak bunu kolayca değiştirebilirsiniz.)

DÜZENLEME: Aşağıdaki çeşitli yorumları özetlemek gerekirse: Projemiz bir .adp dosyası olduğunu varsayar. Bu işi .mdb / .accdb ile almak için, OpenAccessProject () öğesini OpenCurrentDatabase () olarak değiştirmeniz gerekir.. ( OpenAccessProject()Bir .adp uzantısı görürse kullanmak için güncellendi , aksi takdirde kullanın OpenCurrentDatabase().)

decompose.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

Tıklanabilir bir Komuta ihtiyacınız varsa, komut satırını kullanmak yerine, "decompose.cmd" adlı bir dosya oluşturun.

cscript decompose.vbs youraccessapplication.adp

Varsayılan olarak, dışa aktarılan tüm dosyalar Access uygulamanızın bir "Komut Dosyaları" alt klasörüne gider. .Adp / mdb dosyası da bu konuma kopyalanır ("saplama" soneki ile) ve dışa aktarılan tüm modüllerden çıkarılır, bu da gerçekten küçük olur.

Çoğu erişim ayarları ve özel menü çubukları başka bir şekilde dışa aktarılamayacağından, bu saplamayı kaynak dosyalarla kontrol etmeniz GEREKİR. Bazı ayarları veya menüyü gerçekten değiştirdiyseniz, yalnızca bu dosyada değişiklik yaptığınızdan emin olun.

Not: Uygulamanızda tanımlanmış herhangi bir Autoexec-Makros varsa, ayrışmayı çalıştırdığınızda dışa aktarmayı yürütmesini ve dışa müdahale etmesini önlemek için Shift tuşunu basılı tutmanız gerekebilir!

Tabii ki, "Kaynak" -Directory Uygulamayı oluşturmak için ters komut dosyası da vardır:

compose.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 "Please enter the file name!", 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 & " exists. Overwrite? (y/n) "
        dim sInput
        sInput = WScript.StdIn.Read(1)
        if (sInput <> "y") 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

Yine, bu aşağıdakileri içeren "compose.cmd" adlı bir arkadaşla birlikte gider:

cscript compose.vbs youraccessapplication.adp

Geçerli uygulamanızın üzerine yazmanızı onaylamanızı ister ve önce bir yedek oluşturur. Daha sonra tüm kaynak dosyalarını Kaynak Dizini'nde toplar ve bunları saplamaya yeniden ekler.

İyi eğlenceler!


1
Bu kodu seviyorum. OApplication.OpenAccessProject bir .accdb dosya (veya belki de bir Access 2007 şey) üzerinde işe yaramaz buldum ve bunun yerine oApplication.OpenCurrentDatabase kullanmak zorunda kaldı.
hughdbrown

1
Ben benzer bir şey yapıyorum (SaveAsText, ama VBA ve ADP yerine bir MDB dosyası ile), ama büyük bir sorun kaldı: her ihracattan sonra, Subversion değişti olarak yaklaşık 100 dosya tanır (sadece bir veya iki değişti bile ). değişikliklere baktığımda, bazı değişken adlarının veya kontrol adlarının büyük / küçük harf yazımını değiştirdiğini görüyorum. Örneğin: "OrderNumber" içeren her dosya artık dışa aktarımda "Ordernumber" içeriyor ve bu nedenle "değiştirildi" olarak işaretleniyor (en azından SVN tarafından henüz başka bir SCM denemedi). Bundan nasıl kaçınacağım hakkında bir fikrin var mı? Çok teşekkürler!
Christian Specht

3
Evet, bu da projemizde sürekli bir sıkıntı. Belirlediğimiz kadarıyla sorun, projenizdeki değişkenlerin kontrollerle aynı isimlere sahip olması, sadece farklı durumlarda (yukarı / düşük). Şimdi, modüllerin oluşturulma sırasına bağlı olarak, VBA'nın büyük / küçük harfe duyarsız olması gerektiği için Access bir yazım ve diğerlerini "zekice" alıyor gibi görünüyor. Kontroller farklı formlarda olsa bile erişim bunu yapar! Farklı adlarda farklı durumlarda aynı adda birden fazla denetiminiz olsa bile sorun büyür.
Oliver

3
Tek çözüm, her Değişken / Kontrol-Adını avlamak ve yazımı ortak bir forma dönüştürmektir. Dışa aktarma ve değişiklikleri yaptıktan sonra isimler sabit olmalıdır. Kontrol adlarının türleriyle öneklendirilmesi, adlandırma kuralı ile adların değişkenlerle çarpışmamasını sağlar. (örneğin, Başlık alanını içeren bir metin kutusu için txtTitle veya birleşik giriş kutusu için cmbUsers vb.)
Oliver

Mdb en I bu işi almak için değiştirmek zorunda eklemek unuttum OpenAccessProject için OpenCurrentDatabase .
DaveParillo

19

Access'te oldukça kullanılabilir bir şey gibi görünüyor:

Msdn'deki bu bağlantı , Microsoft Access için bir kaynak denetimi eklentisinin nasıl yükleneceğini açıklar. Bu, Access 2007 için Access Developer Extensions'ın bir parçası olarak ve Access 2003 için ayrı bir ücretsiz eklenti olarak ücretsiz olarak indirildi.

Bu soruyu sorduğunuza sevindim ve bu yeteneği de istediğim gibi araştırmaya zaman ayırdım. Yukarıdaki bağlantıda bununla ilgili daha fazla bilgi ve eklentilere bağlantılar vardır.

Güncelleme:
Access 2003 eklentisini yükledim. Yalnızca VSS ile çalışacak, ancak Access nesnelerini (formlar, sorgular, tablolar, modüller, vb.) Depoya koymamı sağlıyor. Depodaki herhangi bir öğeyi düzenlediğinizde, teslim almanız istenir, ancak bunu yapmanız gerekmez. Daha sonra eklenti olmadan bir sistemde nasıl açıldığını ve değiştirildiğini kontrol edeceğim. Ben VSS hayranı değilim, ama erişim nesnelerini bir depoda saklamayı düşünüyorum.

Güncelleme2: Eklentisi
olmayan makineler veritabanı yapısında herhangi bir değişiklik yapamaz (tablo alanları, sorgu parametreleri vb. Ekle). İlk olarak, Access eklentisi yüklü değilse Access veritabanını kaynak denetiminden kaldırmanın belirgin bir yolu olmadığından, birinin gerekli olması durumunda bunun bir sorun olabileceğini düşündüm.

Id, "kompakt ve onarım" veritabanını çalıştırmanın, veritabanını kaynak denetiminden kaldırmak isteyip istemediğinizi soracağını keşfetti. Evet seçtim ve eklenti olmadan veritabanını düzenleyebildim. Yukarıdaki bağlantıdaki makale ayrıca Access 2003 ve 2007'yi Team System'i kullanacak şekilde ayarlama konusunda talimatlar vermektedir. SVN için bir MSSCCI sağlayıcısı bulabilirseniz, bunun işe yaramasını sağlayabilirsiniz.


Birden fazla kişi düzenlediyse, VSS'den bir ADP'yi kontrol edememeyle ilgili birkaç sorun yaşadığımızı unutmayın. Bunun için ayrı bir yedekleme yapmak zorunda kaldık!
Simon

Bu yaklaşımla oynadım (Apps Kasası'nı kullanarak, SVN için ücretsiz MSSCCI sağlayıcıları bilmediğimden ... TortoiseSVNSCC bakıma alınmadı ve benim için çalışmadı ve diğer iki veya üç seçenek ticari). Çalışıyor, ancak sizi kaynak kontrolü için arkaik özel kilitleme yaklaşımını kullanmaya zorluyor ve bu nedenle onu terk etmeyi ve @ Oliver'ın çözümünü kullanmayı planlıyorum.
Todd Owen

14

Oliver tarafından yayınlanan oluşturma / ayrışma çözümü harika, ancak bazı sorunları var:

  • Dosyalar UCS-2 (UTF-16) olarak kodlanmıştır, bu da sürüm kontrol sistemlerinin / araçlarının dosyaların ikili olduğunu düşünmesine neden olabilir.
  • Dosyalar, sağlama toplamları, yazıcı bilgileri ve daha fazlası gibi sık sık değişen çok sayıda rüşvet içerir. Temiz farklar istiyorsanız veya proje üzerinde işbirliği yapmanız gerekiyorsa, bu ciddi bir sorundur.

Bunu kendim düzeltmeyi planlıyordum, ancak zaten iyi bir çözüm olduğunu keşfettim: GitHub'da timabell / msaccess-vcs-entegrasyonu . Msaccess-vcs-entegrasyonunu test ettim ve harika çalışıyor.

3 Mart 2015'te güncellendi : Proje başlangıçta Github'da bkidwell tarafından yönetildi / sahiplendi, ancak timabell'e aktarıldı - projeye yukarıdaki bağlantı buna göre güncelleniyor. Orijinal projeden bkidwell tarafından, örneğin ArminBra ve matonb tarafından , AFAICT kullanılmaması gereken bazı çatallar vardır .

Olivers'in ayrıştırma çözümüne kıyasla msaccess-vcs-entegrasyonunu kullanmanın dezavantajı:

  • Oldukça yavaş. Hız sorununun giderilebileceğinden eminim, ancak projemi sık sık bu metne aktarmam gerekmiyor ...
  • Dışa aktarılan şeyler kaldırılmış bir saplama Access projesi oluşturmaz. Bu da düzeltilebilir (kod çözme kodundan kod alınarak), ama yine de önemli değil.

Her neyse, açık tavsiyem msaccess-vcs-integrasyon. Dışa aktarılan dosyalarda Git'i kullanırken yaşadığım tüm sorunları çözdü.


Görünüşe göre ArminBra çatalı şimdi önde ( ağ grafiğine baktığından anlaşılıyor ). Matonb tek çekme talebine cevap vermedi, bu yüzden en azından şimdilik terk ettiler.
Tim Abell

1
Ve şimdi benim çatal github.com/timabell/msaccess-vcs-integration - bileşik anahtar tablo ihracat kırılmasını giderir. Diğer iki biraz terk edilmiş bakmak bu yüzden benim çatal onun çekme istekleri hata raporları vb almak için mutluyum.
Tim Abell

Kibarca işaret etmek için bu cevabı düzenlemeyi nazikçe öneririm çünkü şu anda en aktif şekilde korunan versiyon.
Tim Abell

2
@TimAbell: Cevabımı, projenin size aktarıldığını yansıtacak şekilde güncelledim. PS! Umarım bunun en iyi çözüm olduğunu düşündüğüm için biraz oy alabiliriz.
hansfn

2
güzel bir, bir github projesinin çatallarında gezinmek, kendimiz için icat ettiğimiz en son sorun gibi görünüyor :-)
Tim Abell

14

Olivers kayalara cevap CurrentProjectveriyor ama referans benim için işe yaramıyordu. Arvin Meyer'ın benzer bir çözümüne dayanarak, ihracatının ortasındaki bağırsakları söküp yerine bununla değiştirdim . Bir adp yerine mdb kullanıyorsanız Sorguları dışa aktarma avantajına sahiptir.

' 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

1
Sorgu eklemek için +1. Şimdi sadece tablo şemaları eklemeniz gerekiyor.
Marc Stober

Onaylanan yanıt Access 97 için çalışmaz, ancak bu yanıt kendi kullanımım için değiştirmeme yardımcı oldu. Bunu gönderdiğiniz için teşekkür ederiz!
CTristan

2
Ben daha sonra silme sırasını değiştirmek için formları kaydetmeden önce sorgu kaydetme koymak için şiddetle öneririz. Karşılık gelen formları daha önce silindiğinde zaten otomatik olarak silinmiş olan sorguları silmeye çalıştığımda son For Each deyiminde DeleteObject ile bazı sorunlar yaşadım. Ayrıca, başlangıçta bazı formlarınız açılıyorsa ve F11'i tutmak istemiyorsanız (veya devre dışı bırakılmasını istemiyorsanız), çalıştırdıktan sonra ont.DoCmd.Close acForm, "formName" yazmanız yeterlidir. Documents
Anton Kaiser

@Cunso Lütfen Access 97 ile uyumlu olan kodunuzu gönderebilir misiniz? Bu yüzden yeniden geliştirmem gerekmiyor.
Lorenz Meyer

bunu nasıl kullanırım? Altından mı çağırıyorsunuz?
kevinykuo

11

Kendi iç aracımızı geliştirdik, burada:

  1. Modüller: txt dosyaları olarak dışa aktarılır ve daha sonra "dosya karşılaştırma aracı" ile karşılaştırılır (ücretsiz)
  2. Formlar: undocument application.saveAsText komutu ile dışa aktarılır. Daha sonra 2 farklı versiyon arasındaki farkları görmek mümkündür ("dosya karşılaştırma aracı" bir kez daha).
  3. Makrolar: karşılaştırılacak herhangi bir makronuz yok, çünkü yalnızca "autoexec" makrosuna sahip olduğumuz için bir satır ana VBA prosedürünü başlatır
  4. Sorgular: yalnızca bir tabloda depolanan metin dizeleridir: bkz.
  5. tablolar: kayıtlarda ve tablo yapısındaki farklılıkları listeleyerek kendi tablo karşılaştırıcımızı yazdık.

Tüm sistem, txt dosyalarından (modüller ve undocument application.loadFromText komutu ile yeniden oluşturulan formlar ve formlar) ve mdb dosyalarından (tablolar) otomatik olarak oluşturulan Access uygulamamızın "çalışma zamanı" sürümlerini üretmemize izin verecek kadar akıllıdır.

Kulağa garip gelebilir ama işe yarıyor.


8
Bu aracı açık kaynaklı görmek isterdim!
Todd Owen

Bu dışa aktarılan metin dosyalarını GitHub'a yüklemek iyi bir fikir olacak mı?
Santosh

9

Bu yazının fikirlerine ve bazı bloglardaki benzer girişlere dayanarak mdb ve adp dosya formatlarıyla çalışan bir uygulama yazdım. Tüm veritabanı nesnelerini (tablolar, referanslar, ilişkiler ve veritabanı özellikleri dahil) düz metin dosyalarına içe / dışa aktarır. Bu dosyalar ile herhangi bir kaynak sürüm kontrolü ile çalışabilirsiniz. Sonraki sürüm, düz metin dosyalarının veritabanına geri alınmasına izin verecektir. Bir komut satırı aracı da olacak

Uygulamayı veya kaynak kodunu şu adresten indirebilirsiniz: http://accesssvn.codeplex.com/

Saygılarımızla


Bunu neredeyse iki yıldır kullanıyoruz ve harika. Teşekkür ederim!
mcfea

5

Eski bir ipliği diriltmek ama bu iyi bir ip. Kendi proje için iki komut dosyası (compose.vbs / decompose.vbs) uyguladım ve eski .mdb dosyalarıyla bir sorunla karşılaştım:

Kodu içeren bir forma ulaştığında durur:

NoSaveCTIWhenDisabled =1

Access bunun bir sorunu olduğunu söylüyor ve bu hikayenin sonu. Ben bazı testler koştu ve bu soruna geçici bir çözüm bulmak için oynadı ve sonunda bir çalışma ile bu iş parçacığı bulundu:

Veritabanı oluşturulamıyor

Temel olarak (iş parçacığının ölmesi durumunda), .mdb dosyasını alır ve yeni .accdb biçimine bir "Farklı kaydet" yaparsınız. Sonra kaynak güvenli veya oluşturma / ayrıştırma işleri çalışacaktır. Ayrıca (de) beste komut dosyaları doğru çalışması için doğru komut satırı sözdizimi almak için 10 dakika oynamak zorunda kaldım bu yüzden de bu bilgi de:

Oluşturmak için (dosyalarınızın C: \ SControl konumunda olduğunu varsayalım (ayıklanan dosyaları saklamak için Kaynak adlı bir alt klasör oluşturun):

'(to extract for importing to source control)
cscript compose.vbs database.accdb     

'(to rebuild from extracted files saved from an earlier date)
cscript decompose.vbs database.accdb C:\SControl\Source\

Bu kadar!

Yukarıdaki sorunu yaşadığım Access sürümleri Access 2000-2003 ".mdb" veritabanlarını içerir ve oluşturma / ayrıştırma komut dosyalarını çalıştırmadan önce 2007-2010 ".accdb" biçimlerine kaydederek sorunu çözdü. Dönüşümden sonra komut dosyaları gayet iyi çalışıyor!


Bunu, bu sorunla karşılaştığınız Access sürümlerinizi içerecek şekilde düzenleyebilir misiniz?
Nathan DeWitt

Sorun değil, hala erişim geliştirme yapıyorsun Nathan? Eğer öyleyse, sürüm kontrolü ile bütünleştirmede herhangi bir başarı?
JKK

Artık Access geliştirme yapmıyorum. Soruyu sorduğumda bunu kullandığım bir projem vardı ve onunla başka bir şey yapmak zorunda kalmadım.
Nathan DeWitt

Harika, çoğu işletmenin bir tür özel SQL sunucusu kullandığını düşünüyorum. Şu anda bulunduğum durum, MS SQL Server, Oracle ve sunuculardan yerel tablolara veri çeken ve excel'e dışa aktarılan bir grup Access veritabanının bir karışımı var. Oldukça karmaşık bir karışım. Sanırım yeni bir proje kurmak için bazı öneriler hakkında yeni bir soru başlatacağım Yakında olacağım, insanların karmaşıklığı azaltmak için neler önerebileceğini görün
JKK

4

Yalnızca metin dosyası çözümü (sorgular, tablolar ve ilişkiler dahil)

Oliver'ın senaryo çiftini değiştirdim, böylece modüller, sınıflar, formlar ve makrolara ek olarak ilişkileri, tabloları ve sorguları dışa / içe aktarıyorlar. Her şey düz metin dosyalarına kaydedilir, bu nedenle sürüm kontrolünde metin dosyalarıyla depolanacak bir veritabanı dosyası oluşturulmaz.

Metin dosyalarına dışa aktar (decompose.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
Const acQuery = 1
Const acExportTable = 0

' BEGIN CODE
Dim fso, relDoc, ACCDBFilename, sExportpath
Set fso = CreateObject("Scripting.FileSystemObject")
Set relDoc = CreateObject("Microsoft.XMLDOM")

If (Wscript.Arguments.Count = 0) Then
    MsgBox "Please provide the .accdb database file", vbExclamation, "Error"
    Wscript.Quit()
End If
ACCDBFilename = fso.GetAbsolutePathName(Wscript.Arguments(0))

If (Wscript.Arguments.Count = 1) Then
 sExportpath = ""
Else
 sExportpath = Wscript.Arguments(1)
End If


exportModulesTxt ACCDBFilename, sExportpath

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

Function exportModulesTxt(ACCDBFilename, sExportpath)
    Dim myComponent, sModuleType, sTempname, sOutstring
    Dim myType, myName, myPath, hasRelations
    myType = fso.GetExtensionName(ACCDBFilename)
    myName = fso.GetBaseName(ACCDBFilename)
    myPath = fso.GetParentFolderName(ACCDBFilename)

    'if no path was given as argument, use a relative directory
    If (sExportpath = "") Then
        sExportpath = myPath & "\Source"
    End If
    'On Error Resume Next
    fso.DeleteFolder (sExportpath)
    fso.CreateFolder (sExportpath)
    On Error GoTo 0

    Wscript.Echo "starting Access..."
    Dim oApplication
    Set oApplication = CreateObject("Access.Application")
    Wscript.Echo "Opening " & ACCDBFilename & " ..."
    If (Right(ACCDBFilename, 4) = ".adp") Then
     oApplication.OpenAccessProject ACCDBFilename
    Else
     oApplication.OpenCurrentDatabase ACCDBFilename
    End If
    oApplication.Visible = False

    Wscript.Echo "exporting..."
    Dim myObj
    For Each myObj In oApplication.CurrentProject.AllForms
        Wscript.Echo "Exporting FORM " & myObj.FullName
        oApplication.SaveAsText acForm, myObj.FullName, sExportpath & "\" & myObj.FullName & ".form.txt"
        oApplication.DoCmd.Close acForm, myObj.FullName
    Next
    For Each myObj In oApplication.CurrentProject.AllModules
        Wscript.Echo "Exporting MODULE " & myObj.FullName
        oApplication.SaveAsText acModule, myObj.FullName, sExportpath & "\" & myObj.FullName & ".module.txt"
    Next
    For Each myObj In oApplication.CurrentProject.AllMacros
        Wscript.Echo "Exporting MACRO " & myObj.FullName
        oApplication.SaveAsText acMacro, myObj.FullName, sExportpath & "\" & myObj.FullName & ".macro.txt"
    Next
    For Each myObj In oApplication.CurrentProject.AllReports
        Wscript.Echo "Exporting REPORT " & myObj.FullName
        oApplication.SaveAsText acReport, myObj.FullName, sExportpath & "\" & myObj.FullName & ".report.txt"
    Next
    For Each myObj In oApplication.CurrentDb.QueryDefs
        Wscript.Echo "Exporting QUERY " & myObj.Name
        oApplication.SaveAsText acQuery, myObj.Name, sExportpath & "\" & myObj.Name & ".query.txt"
    Next
    For Each myObj In oApplication.CurrentDb.TableDefs
     If Not Left(myObj.Name, 4) = "MSys" Then
      Wscript.Echo "Exporting TABLE " & myObj.Name
      oApplication.ExportXml acExportTable, myObj.Name, , sExportpath & "\" & myObj.Name & ".table.txt"
      'put the file path as a second parameter if you want to export the table data as well, instead of ommiting it and passing it into a third parameter for structure only
     End If
    Next

    hasRelations = False
    relDoc.appendChild relDoc.createElement("Relations")
    For Each myObj In oApplication.CurrentDb.Relations  'loop though all the relations
    If Not Left(myObj.Name, 4) = "MSys" Then
     Dim relName, relAttrib, relTable, relFoTable, fld
     hasRelations = True

     relDoc.ChildNodes(0).appendChild relDoc.createElement("Relation")
     Set relName = relDoc.createElement("Name")
     relName.Text = myObj.Name
     relDoc.ChildNodes(0).LastChild.appendChild relName

     Set relAttrib = relDoc.createElement("Attributes")
     relAttrib.Text = myObj.Attributes
     relDoc.ChildNodes(0).LastChild.appendChild relAttrib

     Set relTable = relDoc.createElement("Table")
     relTable.Text = myObj.Table
     relDoc.ChildNodes(0).LastChild.appendChild relTable

     Set relFoTable = relDoc.createElement("ForeignTable")
     relFoTable.Text = myObj.ForeignTable
     relDoc.ChildNodes(0).LastChild.appendChild relFoTable

     Wscript.Echo "Exporting relation " & myObj.Name & " between tables " & myObj.Table & " -> " & myObj.ForeignTable

     For Each fld In myObj.Fields   'in case the relationship works with more fields
      Dim lf, ff
      relDoc.ChildNodes(0).LastChild.appendChild relDoc.createElement("Field")

      Set lf = relDoc.createElement("Name")
      lf.Text = fld.Name
      relDoc.ChildNodes(0).LastChild.LastChild.appendChild lf

      Set ff = relDoc.createElement("ForeignName")
      ff.Text = fld.ForeignName
      relDoc.ChildNodes(0).LastChild.LastChild.appendChild ff

      Wscript.Echo "  Involving fields " & fld.Name & " -> " & fld.ForeignName
     Next
    End If
    Next
    If hasRelations Then
     relDoc.InsertBefore relDoc.createProcessingInstruction("xml", "version='1.0'"), relDoc.ChildNodes(0)
     relDoc.Save sExportpath & "\relations.rel.txt"
     Wscript.Echo "Relations successfuly saved in file relations.rel.txt"
    End If

    oApplication.CloseCurrentDatabase
    oApplication.Quit

End Function

Bu komut dosyasını arayarak yürütebilirsiniz cscript decompose.vbs <path to file to decompose> <folder to store text files>. İkinci parametreyi atlamanız durumunda, veritabanının bulunduğu 'Kaynak' klasörü oluşturulur. Hedef klasörün zaten varsa silineceğini lütfen unutmayın.

Dışa aktarılan tablolara veri ekle

93 numaralı satırı değiştirin: oApplication.ExportXML acExportTable, myObj.Name, , sExportpath & "\" & myObj.Name & ".table.txt"

çizgi ile oApplication.ExportXML acExportTable, myObj.Name, sExportpath & "\" & myObj.Name & ".table.txt"

Aktarma veritabanı dosyası oluşturma (compose.vbs)

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

' Reads all modules, classes, forms, macros, queries, tables and their relationships in a directory created by "decompose.vbs"
' and composes then into an Access Database file (.accdb).
' Requires Microsoft Access.
Option Explicit

Const acForm = 2
Const acModule = 5
Const acMacro = 4
Const acReport = 3
Const acQuery = 1
Const acStructureOnly = 0   'change 0 to 1 if you want import StructureAndData instead of StructureOnly
Const acCmdCompileAndSaveAllModules = &H7E

Dim fso, relDoc, ACCDBFilename, sPath
Set fso = CreateObject("Scripting.FileSystemObject")
Set relDoc = CreateObject("Microsoft.XMLDOM")

If (Wscript.Arguments.Count = 0) Then
 MsgBox "Please provide the .accdb database file", vbExclamation, "Error"
 Wscript.Quit()
End If

ACCDBFilename = fso.GetAbsolutePathName(Wscript.Arguments(0))
If (Wscript.Arguments.Count = 1) Then
 sPath = ""
Else
 sPath = Wscript.Arguments(1)
End If


importModulesTxt ACCDBFilename, sPath

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


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

    ' Build file and pathnames
    Dim myType, myName, myPath
    myType = fso.GetExtensionName(ACCDBFilename)
    myName = fso.GetBaseName(ACCDBFilename)
    myPath = fso.GetParentFolderName(ACCDBFilename)

    ' if no path was given as argument, use a relative directory
    If (sImportpath = "") Then
        sImportpath = myPath & "\Source\"
    End If

    ' check for existing file and ask to overwrite with the stub
    If fso.FileExists(ACCDBFilename) Then
     Wscript.StdOut.Write ACCDBFilename & " already exists. Overwrite? (y/n) "
     Dim sInput
     sInput = Wscript.StdIn.Read(1)
     If (sInput <> "y") Then
      Wscript.Quit
     Else
      If fso.FileExists(ACCDBFilename & ".bak") Then
       fso.DeleteFile (ACCDBFilename & ".bak")
      End If
      fso.MoveFile ACCDBFilename, ACCDBFilename & ".bak"
     End If
    End If

    Wscript.Echo "starting Access..."
    Dim oApplication
    Set oApplication = CreateObject("Access.Application")
    Wscript.Echo "Opening " & ACCDBFilename
    If (Right(ACCDBFilename, 4) = ".adp") Then
        oApplication.CreateAccessProject ACCDBFilename
    Else
        oApplication.NewCurrentDatabase ACCDBFilename
    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
     objectname = fso.GetBaseName(myFile.Name)  'get rid of .txt extension
     objecttype = fso.GetExtensionName(objectname)
     objectname = fso.GetBaseName(objectname)

     Select Case objecttype
      Case "form"
       Wscript.Echo "Importing FORM from file " & myFile.Name
       oApplication.LoadFromText acForm, objectname, myFile.Path
      Case "module"
       Wscript.Echo "Importing MODULE from file " & myFile.Name
       oApplication.LoadFromText acModule, objectname, myFile.Path
      Case "macro"
       Wscript.Echo "Importing MACRO from file " & myFile.Name
       oApplication.LoadFromText acMacro, objectname, myFile.Path
      Case "report"
       Wscript.Echo "Importing REPORT from file " & myFile.Name
       oApplication.LoadFromText acReport, objectname, myFile.Path
      Case "query"
       Wscript.Echo "Importing QUERY from file " & myFile.Name
       oApplication.LoadFromText acQuery, objectname, myFile.Path
      Case "table"
       Wscript.Echo "Importing TABLE from file " & myFile.Name
       oApplication.ImportXml myFile.Path, acStructureOnly
      Case "rel"
       Wscript.Echo "Found RELATIONSHIPS file " & myFile.Name & " ... opening, it will be processed after everything else has been imported"
       relDoc.Load (myFile.Path)
     End Select
    Next

    If relDoc.readyState Then
     Wscript.Echo "Preparing to build table dependencies..."
     Dim xmlRel, xmlField, accessRel, relTable, relName, relFTable, relAttr, i
     For Each xmlRel In relDoc.SelectNodes("/Relations/Relation")   'loop through every Relation node inside .xml file
      relName = xmlRel.SelectSingleNode("Name").Text
      relTable = xmlRel.SelectSingleNode("Table").Text
      relFTable = xmlRel.SelectSingleNode("ForeignTable").Text
      relAttr = xmlRel.SelectSingleNode("Attributes").Text

      'remove any possible conflicting relations or indexes
      On Error Resume Next
      oApplication.CurrentDb.Relations.Delete (relName)
      oApplication.CurrentDb.TableDefs(relTable).Indexes.Delete (relName)
      oApplication.CurrentDb.TableDefs(relFTable).Indexes.Delete (relName)
      On Error GoTo 0

      Wscript.Echo "Creating relation " & relName & " between tables " & relTable & " -> " & relFTable
      Set accessRel = oApplication.CurrentDb.CreateRelation(relName, relTable, relFTable, relAttr)  'create the relationship object

      For Each xmlField In xmlRel.SelectNodes("Field")  'in case the relationship works with more fields
       accessRel.Fields.Append accessRel.CreateField(xmlField.SelectSingleNode("Name").Text)
       accessRel.Fields(xmlField.SelectSingleNode("Name").Text).ForeignName = xmlField.SelectSingleNode("ForeignName").Text
       Wscript.Echo "  Involving fields " & xmlField.SelectSingleNode("Name").Text & " -> " & xmlField.SelectSingleNode("ForeignName").Text
      Next

      oApplication.CurrentDb.Relations.Append accessRel 'append the newly created relationship to the database
      Wscript.Echo "  Relationship added"
     Next
    End If

    oApplication.RunCommand acCmdCompileAndSaveAllModules
    oApplication.Quit
End Function

Bu komut dosyasını arayarak yürütebilirsiniz cscript compose.vbs <path to file which should be created> <folder with text files> . İkinci parametreyi atlamanız durumunda, veritabanının oluşturulması gereken 'Kaynak' klasörüne bakacaktır.

Metin dosyasından veri içe aktarma

14. satırı değiştirin: const acStructureOnly = 0 ileconst acStructureOnly = 1 . Bu yalnızca verileri dışa aktarılan tabloya eklediyseniz çalışır.

Kapsanmayan şeyler

  1. Bunu sadece .accdb dosyalarıyla test ettim, bu yüzden başka bir şeyle bazı hatalar olabilir.
  2. Ayar dışa aktarılmaz, ayarı veritabanının başlangıcında uygulayacak Makroyu oluşturmanızı öneririm.
  3. Bazı bilinmeyen sorgular bazen '~' ile dışa aktarılır. Gerekli olup olmadıklarını bilmiyorum.
  4. MSAccess nesne adları dosya adları için geçersiz karakterler içerebilir - komut dosyası yazmaya çalışırken başarısız olur. Sen olabilecek tüm dosya adlarını normalleştirmek , ama sonra bunları geri alamıyor.

Bu senaryo üzerinde çalışırken diğer kaynaklarımdan biri, ilişkilerin nasıl dışa aktarılacağını anlamama yardımcı olan bu cevaptı .


Bu işe yarıyor gibi görünüyor, ama bağlantılı tabloları anlamıyor
Lord Darth Vader

2

Bir gotcha var - VSS 6.0, MDB'leri yalnızca tüm yerel tabloları, sorguları, modülleri ve formları içeren belirli sayıda nesnenin altında eklentiyi kullanarak kabul edebilir. Kesin nesne sınırını bilmiyorum.

Büyük olan 10 yaşındaki eşya taban uygulamamızı oluşturmak için, SS'den 3 veya 4 ayrı MDB'yi tek bir MDB'de birleştirmeye zorlanıyoruz, bu da otomatik yapıları, zamanımızı boşa harcamadığımız noktaya zorlaştırıyor.

Bence bu MDb'yi SVN'ye dönüştürmek ve herkes için yapıları basitleştirmek için yukarıdaki komut dosyasını deneyeceğim.


2

Access 2010 kullananlar için SaveAsText, Intellisense'de görünür bir yöntem değildir, ancak Arvin Meyer'ın daha önce bahsettiği gibi geçerli bir yöntem gibi görünmektedir benim için iyi çalıştığı için .

İlginçtir, SaveAsAXL 2010 için yenidir ve SaveAsText ile aynı imzalıdır, ancak göründüğü gibi sadece SharePoint Server 2010 gerektiren web veritabanlarıyla çalışacaktır.


Nesne Tarayıcısında Gizli Üyeleri Göster seçeneği açık değilse SaveAsText, A2003'te de görünmez. SaveAsAXL hakkında iyi bilgiler.
David-W-Fenton

2

Aynı sorunu bir süre önce de yaşadık.

İlk denememiz, MS Access ve VB 6 ile kullanılacak Subversion için SourceSafe API'sinin bir proxy'sini sunan bir üçüncü taraf aracıydı. Araç burada bulunabilir .

Bu araçtan memnun olmadığımız için Visual SourceSafe ve VSS Acces Eklentisine geçtik.


2

Oasis-Svn kullanıyorum http://dev2dev.de/

Beni en az bir kez kurtardığını söyleyebilirim. Benim mdb 2 GB ötesinde büyüyordu ve bu kırdı. Eski bir sürüme geri dönüp Formları içe aktarabilirdim ve bir gün kadar çalışmamı kaybettim.


1

Bu aracı SourceForge'da buldum: http://sourceforge.net/projects/avc/

Kullanmadım, ama bu sizin için bir başlangıç ​​olabilir. İhtiyacınız olanı yapan VSS veya SVN ile entegre olan bazı üçüncü taraf araçları olabilir.

Şahsen ben sadece bir değişiklik günlüğü tutmak için düz bir metin dosyası tutmak. İkili MDB yürüttüğümde, değişiklik günlüğündeki girdileri yürütme yorumum olarak kullanıyorum.


Gerçekten indirmek bir bağlantı var mı? Kör müyüm? Onu bulamıyorum.
BIBD


1

Tamamlamak için...

Her zaman "Microsoft Office Sistemi için Visual Studio [YEAR] Araçları" vardır ( http://msdn.microsoft.com/en-us/vs2005/aa718673.aspx ) ancak VSS gerektiriyor gibi görünüyor. Bana göre VSS (otomatik bozulma) uber yedeklenmiş ağ paylaşımımdaki 347 kaydetme noktamdan daha kötü.


1

i kullanıyorum Kaynak Kod Kontrolü: Erişim 2003 Eklentisi . İyi çalışıyor. Bir Sorun ":" gibi geçersiz karakterlerdir.

Giriş ve çıkış yapıyorum. Internly eklentisi, yukarıdaki kodla aynı şeyi yapar, ancak daha fazla araç desteği ile. Bir nesnenin kullanıma alınmış olup olmadığını görebilir ve nesneleri yenileyebilirim.



1

Oliver'ın cevabı harika çalışıyor. Lütfen Access sorguları için destek ekleyen genişletilmiş sürümümü aşağıda bulabilirsiniz.

( daha fazla bilgi / kullanım için lütfen Oliver'ın cevabına bakınız )

decompose.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
const acQuery = 1

' 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
    For Each myObj In oApplication.CurrentDb.QueryDefs
        if not left(myObj.name,3) = "~sq" then 'exclude queries defined by the forms. Already included in the form itself
            WScript.Echo "  " & myObj.name
            oApplication.SaveAsText acQuery, myObj.name, sExportpath & "\" & myObj.name & ".query"
            oApplication.DoCmd.Close acQuery, myObj.name
            dctDelete.Add "FO" & myObj.name, acQuery
        end if
    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

compose.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 acQuery = 1

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
        elseif (objecttype = "query") then
           oApplication.LoadFromText acQuery, 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

0

Erişim veritabanındaki Sorgular için bir dışa aktarma seçeneği ekleyerek cevabına katkıda bulunmaya yardımcı olmaya çalıştım. ( Diğer SO cevaplarından bol yardım alarak )

Dim def
Set stream = fso.CreateTextFile(sExportpath & "\" & myName & ".queries.txt")
  For Each def In oApplication.CurrentDb.QueryDefs

    WScript.Echo "  Exporting Queries to Text..."
    stream.WriteLine("Name: " & def.Name)
    stream.WriteLine(def.SQL)
    stream.writeline "--------------------------"
    stream.writeline " "

  Next
stream.Close

Bunu 'oluştur' özelliğine geri döndüremedik, ancak şu anda yapmam gereken şey bu değil.

Not: decompose.vbs dosyasında dışa aktarılan dosya adlarının her birine ".txt" ekledim, böylece kaynak denetimi hemen dosya diffs'lerini bana gösterecekti.

Umarım yardımcı olur!



0

Bu girdi, diğer girdilerden tamamen farklı bir yaklaşımı tanımlar ve aradığınız şey olmayabilir. Eğer bunu görmezden gelirsen kırılmayacağım. Ama en azından düşünce için yiyecek.

Bazı profesyonel ticari yazılım geliştirme ortamlarında, yazılım teslimatların konfigürasyon yönetimi (CM) normalde yapılmaz içinde yazılım uygulaması kendisi veya yazılım projesinde kendisi. CM, yazılımın hem dosyanın hem de klasörün sürüm tanımlama ile işaretlendiği özel bir CM klasörüne kaydedilmesiyle nihai teslim edilebilir ürünlere uygulanır. Örneğin, Clearcase veri yöneticisinin bir yazılım dosyasını "teslim etmesine", bir "şube" atamasına, bir "kabarcık" atamasına ve "etiketler" uygulamasına izin verir. Bir dosyayı görmek ve indirmek istediğinizde, "config spec" inizi istediğiniz sürüme işaret edecek şekilde yapılandırmanız ve ardından klasöre cd eklemeniz gerekir.

Sadece bir fikir.


0

Access 97 ile sıkışmış olan herkes, diğer cevapları işe alamadım. Oliver ve DaveParillo'nun mükemmel cevaplarının bir kombinasyonunu kullanarak ve bazı değişiklikler yaparak, scriptlerin Access 97 veritabanlarımızla çalışmasını sağlayabildim. Ayrıca, dosyaları hangi klasöre yerleştireceğini soracağı için biraz daha kullanıcı dostudur.

AccessExport.vbs:

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

Const acQuery = 1
Const acForm = 2
Const acModule = 5
Const acMacro = 4
Const acReport = 3
Const acCmdCompactDatabase = 4
Const TemporaryFolder = 2

Dim strMDBFileName : strMDBFileName = SelectDatabaseFile
Dim strExportPath : strExportPath = SelectExportFolder
CreateExportFolders(strExportPath)
Dim objProgressWindow
Dim strOverallProgress
CreateProgressWindow objProgressWindow
Dim strTempMDBFileName
CopyToTempDatabase strMDBFileName, strTempMDBFileName, strOverallProgress
Dim objAccess
Dim objDatabase
OpenAccessDatabase objAccess, objDatabase, strTempMDBFileName, strOverallProgress
ExportQueries objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress
ExportForms objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress
ExportReports objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress
ExportMacros objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress
ExportModules objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress
objAccess.CloseCurrentDatabase
objAccess.Quit
DeleteTempDatabase strTempMDBFileName, strOverallProgress
objProgressWindow.Quit
MsgBox "Successfully exported database."

Private Function SelectDatabaseFile()
    MsgBox "Please select the Access database to export."
    Dim objFileOpen : Set objFileOpen = CreateObject("SAFRCFileDlg.FileOpen")
    If objFileOpen.OpenFileOpenDlg Then
        SelectDatabaseFile = objFileOpen.FileName
    Else
        WScript.Quit()
    End If
End Function

Private Function SelectExportFolder()
    Dim objShell : Set objShell = CreateObject("Shell.Application")
    SelectExportFolder = objShell.BrowseForFolder(0, "Select folder to export the database to:", 0, "").self.path & "\"
End Function

Private Sub CreateExportFolders(strExportPath)
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    MsgBox "Existing folders from a previous Access export under " & strExportPath & " will be deleted!"
    If objFileSystem.FolderExists(strExportPath & "Queries\") Then
        objFileSystem.DeleteFolder strExportPath & "Queries", true
    End If
    objFileSystem.CreateFolder(strExportPath & "Queries\")
    If objFileSystem.FolderExists(strExportPath & "Forms\") Then
        objFileSystem.DeleteFolder strExportPath & "Forms", true
    End If
    objFileSystem.CreateFolder(strExportPath & "Forms\")
    If objFileSystem.FolderExists(strExportPath & "Reports\") Then
        objFileSystem.DeleteFolder strExportPath & "Reports", true
    End If
    objFileSystem.CreateFolder(strExportPath & "Reports\")
    If objFileSystem.FolderExists(strExportPath & "Macros\") Then
        objFileSystem.DeleteFolder strExportPath & "Macros", true
    End If
    objFileSystem.CreateFolder(strExportPath & "Macros\")
    If objFileSystem.FolderExists(strExportPath & "Modules\") Then
        objFileSystem.DeleteFolder strExportPath & "Modules", true
    End If
    objFileSystem.CreateFolder(strExportPath & "Modules\")
End Sub

Private Sub CreateProgressWindow(objProgressWindow)
    Set objProgressWindow = CreateObject ("InternetExplorer.Application")
    objProgressWindow.Navigate "about:blank"
    objProgressWindow.ToolBar = 0
    objProgressWindow.StatusBar = 0
    objProgressWindow.Width = 320
    objProgressWindow.Height = 240
    objProgressWindow.Visible = 1
    objProgressWindow.Document.Title = "Access export in progress"
End Sub

Private Sub CopyToTempDatabase(strMDBFileName, strTempMDBFileName, strOverallProgress)
    strOverallProgress = strOverallProgress & "Copying to temporary database...<br/>"
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    strTempMDBFileName = objFileSystem.GetSpecialFolder(TemporaryFolder) & "\" & objFileSystem.GetBaseName(strMDBFileName) & "_temp.mdb"
    objFileSystem.CopyFile strMDBFileName, strTempMDBFileName
End Sub

Private Sub OpenAccessDatabase(objAccess, objDatabase, strTempMDBFileName, strOverallProgress)
    strOverallProgress = strOverallProgress & "Compacting temporary database...<br/>"
    Set objAccess = CreateObject("Access.Application")
    objAccess.Visible = false
    CompactAccessDatabase objAccess, strTempMDBFileName
    strOverallProgress = strOverallProgress & "Opening temporary database...<br/>"
    objAccess.OpenCurrentDatabase strTempMDBFileName
    Set objDatabase = objAccess.CurrentDb
End Sub

' Sometimes the Compact Database command errors out, and it's not serious if the database isn't compacted first.
Private Sub CompactAccessDatabase(objAccess, strTempMDBFileName)
    On Error Resume Next
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    objAccess.DbEngine.CompactDatabase strTempMDBFileName, strTempMDBFileName & "_"
    objFileSystem.CopyFile strTempMDBFileName & "_", strTempMDBFileName
    objFileSystem.DeleteFile strTempMDBFileName & "_"
End Sub

Private Sub ExportQueries(objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress)
    strOverallProgress = strOverallProgress & "Exporting Queries (Step 1 of 5)...<br/>"
    Dim counter
    For counter = 0 To objDatabase.QueryDefs.Count - 1
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter + 1 & " of " & objDatabase.QueryDefs.Count
        objAccess.SaveAsText acQuery, objDatabase.QueryDefs(counter).Name, strExportPath & "Queries\" & Clean(objDatabase.QueryDefs(counter).Name) & ".sql"
    Next
End Sub

Private Sub ExportForms(objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress)
    strOverallProgress = strOverallProgress & "Exporting Forms (Step 2 of 5)...<br/>"
    Dim counter : counter = 1
    Dim objContainer : Set objContainer = objDatabase.Containers("Forms")
    Dim objDocument
    For Each objDocument In objContainer.Documents
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter & " of " & objContainer.Documents.Count
        counter = counter + 1
        objAccess.SaveAsText acForm, objDocument.Name, strExportPath & "Forms\" & Clean(objDocument.Name) & ".form"
        objAccess.DoCmd.Close acForm, objDocument.Name
    Next
End Sub

Private Sub ExportReports(objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress)
    strOverallProgress = strOverallProgress & "Exporting Reports (Step 3 of 5)...<br/>"
    Dim counter : counter = 1
    Dim objContainer : Set objContainer = objDatabase.Containers("Reports")
    Dim objDocument
    For Each objDocument In objContainer.Documents
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter & " of " & objContainer.Documents.Count
        counter = counter + 1
        objAccess.SaveAsText acReport, objDocument.Name, strExportPath & "Reports\" & Clean(objDocument.Name) & ".report"
    Next
End Sub

Private Sub ExportMacros(objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress)
    strOverallProgress = strOverallProgress & "Exporting Macros (Step 4 of 5)...<br/>"
    Dim counter : counter = 1
    Dim objContainer : Set objContainer = objDatabase.Containers("Scripts")
    Dim objDocument
    For Each objDocument In objContainer.Documents
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter & " of " & objContainer.Documents.Count
        counter = counter + 1
        objAccess.SaveAsText acMacro, objDocument.Name, strExportPath & "Macros\" & Clean(objDocument.Name) & ".macro"
    Next
End Sub

Private Sub ExportModules(objAccess, objDatabase, objProgressWindow, strExportPath, strOverallProgress)
    strOverallProgress = strOverallProgress & "Exporting Modules (Step 5 of 5)...<br/>"
    Dim counter : counter = 1
    Dim objContainer : Set objContainer = objDatabase.Containers("Modules")
    Dim objDocument
    For Each objDocument In objContainer.Documents
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter & " of " & objContainer.Documents.Count
        counter = counter + 1
        objAccess.SaveAsText acModule, objDocument.Name, strExportPath & "Modules\" & Clean(objDocument.Name) & ".module"
    Next
End Sub

Private Sub DeleteTempDatabase(strTempMDBFileName, strOverallProgress)
    On Error Resume Next
    strOverallProgress = strOverallProgress & "Deleting temporary database...<br/>"
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    objFileSystem.DeleteFile strTempMDBFileName, true
End Sub

' Windows doesn't like certain characters, so we have to filter those out of the name when exporting
Private Function Clean(strInput)
    Dim objRegexp : Set objRegexp = New RegExp
    objRegexp.IgnoreCase = True
    objRegexp.Global = True
    objRegexp.Pattern = "[\\/:*?""<>|]"
    Dim strOutput
    If objRegexp.Test(strInput) Then
        strOutput = objRegexp.Replace(strInput, "")
        MsgBox strInput & " is being exported as " & strOutput
    Else
        strOutput = strInput
    End If
    Clean = strOutput
End Function

Ve dosyaları veritabanına almak için, veritabanını sıfırdan yeniden oluşturmanız veya bir nedenden ötürü Access dışındaki dosyaları değiştirmek isterseniz.

AccessImport.vbs:

' Imports all of the queries, forms, reports, macros, and modules from text
' files to an Access file (.mdb).  Requires Microsoft Access.
Option Explicit

const acQuery = 1
const acForm = 2
const acModule = 5
const acMacro = 4
const acReport = 3
const acCmdCompileAndSaveAllModules = &H7E

Dim strMDBFilename : strMDBFilename = SelectDatabaseFile
CreateBackup strMDBFilename
Dim strImportPath : strImportPath = SelectImportFolder
Dim objAccess
Dim objDatabase
OpenAccessDatabase objAccess, objDatabase, strMDBFilename
Dim objProgressWindow
Dim strOverallProgress
CreateProgressWindow objProgressWindow
ImportQueries objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress
ImportForms objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress
ImportReports objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress
ImportMacros objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress
ImportModules objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress
objAccess.CloseCurrentDatabase
objAccess.Quit
objProgressWindow.Quit
MsgBox "Successfully imported objects into the database."

Private Function SelectDatabaseFile()
    MsgBox "Please select the Access database to import the objects from.  ALL EXISTING OBJECTS WITH THE SAME NAME WILL BE OVERWRITTEN!"
    Dim objFileOpen : Set objFileOpen = CreateObject( "SAFRCFileDlg.FileOpen" )
    If objFileOpen.OpenFileOpenDlg Then
        SelectDatabaseFile = objFileOpen.FileName
    Else
        WScript.Quit()
    End If
End Function

Private Function SelectImportFolder()
    Dim objShell : Set objShell = WScript.CreateObject("Shell.Application")
    SelectImportFolder = objShell.BrowseForFolder(0, "Select folder to import the database objects from:", 0, "").self.path & "\"
End Function

Private Sub CreateBackup(strMDBFilename)
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    objFileSystem.CopyFile strMDBFilename, strMDBFilename & ".bak"
End Sub

Private Sub OpenAccessDatabase(objAccess, objDatabase, strMDBFileName)
    Set objAccess = CreateObject("Access.Application")
    objAccess.OpenCurrentDatabase strMDBFilename
    objAccess.Visible = false
    Set objDatabase = objAccess.CurrentDb
End Sub

Private Sub CreateProgressWindow(ByRef objProgressWindow)
    Set objProgressWindow = CreateObject ("InternetExplorer.Application")
    objProgressWindow.Navigate "about:blank"
    objProgressWindow.ToolBar = 0
    objProgressWindow.StatusBar = 0
    objProgressWindow.Width = 320
    objProgressWindow.Height = 240
    objProgressWindow.Visible = 1
    objProgressWindow.Document.Title = "Access import in progress"
End Sub

Private Sub ImportQueries(objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress)
    strOverallProgress = "Importing Queries (Step 1 of 5)...<br/>"
    Dim counter : counter = 0
    Dim folder : Set folder = objFileSystem.GetFolder(strImportPath & "Queries\")
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    Dim file
    Dim strQueryName
    For Each file in folder.Files
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter + 1 & " of " & folder.Files.Count
        strQueryName = objFileSystem.GetBaseName(file.Name)
        objAccess.LoadFromText acQuery, strQueryName, file.Path
        counter = counter + 1
    Next
End Sub

Private Sub ImportForms(objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress)
    strOverallProgress = strOverallProgress & "Importing Forms (Step 2 of 5)...<br/>"
    Dim counter : counter = 0
    Dim folder : Set folder = objFileSystem.GetFolder(strImportPath & "Forms\")
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    Dim file
    Dim strFormName
    For Each file in folder.Files
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter + 1 & " of " & folder.Files.Count
        strFormName = objFileSystem.GetBaseName(file.Name)
        objAccess.LoadFromText acForm, strFormName, file.Path
        counter = counter + 1
    Next
End Sub

Private Sub ImportReports(objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress)
    strOverallProgress = strOverallProgress & "Importing Reports (Step 3 of 5)...<br/>"
    Dim counter : counter = 0
    Dim folder : Set folder = objFileSystem.GetFolder(strImportPath & "Reports\")
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    Dim file
    Dim strReportName
    For Each file in folder.Files
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter + 1 & " of " & folder.Files.Count
        strReportName = objFileSystem.GetBaseName(file.Name)
        objAccess.LoadFromText acReport, strReportName, file.Path
        counter = counter + 1
    Next
End Sub

Private Sub ImportMacros(objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress)
    strOverallProgress = strOverallProgress & "Importing Macros (Step 4 of 5)...<br/>"
    Dim counter : counter = 0
    Dim folder : Set folder = objFileSystem.GetFolder(strImportPath & "Macros\")
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    Dim file
    Dim strMacroName
    For Each file in folder.Files
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter + 1 & " of " & folder.Files.Count
        strMacroName = objFileSystem.GetBaseName(file.Name)
        objAccess.LoadFromText acMacro, strMacroName, file.Path
        counter = counter + 1
    Next
End Sub

Private Sub ImportModules(objAccess, objDatabase, objProgressWindow, strImportPath, strOverallProgress)
    strOverallProgress = strOverallProgress & "Importing Modules (Step 5 of 5)...<br/>"
    Dim counter : counter = 0
    Dim folder : Set folder = objFileSystem.GetFolder(strImportPath & "Modules\")
    Dim objFileSystem : Set objFileSystem = CreateObject("Scripting.FileSystemObject")
    Dim file
    Dim strModuleName
    For Each file in folder.Files
        objProgressWindow.Document.Body.InnerHTML = strOverallProgress & counter + 1 & " of " & folder.Files.Count
        strModuleName = objFileSystem.GetBaseName(file.Name)
        objAccess.LoadFromText acModule, strModuleName, file.Path
        counter = counter + 1
    Next

    ' We need to compile the database whenever any module code changes.
    If Not objAccess.IsCompiled Then
        objAccess.RunCommand acCmdCompileAndSaveAllModules
    End If
End Sub
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.