2015-10-15 90 views
0

項目:

  1. 訪問2013數據庫源是.ACCDB
  2. 訪問2013數據庫.accde(如 「源」 引用)的來源。 (引用爲「CURRENTVERSION」)
  3. 用戶有CURRENTVERSION對它們的C副本:\ AccessSystems文件夾(被引用爲「UserVersion」)鏈接到「源」
  4. SQL數據庫表命名VersionControl2013
    表包含:System_Name,Version_Number,MDE_Path_NameMDE_Name

流程:

  1. 開發使得源的變化

  2. 開發者更新類別下一個版本號。類別位於數據庫屬性中。

  3. 開發人員創建CurrentVersion並將其保存到P:\ drive(其中保存了所有CurrentVersions)。

  4. 用戶打開UserVersion並運行代碼以檢查它是否與CurrentVersion匹配。

  5. 用戶選擇更新和代碼運行,關閉UserVersion及複印件CURRENTVERSION用戶的C:\ AccessSystems文件夾中。

現在...用戶是最新的正確版本。

UserVersion由用戶打開,在打開時它會檢查,看看是否匹配版本使用下面的代碼:

Public Sub CheckVersionNumber() 
    Dim SQLConn As New ADODB.Connection 
    Dim AnswerSet As New ADODB.Recordset 
    Set dbs = CurrentDb 
    Set cnt = dbs.Containers!Databases 
    Set doc = cnt.documents!SummaryInfo 
    doc.Properties.Refresh 
    Set ThisVersion = doc.Properties("Category") 
    Set SystemName = doc.Properties("Title") 
    Set SQLConn = New ADODB.Connection 
    SQLConn.Provider = "sqloledb" 
    SQLConn.Open "Data Source=scgcserver1;Initial Catalog=SCGCDatawarehouse " 
    QueryString = "SELECT VersionControl2013.* FROM VersionControl2013 WHERE (((VersionControl2013.System_Name)=" & "'" & SystemName & "'" & "));" 
    AnswerSet.Open QueryString, SQLConn, , adCmdText 
    If AnswerSet.EOF = False Then 
     If RTrim(AnswerSet("Version_Number")) = ThisVersion Then 
     Else 
     MsgBox ("Version Number does not match") 
     ServDir = "p:\accesssytems" 
     Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde" 
     Application.Quit 
     End If 
    End If 
    AnswerSet.Close 
    With SQLConn 
     .Close 
    End With  
End Sub 

注意:下面的代碼在Access 2007中它不會在Access 2013的工作。

當CURRENTVERSION被調用並打開它運行下面的代碼:

Public Function LoadVersion() 
    DialogMessage = "You have a previous version of the Application, Do you want to UPDATE your version?" 
    DialogStyle = vbYesNo + vbDefaultButton1 
    DialogTitle = "Update Application" 
    DialogResponse = MsgBox(DialogMessage, DialogStyle, DialogTitle) 
    If DialogResponse = vbYes Then 
     ApplicationName = Command$() 
     Call GetApplicationInformation 
     DoCmd.Hourglass True 
     ToDirectory = "C:\AccessSystems\" & RTrim(DatabaseName) 
     FromDirectory = RTrim(MDEPathName) & RTrim(DatabaseName) 
     FileCopy "p:\AccessSystems\compiles\Access2013Compiles\" & DatabaseName, "c:\AccessSystems\" & DatabaseName 
     MsgBox ("Your Client Copy has been updated - Thank You " & " " & ApplicationName & " " & DatabaseName) 
     Shell "MsAccess.exe " & "C:\AccessSystems\" & RTrim(DatabaseName) 

     Application.Quit 
    End If 
End Function 


Public Sub GetApplicationInformation() 
    Dim SQLConn As New ADODB.Connection 
    Dim AnswerSet As New ADODB.Recordset 

    Set SQLConn = New ADODB.Connection 
    SQLConn.Provider = "sqloledb" 
    SQLConn.Open "Data Source=scgcserver1;Initial Catalog=SCGCDatawarehouse " 
    QueryString = "SELECT VersionControl2013.* FROM VersionControl2013 WHERE (((VersionControl2013.System_Name)=" & "'" & ApplicationName & "'" & "));" 
    AnswerSet.Open QueryString, SQLConn, , adCmdText 
    If AnswerSet.EOF = False Then 
     DatabaseName = AnswerSet("MDE_Name") 
     MDEPathName = AnswerSet("MDE_Path_Name") 
    End If 
    AnswerSet.Close 
    With SQLConn 
     .Close 
    End With 

