【问题标题】:access: how to detect with VBA whether a query is opened?访问:如何用 VBA 检测是否打开了查询?
【发布时间】:2010-10-21 21:42:47
【问题描述】:

是否可以在 access-2007 中检测是否存在使用 VBA 的打开查询?

我正在打开这样的查询:

    stDocName = "Meeting_Reasons_Frequency"
  DoCmd.OpenQuery stDocName

是否可以检测是否打开?

【问题讨论】:

    标签: sql ms-access vba


    【解决方案1】:

    怎么样:

     If SysCmd(acSysCmdGetObjectState, acQuery, "QueryName") = acObjStateOpen Then
    

    更多信息:http://msdn.microsoft.com/en-us/library/aa205281(office.10).aspx

    【讨论】:

      【解决方案2】:

      不确定这是否适用于查询,但我注意到对于表单,您应该使用 And 而不是 =

      If SysCmd(acSysCmdGetObjectState, acForm, "FormName") And acObjStateOpen Then
      

      显然表单可以同时具有多个“状态”。使用And 选择你想要的;它在此上下文中充当按位运算符。

      【讨论】:

      • 同样的acSysCmdGetObjectState 问题适用于查询和表单。感谢您提请我们注意。
      【解决方案3】:
      如果 QueryName 已关闭或不存在,

      SysCmd(acSysCmdGetObjectState, acQuery, "QueryName") 返回零。

      否则,它将返回适用于以下任何一项的常量的总和:

      • acObjStateOpen (1) 在任何状态(新、脏等)或视图(设计、数据表等)下打开
      • acObjStateDirty (2) 打开但未保存设计更改
      • acObjStateNew (4) 尚未保存到其父集合的新查询 (QueryDefs)

      也许大多数时候检查SysCmd 表达式= acObjStateOpen 是否足够。但是,如果您想避免在打开查询时出现未保存的设计更改时出现意外情况,您可以将And acObjStateOpen 设置为pianoJames suggested

      但是如果你的意图是在 QueryName 打开时做某事,你可以简单地检查它是否没有关闭(零):

      If SysCmd(acSysCmdGetObjectState, acQuery, "QueryName") <> 0 Then
      

      【讨论】:

      • 我对这部分的结尾有点困惑acObjStateOpen (1) open in any state (new, dirty, etc.),因为其他两个常量代表脏和新
      • 如果您打开已保存的查询,其状态将只是acObjStateOpen --- 既不适用acObjStateDirty 也不适用acObjStateNew
      猜你喜欢
      • 2015-08-02
      • 2013-06-28
      • 2013-12-23
      • 1970-01-01
      • 2018-02-19
      • 2019-06-06
      • 1970-01-01
      • 2022-11-22
      • 2023-03-23
      相关资源
      最近更新 更多