为啥我不能在 CreateQueryDef 指令之后打开表单?
Posted
技术标签:
【中文标题】为啥我不能在 CreateQueryDef 指令之后打开表单?【英文标题】:Why I can't open a form after a CreateQueryDef instruction?为什么我不能在 CreateQueryDef 指令之后打开表单? 【发布时间】:2018-06-19 08:47:04 【问题描述】:我有一个 Access 2016 数据库,它使用表单来选择 1 天或更多天的时间间隔。 一个按钮让我获取间隔的开始和结束日期并执行以下 2 件事:
a) 构建一个查询,根据日期从表中提取数据集
b) 打开一个弹出表单,显示查询提取的数据集。 OpenForm 事件没有代码。
神奇的是,在我使用命令禁用 Shift 旁路键之前,一切都像魅力一样工作
CurrentDb.Properties("AllowBypassKey") = False
之后查询仍然运行良好,但当代码尝试打开表单时,95% 的情况下,我收到错误“2501 OpenForm 操作已取消”,即使它在 Access 2013 中运行良好。
代码很简单,但是经过3天的努力我还是不明白哪里出了问题。我唯一得到的是,如果我不执行 CreateQueryDef 指令,错误就会消失并且表单会定期打开(即使它没有显示正确的数据集)。 因此,这两个例程都单独运行,但如果它们一个接一个地运行,它们就会发生冲突。
在按钮后面的代码下方:
Private Sub Cmd_Meteo_Click()
On Error GoTo Err
Dim strFrmName As String
Dim datBegin As Date
Dim datEnd As Date
'Set the time interval
datBegin = Me.Txt_BeginTreatment 'Set the begin of the interval
datEnd = Me.Txt_Data 'Set tha end of the interval
'Build the query with meteo data
Call GetMetoData(Me.Txt_Region, Me.Cmb_MeteoStation, datBegin, datEnd, False)
'Set the form name
strFrmName = "Frm_DatiMeteoControllo"
'Check if the form is already open
If CurrentProject.AllForms(strFrmName).IsLoaded Then 'If the form is already open
DoCmd.Close acForm, strFrmName 'Close the form
End If
DoCmd.OpenForm strFrmName 'This line rise the 2501 error!
Exit_sub:
Exit Sub
Err:
MsgBox Err.Number & " " & Err.Description
Resume Exit_sub
End Sub
以及构建查询的子程序:
Public Sub GetMetoData(strRegion As String, intIdSM As Integer, datBegin As Date, datEnd As Date, bolTot As Boolean)
On Error GoTo Err
Dim db As DAO.Database
Dim strDbName As String
Dim qdf As DAO.QueryDef
Dim strSqlMeteo As String
Dim strLinkName As String
Dim strQryName As String
Set db = CurrentDb 'Set the db
strDbName = Application.CurrentProject.Name 'Get the db name
strTblName = GetMeteoTableName(strRegion, intIdSM) 'Get the name of the data table
strLinkName = "Tbl_DatiMeteo" 'Set the name of the linked table
strQryName = "TmpQry_DatiMeteoControllo" 'Set th name of the query
'SQL statement for the query
strSqlMeteo = "SELECT " & strLinkName & ".Data, ([" & strLinkName & "].[Precipitazione]) AS PrecTot, " & _
strLinkName & ".Tmin, " & strLinkName & ".Tmean, " & strLinkName & ".Tmax" & vbCrLf & _
"FROM " & strLinkName & vbCrLf & _
"WHERE (((" & strLinkName & ".Data) Between #" & Format(datBegin, "mm/dd/yyyy") & "# And #" & Format(datEnd, "mm/dd/yyyy") & "#));"
'Delete the previous query
If QueryEsiste(strDbName, strQryName) Then 'If the query already exist...
DoCmd.DeleteObject acQuery, strQryName 'delete the query.
End If
'Make the new query
Set qdf = db.CreateQueryDef(strQryName, strSqlMeteo)
Exit_sub:
qdf.Close
Set qdf = Nothing
db.Close
Set db = Nothing
Exit Sub
Err:
MsgBox Error$
Resume Exit_sub
End Sub
有没有人有提示或遇到同样的问题?
【问题讨论】:
您是否以“Frm_DatiMeteoControllo”的形式使用此查询“TmpQry_DatiMeteoControllo”记录源??如果是,那么这可能是问题.. 在打开表单之前检查查询是否存在。使用它,您将知道您的对象是否已创建。 我检查了查询。它总是在没有问题或错误的情况下创建。顺便说一句,如果启用 Shift Bypass Key,则不会出现错误。 【参考方案1】:应该没有理由删除查询:
If QueryEsiste(strDbName, strQryName) Then
' Modify the previous query.
Set qdf = db.QueryDef(strQryName)
qdf.SQL = strSqlMeteo
Else
' Create the new query.
Set qdf = db.CreateQueryDef(strQryName, strSqlMeteo)
End If
【讨论】:
好的,古斯塔夫!非常感谢您,但是请向我解释为什么您的代码可以解决问题?!我知道这是一个更好的代码,但不是为什么它会消除表单上的“错误 2501”。 我不知道为什么会弹出错误。我唯一的想法是,与删除和重新创建对象相比,修改 SQL 属性占用的资源更少。也许时间问题可能是导致错误的原因。以上是关于为啥我不能在 CreateQueryDef 指令之后打开表单?的主要内容,如果未能解决你的问题,请参考以下文章