命令$()在Access 2007中有效,但在Access 2013

时间:2015-10-15 19:03:47

标签: sql ms-access access-vba ms-access-2007 ms-access-2013

使用的项目:

  1. Access 2013数据库源是.accdb(引用为" Source")
  2. 访问2013数据库.accde源代码。 (引用为" CurrentVersion")
  3. 用户在其C:\ AccessSystems文件夹中有一个CurrentVersion副本(引用为" UserVersion")
  4. SQL数据库表链接到"来源"名为VersionControl2013
    表格包含:System_NameVersion_NumberMDE_Path_NameMDE_Name
  5. 流程:

    1. 开发者在源

    2. 中进行了更改
    3. 开发人员将类别更新为下一个版本号。类别位于数据库属性中。

    4. 开发人员创建CurrentVersion并将其保存到P:\ drive(保存所有CurrentVersions)。

    5. 用户打开UserVersion并运行代码以检查它是否与CurrentVersion匹配。

    6. 用户选择更新并运行代码以关闭UserVersion并将CurrentVersion复制到用户的c:\ AccessSystems文件夹。

    7. 现在......用户是最新的正确版本。

      用户打开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年没有?

2 个答案:

答案 0 :(得分:0)

也许我没有看到所有的代码或遗漏了一些东西但是......通常你需要将DatabaseName声明为所有子程序都可用的公共变量。 或..将值传递回调用语句。

这样打电话:

databasename = GetApplicationInformation()

该功能如下所示:

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

但当然这并不能解释为什么它在Access 2007中有效。也许你的一些更多细节会有所帮助。

答案 1 :(得分: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 & "'"

所以你需要传递正确的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()从完整路径中提取文件名。