当我尝试在 MS Access 子窗体中使用 DoCmd.GotoRecord 移动到下一条记录时,我收到错误 2105。
在.accdb文件中,有一个带有子窗体和模块的 MainForm,SQL Server 中有一个简单的表。就是这样。
我想我已经尽可能地简化了问题,如果你想帮助我,你可以按照以下三个简单的步骤操作:
在 SQL Server 中:
创建一个表并填充一些数据(使用 SSMS(:
CREATE TABLE ATable (AColumn INT)
INSERT INTO ATable VALUES (6)
INSERT INTO ATable VALUES (126)
INSERT INTO ATable VALUES (210)
INSERT INTO ATable VALUES (11)
在 MS 访问 2016 中
创建一个模块并在其中只写一行:
Public SQLDB As Object
创建一个子窗体,创建一个 OnLoad 事件并在其模块中编写以下代码:
Dim rsa As Object
Private Sub Form_Load()
Set rsa = CreateObject("ADODB.Recordset")
End Sub
Public Sub Fill(ByVal sql As String)
rsa.Open sql, SQLDB
Set Me.Recordset = rsa
DoCmd.GoToRecord , , acNext
End Sub
最后,创建一个 MainForm,在其上放置一个子窗体控件并绑定到 SubForm,创建一个 OnLoad 事件并将此代码写入其模块中(当然,您必须将连接字符串更改为您的环境(:
Private Sub Form_Load()
Set SQLDB = CreateObject("ADODB.Connection")
SQLDB.Open "Driver={SQL Server Native Client 11.0};Server=YourSQLServer;Database=Yourdatabase;Trusted_Connection=yes;"
SQLDB.CursorLocation = 3 ' adUseClient
Me.UO.Form.Fill "ATable"
End Sub
当您打开 MainForm 时,您会在执行行时收到错误 2105 无法转到指定的记录DoCmd.GotoRecord,,acNext
为什么?
如果您将所有代码放在 SubForm 中,它工作正常,所以我认为没有理由仅仅因为 SubForm "在子窗体控件中"就无法正常工作。
如果您有任何其他想法如何在子窗体的记录集中向前和向后移动光标,我将很高兴听到。但表单记录集是 ADO 非常重要的。
我找到了原因。 这是因为SubForm控件在MainForm上未处于活动状态(或"聚焦"(。所以解决方案是在Subform的代码中添加一行:
Dim rsa As Object
Private Sub Form_Load()
Set rsa = CreateObject("ADODB.Recordset")
End Sub
Public Sub Fill(ByVal sql As String)
rsa.Open sql, SQLDB
Set Me.Recordset = rsa
Me.Parent("UO").SetFocus ' <--- New line
DoCmd.GoToRecord , , acNext
End Sub