Access 개발에서 버전 관리를 어떻게 사용합니까?


163

Access 솔루션 업데이트와 관련이 있습니다. VBA, 쿼리 수, 테이블 수가 적으며 데이터 입력 및 보고서 생성을위한 몇 가지 양식이 있습니다. Access의 이상적인 후보입니다.

테이블 디자인, VBA, 쿼리 및 폼을 변경하고 싶습니다. 버전 관리로 변경 사항을 추적하려면 어떻게해야합니까? (우리는 Subversion을 사용하지만 맛이 나옵니다.) 나는 전체 mdb를 subversion에 붙일 수 있지만 바이너리 파일을 저장할 것이므로 VBA 코드의 한 줄만 변경했다고 말할 수는 없습니다.

VBA 코드를 별도의 파일로 복사하여 저장하는 방법에 대해 생각했지만 데이터베이스의 내용과 빠르게 동기화되지 않는 사람들을 볼 수있었습니다.


1
이 솔루션 을 Access db 스키마 내보내기 관련 질문에 교차 게시
Eric G

1
Access는 SCC 인터페이스를 지원하므로이 인터페이스와 호환되는 모든 버전 제어가 액세스 할 수 있습니다. 면책 조항 : plasticscm.com에서 일하고 있으며 Access와 함께 사용하는 고객이 여러 명 있습니다.
pablo December

답변:


180

Access에서 문서화되지 않은 Application.SaveAsText ()를 사용하여 모든 코드, 양식, 매크로 및 보고서 모듈을 내보내는 VBScript로 자체 스크립트를 작성했습니다. 여기, 그것은 당신에게 몇 가지 포인터를 제공해야합니다. (주의 : 일부 메시지는 독일어로되어 있지만 쉽게 변경할 수 있습니다.)

편집 : 아래에 다양한 의견을 요약하면 다음과 같습니다. 우리 프로젝트는 .adp 파일을 가정합니다. .mdb / .accdb로이 작업을 수행하려면 OpenAccessProject ()를 OpenCurrentDatabase ()로 변경해야합니다.. ( OpenAccessProject()확장자가 .adp 인 경우 사용하도록 업데이트하고 그렇지 않으면를 사용하십시오 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

명령 행을 사용하는 대신 클릭 가능한 명령이 필요한 경우 "decompose.cmd"라는 파일을 작성하십시오.

cscript decompose.vbs youraccessapplication.adp

기본적으로 내 보낸 모든 파일은 Access 응용 프로그램의 "스크립트"하위 폴더로 이동합니다. .adp / mdb 파일도이 위치 ( "접미사"접미사)에 복사되고 내 보낸 모든 모듈을 제거하여 실제로 작게 만듭니다.

대부분의 액세스 설정 및 사용자 정의 메뉴 표시 줄을 다른 방식으로 내보낼 수 없으므로 소스 파일로이 스텁을 체크인해야합니다. 설정이나 메뉴를 실제로 변경 한 경우에만이 파일에 대한 변경 사항을 커밋하십시오.

참고 : 응용 프로그램에 Autoexec-Makros가 정의되어 있으면 분해를 호출 할 때 Shift 키를 누르고 있어야 내보내기가 실행 및 방해되지 않습니다!

물론 "소스"-디렉토리에서 애플리케이션을 빌드하기위한 리버스 스크립트도 있습니다.

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

다시, 이것은 다음을 포함하는 컴패니언 "compose.cmd"와 함께 제공됩니다.

cscript compose.vbs youraccessapplication.adp

현재 응용 프로그램 덮어 쓰기를 확인하고 먼저 백업을 만듭니다. 그런 다음 Source-Directory에서 모든 소스 파일을 수집하여 스텁에 다시 삽입합니다.

즐기세요!


1
나는이 코드를 좋아한다. oApplication.OpenAccessProject가 .accdb 파일에서 작동하지 않는 것으로 나타났습니다 (또는 아마도 Access 2007 일 수도 있음). 대신 oApplication.OpenCurrentDatabase를 사용해야했습니다.
hughdbrown

1
비슷한 작업을 수행하고 있지만 (SaveAsText, VBA 및 ADP 대신 MDB 파일 사용) 한 가지 큰 문제가 남아 있습니다. 각 내보내기 후 Subversion은 약 100 개의 파일이 변경된 것으로 인식합니다 (하나 또는 두 개만 변경 한 경우에도) ). 변경 사항을 보면 일부 변수 이름이나 컨트롤 이름이 대문자 / 소문자 철자가 변경된 것을 알 수 있습니다. 예를 들어, 한 번 "OrderNumber"가 포함 된 모든 파일은 이제 내보내기에 "Ordernumber"를 포함하므로 "변경됨"으로 표시됩니다 (적어도 SVN은 다른 SCM을 시도하지 않았습니다). 어떻게 피할 수 있습니까? 고마워요!
Christian Specht

