使用VBA移动到MSAccess ADO子窗体中的下一条记录

使用VBA移动到MSAccess ADO子窗体中的下一条记录,vba,ms-access,Vba,Ms Access,在MS Access子窗体中使用DoCmd.GotoRecord尝试移动到下一条记录时,出现错误2105 在.accdb文件中,有一个带有子窗体和模块的MainForm,SQL Server中有一个简单的表。就这样 我想我已经尽可能地简化了问题,如果你想帮助我,你可以遵循以下三个简单步骤: 在SQL Server中: 创建一个表并填入一些数据(使用SSMS): 在MS Access 2016中 创建一个模块并只在其中写入一行: Public SQLDB As Object 创建一个子表单,创建

在MS Access子窗体中使用DoCmd.GotoRecord尝试移动到下一条记录时,出现错误2105

在.accdb文件中,有一个带有子窗体和模块的MainForm,SQL Server中有一个简单的表。就这样

我想我已经尽可能地简化了问题,如果你想帮助我,你可以遵循以下三个简单步骤:

在SQL Server中:

创建一个表并填入一些数据(使用SSMS):

在MS Access 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,在其上放置一个子表单控件并绑定到子表单,创建一个OnLoad事件并在其模块中编写此代码(当然,您必须将连接字符串更改为您的环境):

当您打开主窗体时,执行行
DoCmd.GotoRecord,,acNext

为什么?

如果您将所有代码都放在子窗体中,它就可以正常工作,因此我看不出有任何理由仅仅因为子窗体“在子窗体控件中”就不能正常工作


如果您对如何在子窗体的记录集中前后移动光标有任何其他想法,我将很高兴听到。但是表单记录集是ADO非常重要。

我找到了原因。这是因为主窗体上的子窗体控件未处于活动状态(或“聚焦”)。因此,解决方案是在子窗体的代码中添加一行:

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
Dim rsa作为对象
专用子表单_加载()
Set rsa=CreateObject(“ADODB.Recordset”)
端接头
公共子填充(ByVal sql作为字符串)
rsa.opensql,SQLDB
Set Me.Recordset=rsa

Me.Parent(“UO”).SetFocus“该代码适用于我。但我没有使用SQLServer后端。我也从未使用过Recordset属性。是的,如果使用.accdb后端(或DAO),它可以正常工作。我在迁移到SQL Server时遇到了这个问题我使用记录集,因为我不知道让SQL Server执行查询的其他方法(出于性能原因,查询在现实世界中非常复杂),这也是我迁移的众多原因之一。您可以使用在服务器端执行的
passthrough
查询。您是否检查了这两种表单的加载事件顺序?
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
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