我有一个相当直接的自动执行宏来对我的拆分数据库执行版本控制检查。我在前端有一个名为
LocalVersionNumber
的表,在后端有一个名为 LiveVersionNumber
的表。每个版本号可能有多个值(例如,正在使用哪个版本的后端、哪个前端等)。因此,这些表中的值是通过查询 __LiveVersionParser_Q
和 __LocalVersionParser_Q
进行解析的。在不讨论太多浪费细节的情况下,本地版本号应始终等于或大于实时版本号。
我编写了一个查询来比较本地和实时解析值 - 并通过 IIF 表达式确定更新或保留当前版本的逻辑。该测试查询运行没有问题,但现在我已将逻辑放入自动执行宏中,并且收到错误:
找不到您在中输入的名称“__LiveVersionParser_Q” 表达。
我已经仔细检查过,表格和字段拼写正确。我什至将宏中的语句复制并粘贴回查询中,并且查询仍然可以正确执行。
(在宏生成器中而不是 VBA - 呃)
“如果”行动
CDbl([__LiveVersionParser_Q].[DevelopmentVersion])
<=CDbl([__LocalVersionParser_Q].[DevelopmentVersion])
然后...执行我的更新前端逻辑。
注意:对于那些问“为什么使用 CDbl?”的人,使用它是因为版本号是一个文本字符串,其中包含多个由“.”分隔的值。解析版本后,通过将这些字符串转换为双精度值(使用 CDbl)来比较这些字符串,看看哪个更大。
正如我之前所说,这个语句确实有效,只是在这个宏中不起作用。我使用以下查询对其进行了故障排除(为了保持一致,这里是我测试的“设计”视图表达式而不是 SQL):
Expr1: IIf(CDbl([__LiveVersionParser_Q].[DevelopmentVersion])
<=CDbl([__LocalVersionParser_Q].[DevelopmentVersion]),"OK","UPDATE")
有什么建议吗?我觉得我错过了一些简单的东西。
我找到了解决方法(不是根本原因和解决方案)。 如果有人可以提供根本原因的正确解释,我很乐意将答案转给他们!
但与此同时,如果其他人遇到类似的问题,这是我的解决方法:
第1步: 正如我的问题中所述,我有一个查询可以完美地运行“IF”操作。所以我用它来输出一个
Result
字段,表示“确定”或“更新”。
第2步: 我将我的 autoexec 宏更改如下:
IF...
DMax("Result","__VersionControl_FinalTest")="Update"
THEN...
Run my update code.
ELSE...
CancelEvent
END IF
注意:我尝试使用以下简单的语句:
IF...
[__VersionControl].[Result] = "Update"
但是,当我运行该宏时,我再次收到错误 2482(“找不到名称...”)。
为什么 DMax 能够“找到”
__VersionControl_FinalTest
查询,而 IF 语句却不能,我不知道 - 但至少我已经恢复并运行了。
我想我至少找到了这个问题的部分根本原因。 Access 需要打开一个以链接表作为记录源的窗体,以便在 AutoExec 宏中引用该表中的字段。这是我所做的:
创建一个新表单
vCheck_F
,使用后端表liveVersion_T
作为记录源。该表将字段 LiveVersionNumber
作为短文本保存。
在我的数据库中,我不使用本地表,而是使用 AutoExec 宏中的
SetTempVar
来定义 LocalVersionNumber = "#.##"
。您可以再次使用步骤1创建另一个表单,以本地版本号表作为记录源。
在 AutoExec 宏中,使用按顺序执行以下操作:
OpenForm vCheck_F
并将 Window Mode
设置为 Hidden
。If StrComp([TempVars]![LocalVersionNumber] & "",[Forms]![vCheck_F]![LiveVersionNumber] & "",0)<>0 Then
MessageBox "You are using an old version, get the new one"
StrComp
来查看 LocalVersionNumber
和 LiveVersionNumber
是否相同,并且只是显示一条消息,但您可以添加您想要的任何其他代码。重要的是在调用它时使用 [Forms]![formName]![fieldName]
。End If
CloseWindow Form vCheck_F