3
예, 이것은 우리 프로젝트에서도 지속적인 성가심입니다. 우리가 결정한 한, 문제는 프로젝트의 변수가 다른 경우 (위 / 아래)에 컨트롤과 동일한 이름을 가지고 있다는 것입니다. 이제는 구성되는 모듈의 순서에 따라 VBA는 대 / 소문자를 구분하지 않으므로 Access는 하나의 철자를 사용하고 다른 것은 "수정"하는 것처럼 보입니다. 컨트롤이 다른 형식이지만 액세스가이 작업을 수행합니다. 다른 경우에 다른 형태로 같은 이름을 가진 여러 개의 컨트롤을 가지고 있으면 문제가 커집니다.
Oliver

3
유일한 해결책은 각 Variable / Control-Name을 찾아서 철자를 일반적인 형식으로 변경하는 것입니다. 내보내기 및 변경 사항 커밋 후에는 이름이 안정적이어야합니다. 타입에 컨트롤 이름을 접두사로 붙이면 명명 규칙을 통해 이름이 변수와 충돌하지 않습니다. (예 : 제목 필드를 포함하는 텍스트 상자의 경우 txtTitle 또는 콤보 상자의 경우 cmbUsers 등)
Oliver

mdb 로이 작업을 수행하기 위해 OpenAccessProjectOpenCurrentDatabase 로 변경해야한다는 것을 추가하지 않았습니다 .
DaveParillo 2009

19

Access에서 상당히 유용한 것으로 보입니다.

msdn 의이 링크 는 Microsoft Access 용 소스 제어 추가 기능을 설치하는 방법을 설명합니다. 이것은 Access 2007 용 Access Developer Extensions의 일부로 그리고 Access 2003 용으로 별도의 무료 추가 기능으로 무료 다운로드로 제공됩니다.

이 질문을하게되어 기쁩니다.이 기능을 원하기 때문에 시간을 내서 살펴 보았습니다. 위의 링크에는 이에 대한 자세한 정보가 있으며 추가 기능에 대한 링크가 있습니다.

업데이트 :
Access 2003 용 추가 기능을 설치했습니다. VSS에서만 작동하지만 Access 개체 (양식, 쿼리, 테이블, 모듈 등)를 리포지토리에 넣을 수 있습니다. 저장소에서 항목을 편집하면 체크 아웃하라는 메시지가 표시되지만 반드시 그럴 필요는 없습니다. 다음으로 애드 인이없는 시스템에서 어떻게 열고 열고 처리하는지 확인하겠습니다. 나는 VSS의 팬은 아니지만 액세스 객체를 저장소에 저장하는 것을 좋아합니다.

업데이트 2 :
추가 기능이없는 컴퓨터는 데이터베이스 구조 (테이블 필드 추가, 쿼리 매개 변수 등)를 변경할 수 없습니다. 처음에는 Access에 추가 기능이없는 경우 소스 제어에서 Access 데이터베이스를 제거 할 수있는 방법이 없었기 때문에 누군가 필요할 경우 이것이 문제가 될 수 있다고 생각했습니다.

