----------- --------- UPDATE
我想出了如何关注我的子表单。如果是子表单则:
ParentFormName = frm.Parent.Name
SubFormName = frm.Name
Forms(ParentFormName).Form(SubFormName).SetFocus
这似乎有效(尽管Andre451的帖子更有效)。但是这导致了我的子表单导致挂起状态的潜在问题。我的子表单相对较大(194条记录),当在较大记录的记录集上执行MoveFirst / Last时,我得到错误3021 (no current record)
。这可能与子窗体的整个记录集没有加载到主窗体的load事件上有关。较小的记录集可以更快地循环,因此不会产生错误(这只是一个假设)。
新的问题是:如何避免3021 error
并让子窗体记录完全加载,以便我可以使用以下任一方式来完成它们:
OR
-------------------------------------------- --------------------------------------
我们将Access数据迁移到仍然使用Access作为前端的SQL服务器。我们通过将SQL Server表与Access链接来实现这一点,这一切都很好(几乎)。但是最近我们遇到了Access查询在SQL服务器上进入suspended state
的问题(主要发生在组合框中的查询中)。
经过一些研究,我们发现这可以通过循环查看表单加载的查询记录来解决(所以通过做一个简单的acCmdRecordsGoToLast
和acCmdRecordsGoToFirst
)这似乎有效。
因此,为了抵消这种暂停状态,我们在每个表单中加载了一个init
,它运行recordsource
和rowsource
(主表单记录源,comboxes行源等)的记录。 / p>
所以在表单加载:
modFunctions.InitForm(Me)
这个init在一个模块中,如下所示:
Dim InitFormResult As Boolean
InitFormResult = InitFormRecordSource(frm) ' Initialize the recordsource of the form
InitFormComboBoxes frm ' Initialize all the comboboxes on the form
InitFormCommandButton frm ' Initialize all the buttons on the form
表单RecordSource的第一个init(发生错误的地方)如下所示:
Public Function InitFormRecordSource(frm As Form) As Boolean
If frm.RecordSource <> "" Then ' if recordsource found
On Error GoTo ErrHandler
frm.SetFocus
DoCmd.RunCommand acCmdRecordsGoToLast
DoCmd.RunCommand acCmdRecordsGoToFirst
GoTo EndSuccess
ErrHandler:
MsgBox (Err.Number)
Debug.Print "ERROR during InitFormRecordSource in form : " & frm.Name
InitFormRecordSource = False
Exit Function
EndSuccess:
InitFormRecordSource = True
Else
InitFormRecordSource = True
End If
End Function
要使用First和Last来运行表单记录集,它需要具有焦点。这一切都适用于一种形式,但它不适用于主窗体中的子窗体。在子表单中,我们也希望通过运行子表单记录来计算挂起状态,但是在使用上面的代码时,我们会继续获取error 2449
。
经过一些研究后,我遇到了这篇文章:Module Function frm.setfocus runtime 2449 error这或多或少是同一个问题。所以我发现一个子表单需要以不同的方式给予它关注,但我所做的所有努力都不会起作用。
到目前为止我尝试了什么:
If frm.RecordSource <> "" Then ' if recordsource found
On Error GoTo ErrHandler
Dim HasParent As Boolean
Dim sParentForm
HasParent = TypeName(frm.Parent.Name) = "String"
If HasParent = True Then 'The form is a subform
'sParentForm = frm.Parent
'sParentForm.frm.SetFocus
'frm.Parent.frm.SetFocus
'sParentForm!frm.SetFocus
Else
frm.SetFocus
End If
DoCmd.RunCommand acCmdRecordsGoToLast
DoCmd.RunCommand acCmdRecordsGoToFirst
GoTo EndSuccess
上面的代码中都注释了尝试过的修复程序。 HasParent
确实有效,我可以检查表单是否是子表单(它有一个父表单),并设置焦点不同。
虽然我似乎无法专注于子窗体,但我不太清楚如何解决这个问题!
答案 0 :(得分:1)
我遇到了类似的问题,Sql Server 2008 R2上的查询进入“ASYNC_NETWORK_IO”等待状态,直到最后一条记录被加载。
我的解决方案:不要使用表单本身转到最后一条记录,而是.RecordsetClone
:
frm.RecordsetClone.MoveLast