Command$() 在 Access 2007 中有效,但在 Access 2013 中无效
Command$() worked in Access 2007 but does not work in Access 2013
项目使用:
- Access 2013 数据库源是 .accdb(引用为 "Source")
- 访问源的 2013 数据库 .accde。 (引用为 "CurrentVersion")
- 用户在他们的 C:\AccessSystems 文件夹中有一份 CurrentVersion 的副本(引用为 "UserVersion")
- SQL 数据库 table 链接到名为
VersionControl2013
.
的 "Source"
Table 包含:System_Name
、Version_Number
、MDE_Path_Name
和 MDE_Name
。
流量:
开发人员对源代码进行了更改
开发者将类别更新为下一个版本号。类别在数据库属性中。
开发人员创建 CurrentVersion 并将其保存到 P:\ 驱动器(所有 CurrentVersions 都保存在这里)。
用户打开 UserVersion 并运行代码以检查它是否与 CurrentVersion 匹配。
用户选择更新,代码运行以关闭 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: Bad file name or number.
Debug 将其上线并且 DatabaseName
是 "".
FileCopy "p:\AccessSystems\compiles\Access2013Compiles\" & DatabaseName, "c:\AccessSystems\" & DatabaseName
我觉得这行:ApplicationName = Command$()
与它有关,因为 ApplicationName
也是空白的。它应该引入应用程序的名称。
为什么它在 2007 年有效,但在 2013 年却无效?
也许我没有看到所有代码或遗漏了一些东西,但是...通常您需要将 DatabaseName 声明为可用于所有子例程的 public 变量。
或者 .. 将值传回调用语句。
这样调用:
databasename = GetApplicationInformation()
函数如下所示:
Public Function GetApplicationInformation() As String
...
GetApplicationInformation = AnswerSet("MDE_Name") ' the database name
但这当然不能解释为什么它在 Access 2007 中起作用。也许您提供的更多详细信息会有所帮助。
这是一个相当复杂的系统。
Command()
函数 return 是一个使用 /cmd 开关附加到 Access 命令行的字符串。
您必须启动 Access,例如像这样
"MSACCESS.EXE C:\mypath\Database1.accdb /cmd SomeString"
那么如果 Database1.accdb 调用 Command()
,它 return 就会 "SomeString"。
但是如果我没理解错的话,上面的代码用
启动下面的代码
Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde"
没有 /cmd 开关,所以 Command()
不会 return 任何东西。
它可能在切换到 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()
从完整路径中提取文件名。
项目使用:
- Access 2013 数据库源是 .accdb(引用为 "Source")
- 访问源的 2013 数据库 .accde。 (引用为 "CurrentVersion")
- 用户在他们的 C:\AccessSystems 文件夹中有一份 CurrentVersion 的副本(引用为 "UserVersion")
- SQL 数据库 table 链接到名为
VersionControl2013
.
的 "Source" Table 包含:System_Name
、Version_Number
、MDE_Path_Name
和MDE_Name
。
流量:
开发人员对源代码进行了更改
开发者将类别更新为下一个版本号。类别在数据库属性中。
开发人员创建 CurrentVersion 并将其保存到 P:\ 驱动器(所有 CurrentVersions 都保存在这里)。
用户打开 UserVersion 并运行代码以检查它是否与 CurrentVersion 匹配。
用户选择更新,代码运行以关闭 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: Bad file name or number.
Debug 将其上线并且 DatabaseName
是 "".
FileCopy "p:\AccessSystems\compiles\Access2013Compiles\" & DatabaseName, "c:\AccessSystems\" & DatabaseName
我觉得这行:ApplicationName = Command$()
与它有关,因为 ApplicationName
也是空白的。它应该引入应用程序的名称。
为什么它在 2007 年有效,但在 2013 年却无效?
也许我没有看到所有代码或遗漏了一些东西,但是...通常您需要将 DatabaseName 声明为可用于所有子例程的 public 变量。 或者 .. 将值传回调用语句。
这样调用:
databasename = GetApplicationInformation()
函数如下所示:
Public Function GetApplicationInformation() As String
...
GetApplicationInformation = AnswerSet("MDE_Name") ' the database name
但这当然不能解释为什么它在 Access 2007 中起作用。也许您提供的更多详细信息会有所帮助。
这是一个相当复杂的系统。
Command()
函数 return 是一个使用 /cmd 开关附加到 Access 命令行的字符串。
您必须启动 Access,例如像这样
"MSACCESS.EXE C:\mypath\Database1.accdb /cmd SomeString"
那么如果 Database1.accdb 调用 Command()
,它 return 就会 "SomeString"。
但是如果我没理解错的话,上面的代码用
启动下面的代码Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde"
没有 /cmd 开关,所以 Command()
不会 return 任何东西。
它可能在切换到 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()
从完整路径中提取文件名。