"소형 및 복구"데이터베이스를 실행하면 소스 제어에서 데이터베이스를 제거 할 것인지 묻는 메시지가 표시됩니다. 예를 선택하고 추가 기능없이 데이터베이스를 편집 할 수있었습니다. 위 의 링크 에있는 기사는 Team System을 사용하도록 Access 2003 및 2007을 설정하는 지침도 제공합니다. SVN에 대한 MSSCCI 공급자를 찾을 수 있으면 해당 기능을 사용할 수 있습니다.


한 명 이상의 사용자가 편집 한 경우 VSS에서 ADP를 체크 아웃 할 수없는 데는 몇 가지 문제가있었습니다. 이를 위해 별도의 백업이 필요했습니다!
Simon

SVN에 대한 무료 MSSCCI 공급자가 없기 때문에 Vault를 사용 하여이 접근법을 사용했습니다. 작동하지만 소스 제어에 구식 독점 잠금 방식을 사용하도록 강요하므로 포기하고 @Oliver의 솔루션을 사용할 계획입니다.
Todd Owen

14

Oliver가 게시 한 작성 / 분해 솔루션은 훌륭하지만 몇 가지 문제가 있습니다.

  • 파일은 UCS-2 (UTF-16)로 인코딩되어 버전 제어 시스템 / 도구에서 파일을 이진 파일로 간주 할 수 있습니다.
  • 파일에는 체크섬, 프린터 정보 등 자주 바뀌는 많은 부스러기가 있습니다. 깨끗한 diff를 원하거나 프로젝트에 협력해야하는 경우 심각한 문제입니다.

나는 이것을 직접 고치려고했지만 GitHub의 timabell / msaccess-vcs-integration 이라는 좋은 솔루션이 이미 있음을 발견했습니다 . msaccess-vcs-integration을 테스트했으며 훌륭하게 작동합니다.

2015 년 3 월 3 일 업데이트 : 프로젝트는 원래 Github의 bkidwell이 유지 관리 / 소유했지만 timabell 으로 전송 되었습니다. 위 링크는 프로젝트에 따라 업데이트됩니다. 예를 들어 bkidwell에 의해 원래의 프로젝트에서 일부 포크,있다 ArminBra로 하고 matonb에 의해 AFAICT는 사용할 수 없습니다.

Olivers의 분해 솔루션과 비교하여 msaccess-vcs-integration 사용의 단점 :

  • 상당히 느립니다. 속도 문제를 해결할 수 있다고 확신하지만 프로젝트를 텍스트로 내보낼 필요는 없습니다 ...
  • 내 보낸 항목이 제거 된 스텁 액세스 프로젝트를 작성하지 않습니다. 이것은 (분해 스크립트의 코드를 채택하여) 고칠 수도 있지만 다시는 중요하지 않습니다.

어쨌든, 명확한 권장 사항은 msaccess-vcs-integration입니다. 내 보낸 파일에서 Git을 사용할 때의 모든 문제를 해결했습니다.


ArminBra 포크 가 앞서 나간 것 같습니다 ( 네트워크 그래프 를 보면 그림 ). Matonb는 유일한 풀 요청에 응답하지 않았 으므로 적어도 지금은 포기한 것 같습니다.
Tim Abell

1
그리고 이제 내 포크 github.com/timabell/msaccess-vcs-integration도 있습니다 -복합 키 테이블 내보내기 손상을 수정하십시오. 다른 두 개는 약간 버려 져서 포크에 대한 버그 보고서 등을 가져 와서 기쁩니다.
팀 아벨

나는 현재 가장 활발하게 유지되는 버전이므로 포크를 가리 키도록이 답변을 편집하는 것이 공손하게 제안 할 것입니다.
Tim Abell