End Sub 

我得到一個運行時錯誤

52:錯誤的文件名或編號。

調試使它行,DatabaseName是「」。

FileCopy "p:\AccessSystems\compiles\Access2013Compiles\" & DatabaseName, "c:\AccessSystems\" & DatabaseName 

我覺得行:ApplicationName = Command$()有事情做它,因爲ApplicationName爲空也。它應該引入應用程序的名稱。

爲什麼它在2007年的工作,而不是在2013年?

+0

有意思的是,'VersionControl2013'表是一個SQL Server數據庫。請注意SQL是一種編程語言,包括Oracle,SQL Server,Postgre,MySQL,DB2,SQLite,甚至包括Jet/ACE SQL引擎的MS Access在內的許多RDMS都可以使用! – Parfait

+0

另外,你爲什麼要在鏈接表上運行一個ADO連接,即'VersionControl2013'?如果在當前數據庫中可用作當前文件中的鏈接表,請使用MS Access'[DLookUp()](http://www.techonthenet.com/access/functions/domain/dlookup.php)。建立鏈接表時,您已經連接了ODBC。不需要再做一次。 – Parfait

回答

0

這是一個相當複雜的系統,你在那裏。

Command()函數返回一個字符串,該字符串通過/ cmd開關附加​​到Access命令行。

你必須啓動Access例如這樣

"MSACCESS.EXE C:\mypath\Database1.accdb /cmd SomeString" 

那麼如果Database1.accdb調用Command(),則返回 「SomeString」。

但是,如果我理解正確的話,上面的代碼啓動與

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde" 

沒有/ CMD開關設置下的代碼,所以Command()將不會返回任何東西。
它可能迷失在切換到Access 2013?


編輯:

正如我上面寫的,ApplicationName = Command$()不能在更低的代碼工作,因爲沒有/cmd串這裏傳遞的是:

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde" 

它用在這裏:

WHERE VersionControl2013.System_Name = " & "'" & ApplicationName & "'" 

so y OU需要通過什麼是正確的VersionControl2013.System_Name,像這樣:

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd mySystemName" 

或者,如果System_Name僅僅是數據庫(UserVersion)的名字,像這樣:

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd " & Dir(CurrentDb.Name) 

我以前Dir()提取文件名稱來自完整路徑。

+0

好的...我嘗試了兩個建議,沒有任何進展。任何其他想法?再次感謝! –

+0

@TanyaHammil:見編輯。 – Andre

+0

使用'Application.CurrentProject.FullName',它返回當前數據庫文件的路徑和名稱。 – Parfait

0

也許我沒有看到所有的代碼或失去了一些東西,但...通常您需要將DatabaseName聲明爲可用於所有子例程的公共變量。 或..將值傳遞迴調用語句。

這樣調用:

​​

的功能應該是這樣的:

Public Function GetApplicationInformation() As String 
... 
GetApplicationInformation = AnswerSet("MDE_Name") ' the database name 

但是,當然,這並不能解釋爲什麼它在2007年的訪問也許是從你工作的一些更詳細的會幫幫我。

+0

謝謝......我會先嚐試Andre451的建議,如果它不起作用......我會嘗試你的建議。 –

+0

我試過這兩個建議,但都沒有成功。不知何故,我需要將「UserVersion」數據庫名稱傳遞給LoadVersion Code ... ApplicationName。 –

+0

@ dspanogle的答案應該可以正常工作,因爲您需要從函數而不是子例程返回DatabaseName。通過在'GetApplicationInformation()'sub的'AnswerSet.Close'之前添加'debug.Print DatabaseName'來查看Databasename是否爲空,並在底部的立即窗口中看到輸出。同時檢查SQL Server中的'VersionControl2013'表,看看第一條記錄是否包含你正在查詢的行的'MDE_Name'字段中的數據。新版本不會成爲最後的記錄嗎? – Parfait