2015-10-15 23 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