2
@TimAbell : 프로젝트가 귀하에게 전송되었다는 사실을 반영하여 답변을 업데이트했습니다. 추신! 이것이 최선의 해결책이라고 생각하기 때문에 투표를 할 수 있기를 바랍니다.
hansfn

2
좋은 것, github 프로젝트의 포크를 탐색하는 것은 우리 자신을 위해 발명 한 최신 문제 인 것 같습니다 :-)
Tim Abell

14

올리버는 암석에 대답하지만 CurrentProject참조는 저에게 효과적 이지 않았습니다. Arvin Meyer 의 비슷한 솔루션을 기반으로 수출 중에서 용기를 추출하고 이것을 대체했습니다 . adp 대신 mdb를 사용하는 경우 쿼리를 내보내는 이점이 있습니다.

' 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
검색어 포함 +1 이제 테이블 스키마 만 포함하면됩니다.
Marc Stober

승인 된 답변은 Access 97에서 작동하지 않지만이 답변을 통해 본인의 용도에 맞게 수정할 수있었습니다. 이것을 게시 해 주셔서 감사합니다!
CTristan

2
나중에 삭제 순서를 변경하기 위해 양식을 저장하기 전에 쿼리를 저장하는 것이 좋습니다. 해당 양식이 이전에 삭제되었을 때 이미 자동으로 삭제 된 쿼리를 삭제하려고 할 때 마지막 For Each 문에서 DeleteObject에 문제가있었습니다. 또한 시작시 일부 양식이 열려 있고 F11을 유지하지 않으려면 (또는 비활성화하지 않으려면) 실행 후 cnt.Documents
Anton Kaiser

@Cunso Access 97과 호환되는 코드를 게시 할 수 있습니다. 따라서 다시 개발할 필요가 없습니다.
Lorenz Meyer

이것을 어떻게 사용합니까? 서브에서 불러?
kevinykuo

11

우리는 다음과 같은 자체 내부 도구를 개발했습니다.

  1. 모듈 : txt 파일로 내 보낸 다음 "파일 비교 도구"(프리웨어)와 비교
  2. 양식 : undocument application.saveAsText 명령을 통해 내 보냅니다. 그러면 두 가지 버전 ( "파일 비교 도구")의 차이점을 다시 볼 수 있습니다.
  3. 매크로 : 주 VBA 프로 시저를 시작하는 한 줄의 "autoexec"매크로 만 있으므로 비교할 매크로가 없습니다.
  4. 쿼리 : 테이블에 저장된 텍스트 문자열입니다.
  5. 테이블 : 우리는 레코드와 테이블 구조의 차이점을 나열하여 자체 테이블 비교기를 작성했습니다.

전체 시스템은 txt 파일 (모듈 및 undocument application.loadFromText 명령으로 다시 작성되는 양식) 및 mdb 파일 (테이블)에서 자동으로 생성되는 Access 응용 프로그램의 "런타임"버전을 생성 할 수있을 정도로 똑똑합니다.

이상하게 들릴지 모르지만 작동합니다.


8
이 도구를 공개 소스로 사용하고 싶습니다!
Todd Owen

내 보낸 텍스트 파일을 GitHub에 업로드하는 것이 좋습니다?
Santosh

9

이 게시물의 아이디어와 일부 블로그의 유사한 항목을 기반으로 mdb 및 adp 파일 형식으로 작동하는 응용 프로그램을 작성했습니다. 모든 데이터베이스 개체 (테이블, 참조, 관계 및 데이터베이스 속성 포함)를 일반 텍스트 파일로 가져 오거나 내 보냅니다. 이러한 파일을 사용하면 모든 소스 버전 제어로 작업 할 수 있습니다. 다음 버전에서는 일반 텍스트 파일을 데이터베이스로 다시 가져올 수 있습니다. 명령 줄 도구도 있습니다

http://accesssvn.codeplex.com/ 에서 애플리케이션 또는 소스 코드를 다운로드 할 수 있습니다.

