Перейти к следующей записи в подчиненной форме MSAccess ADO, используя VBA - PullRequest
0 голосов
/ 18 октября 2019

Я получаю ошибку 2105 при попытке перейти к следующей записи с помощью DoCmd.GotoRecord в подчиненной форме MS Access.

В файле .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 Access 2016

Создайте модуль и запишите в нем только одну строку:

Public SQLDB As Object

Создайте SubForm, создайте событие 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 и свяжите его с 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.

1 Ответ

0 голосов
/ 19 октября 2019

Я нашел причину. это произошло потому, что элемент управления 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
...