문안 인사


우리는 이것을 거의 2 년 동안 사용해 왔으며 훌륭합니다. 감사합니다!
mcfea

5

오래된 실을 부활 시키지만 이것은 좋은 것입니다. 내 프로젝트에 대해 두 개의 스크립트 (compose.vbs / decompose.vbs)를 구현했으며 이전 .mdb 파일에 문제가 발생했습니다.

코드가 포함 된 양식에 도달하면 중단됩니다.

NoSaveCTIWhenDisabled =1

Access는 문제가 있으며 이것이 이야기의 끝이라고 말합니다. 나는 몇 가지 테스트를 실행 하고이 문제를 해결하려고 노력했으며 끝에이 문제를 해결 한이 스레드를 발견했습니다.

데이터베이스를 만들 수 없습니다

기본적으로 (스레드가 중단 된 경우) .mdb를 사용하여 새 .accdb 형식으로 "다른 이름으로 저장"을 수행합니다. 그러면 소스 안전 또는 작성 / 분해 항목이 작동합니다. 또한 (de) 구성 스크립트가 올바르게 작동하도록 올바른 명령 줄 구문을 얻으려면 10 분 동안 놀아야했습니다. 그래서 그 정보도 있습니다.

작성하려면 (귀하의 항목이 C : \ SControl에 있습니다 (추출 된 파일을 저장할 Source라는 하위 폴더를 작성하십시오) :

'(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\

그게 다야!

위의 문제가 발생한 Access 버전에는 Access 2000-2003 ".mdb"데이터베이스가 포함되어 있으며 작성 / 분해 스크립트를 실행하기 전에 2007-2010 ".accdb"형식으로 저장하여 문제를 해결했습니다. 변환 후 스크립트는 정상적으로 작동합니다!


이 문제가 발생한 곳에 Access 버전을 포함하도록 편집 할 수 있습니까?
Nathan DeWitt

문제 없습니다, 여전히 액세스 개발을하고 있습니까 Nathan? 그렇다면 버전 관리와의 통합이 성공합니까?
JKK

더 이상 Access 개발을하고 있지 않습니다. 나는 질문을 할 때 이것을 뒤로 사용하는 하나의 프로젝트를 가지고 있었고, 그것으로 다른 것을 할 필요가 없었습니다.
Nathan DeWitt

쿨, 나는 대부분의 비즈니스가 일종의 전용 SQL 서버를 사용한다고 생각합니다. 내가 지금 처한 상황은 MS SQL Server, Oracle 및 서버에서 로컬 테이블로 데이터를 가져 와서 Excel로 내보내는 Access 데이터베이스가 혼합되어 있습니다. 꽤 복잡한 혼합물입니다. 새로운 프로젝트를 준비하기위한 몇 가지 제안에 대해 새로운 질문을 시작할 것이라고 생각합니다. 사람들이 복잡성을 줄이기 위해 제안 할 수있는 것을보십시오
JKK

4

텍스트 파일 전용 솔루션 (쿼리, 테이블 및 관계 포함)

모듈, 클래스, 폼 및 매크로 외에도 관계, 테이블 및 쿼리 를 내보내거나 가져 오기 위해 Oliver의 스크립트 쌍을 변경했습니다 . 모든 것이 일반 텍스트 파일 로 저장되므로 버전 제어에서 텍스트 파일과 함께 저장되도록 작성된 데이터베이스 파일없습니다 .

텍스트 파일로 내보내기 (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

를 호출하여이 스크립트를 실행할 수 있습니다 cscript decompose.vbs <path to file to decompose> <folder to store text files>. 두 번째 매개 변수를 생략하면 데이터베이스가있는 'Source'폴더가 만들어집니다. 대상 폴더가 이미 있으면 지워집니다.

내 보낸 테이블에 데이터 포함

줄 93을 대체하십시오 : oApplication.ExportXML acExportTable, myObj.Name, , sExportpath & "\" & myObj.Name & ".table.txt"

선으로 oApplication.ExportXML acExportTable, myObj.Name, sExportpath & "\" & myObj.Name & ".table.txt"

데이터베이스 파일 작성 (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

을 호출하여이 스크립트를 실행할 수 있습니다 cscript compose.vbs <path to file which should be created> <folder with text files>. 두 번째 매개 변수를 생략하면 데이터베이스를 만들어야하는 'Source'폴더를 찾습니다.

텍스트 파일에서 데이터 가져 오기

라인 (14)을 교체 : const acStructureOnly = 0const acStructureOnly = 1. 내 보낸 테이블에 데이터를 포함시킨 경우에만 작동합니다.

다루지 않은 것들

  1. 나는 이것을 .accdb 파일로만 테스트 했으므로 다른 것이 있으면 버그가있을 수 있습니다.
  2. 설정을 내 보내지 않으므로 데이터베이스를 시작할 때 설정을 적용 할 매크로를 만드는 것이 좋습니다.
  3. '~'가 앞에 오는 일부 알 수없는 쿼리가 내보내지는 경우가 있습니다. 그들이 필요한지 모르겠습니다.
  4. MSAccess 개체 이름에는 파일 이름에 유효하지 않은 문자가 포함될 수 있습니다 . 스크립트를 쓰려고하면 스크립트가 실패합니다. 당신은 할 수 있는 모든 파일 이름을 정상화 ,하지만 당신은 그들을 다시 가져올 수 없습니다.

이 스크립트를 작업하는 동안 다른 리소스 중 하나는 this answer 였으므로 관계를 내보내는 방법을 알아낼 수있었습니다.


이것은 작동하는 것 같지만 연결된 테이블을 이해하지 못합니다
Darth Vader Lord

2

문제가 있습니다-VSS 6.0은 모든 로컬 테이블, 쿼리, 모듈 및 양식을 포함하는 특정 수의 개체에서 추가 기능을 사용하여 MDB를 수락 할 수 있습니다. 정확한 개체 제한을 모릅니다.

10 년 된 Prod Floor 앱을 만들려면 SS에서 3 ~ 4 개의 개별 MDB를 하나의 MDB로 결합해야하므로 자동화 된 빌드가 시간을 낭비하지 않는 지점까지 복잡해집니다.

위의 스크립트를 사용 하여이 MDb를 SVN에 분산시키고 모든 사람을 위해 빌드를 단순화 할 것이라고 생각합니다.


2

Access 2010을 사용하는 사람들에게는 SaveAsText가 Intellisense에서 눈에 띄는 방법은 아니지만 앞서 언급 한 Arvin Meyer의 스크립트 가 나에게 잘 작동 했기 때문에 유효한 방법으로 보입니다 .

흥미롭게도 SaveAsAXL 은 2010 년에 처음 사용되었으며 SaveAsText와 동일한 서명을 가지고 있지만 SharePoint Server 2010이 필요한 웹 데이터베이스에서만 작동하는 것으로 보입니다.


개체 브라우저에서 숨겨진 멤버 표시를 설정하지 않으면 A2003에서도 SaveAsText가 표시되지 않습니다. SaveAsAXL에 대한 좋은 정보.
David-W-Fenton

2

우리는 얼마 전에 같은 문제를 겪었습니다.

첫 번째 시도는 MS Access 및 VB 6과 함께 사용할 Subversion 용 SourceSafe API 프록시를 제공하는 타사 도구였습니다.이 도구는 여기 에서 찾을 수 있습니다 .

우리는 그 도구에 만족하지 않았기 때문에 Visual SourceSafe와 VSS Acces Plugin으로 전환했습니다.



1

SourceForge에서이 도구를 찾았습니다 : http://sourceforge.net/projects/avc/

나는 그것을 사용하지 않았지만 그것은 당신을위한 시작 일 수 있습니다. VSS 또는 SVN과 통합되어 필요한 작업을 수행하는 다른 타사 도구가있을 수 있습니다.

개인적으로 변경 로그를 유지하기 위해 일반 텍스트 파일을 편리하게 유지합니다. 이진 MDB를 커밋 할 때 변경 로그의 항목을 커밋 주석으로 사용합니다.


링크가 실제로 다운로드 되었습니까? 나는 장님입니까? 나는 그것을 찾을 수없는 것 같습니다.
BIBD

sourceforge.net/project/showfiles.php?group_id=115226 파일 패키지가 정의되지 않았습니다. 예
Nathan DeWitt

1

완전성을 위해 ...

"Microsoft Office System 용 Visual Studio [YEAR] 도구"( http://msdn.microsoft.com/en-us/vs2005/aa718673.aspx ) 는 항상 있지만 VSS가 필요한 것 같습니다. 나에게 VSS (자동 손상)가 uber 백업 네트워크 공유의 347 저장 포인트보다 나쁩니다.


1

내가 사용하고 소스 코드 제어 : 액세스 2003 추가 기능을 . 잘 작동합니다. 하나의 문제는 ":"와 같은 유효하지 않은 문자입니다.

체크인 및 체크 아웃 중입니다. 내부적으로 추가 기능은 코드와 동일하지만 더 많은 도구를 지원합니다. 객체가 체크 아웃되어 있는지 확인하고 객체를 새로 고칩니다.



1

올리버의 대답은 훌륭합니다. Access 쿼리에 대한 지원이 추가 된 확장 버전을 아래에서 찾으십시오.

( 자세한 정보 / 사용법 은 Oliver의 답변을 참조하십시오 )

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

액세스 데이터베이스 내에 쿼리에 대한 내보내기 옵션을 추가하여 그의 답변에 기여하려고 노력했습니다. ( 다른 SO 답변의 충분한 도움으로 )

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

다시 '구성'기능으로 다시 작동시킬 수는 없었지만 지금 당장 필요한 것은 아닙니다.

참고 : decompose.vbs 의 내 보낸 파일 이름 각각에 ".txt"도 추가했습니다. 하여 소스 컨트롤에 파일 diff가 즉시 표시되도록했습니다.

희망이 도움이됩니다!



0

이 항목은 다른 항목과는 완전히 다른 접근 방식을 설명하며 원하는 것이 아닐 수도 있습니다. 따라서 이것을 무시해도 기분이 상하지 않습니다. 그러나 적어도 그것은 생각을위한 음식입니다.

일부 전문 상용 소프트웨어 개발 환경에서 소프트웨어 산출물의 구성 관리 (CM)는 정상적으로 수행되지 않습니다 소프트웨어 응용 프로그램 자체 나 소프트웨어 프로젝트 자체 에서 . CM은 파일과 폴더가 모두 버전 식별로 표시되는 특수 CM 폴더에 소프트웨어를 저장하여 최종 배송 가능 제품에 적용됩니다. 예를 들어 Clearcase를 사용하면 데이터 관리자가 소프트웨어 파일을 "체크인"하고 "브랜치"를 지정하고 "버블"을 지정하고 "라벨"을 적용 할 수 있습니다. 파일을보고 다운로드하려면 원하는 버전을 가리 키도록 "config spec"을 구성한 다음 폴더에 CD를 넣으십시오.

그냥 생각이야


0

Access 97을 고집 한 사람은 다른 답변을 얻을 수 없었습니다. OliverDaveParillo의 탁월한 답변을 조합 하고 수정하여 Access 97 데이터베이스에서 스크립트를 사용할 수있었습니다. 또한 파일을 배치 할 폴더를 요청하기 때문에 좀 더 사용자 친화적입니다.

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

파일을 데이터베이스로 가져 오려면 처음부터 데이터베이스를 다시 작성해야하거나 어떤 이유로 Access 외부의 파일을 수정해야합니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.