Создание функции "DoCmd.GoToRecord" работает над подформой

Я успешно использовал функцию DoCmd.GoToRecord , , acNewRec для создания и перехода к новой записи в подчиненной форме (с таблицей в качестве источника). Однако, когда я пытаюсь сделать то же самое из родительской формы, это не сработает. Я пробовал разные подходы, в том числе:

Me.sbfrm_subform.Controls("ctrName").SetFocus
DoCmd.GoToRecord , , acNewRec

который только устанавливает фокус на элементе управления (ctrName), но не может добавить и перейти к новой записи, или

DoCmd.GoToRecord acDataForm, Me.sbfrm_subform.Form.Name, acLast

Что возвращает ошибка 2489 во время выполнения, "Объект sbfrm_subform не открыт".

Ответ 1

Попробуйте поместить код в подчиненную форму и затем вызвать его из родителя:

Код подформы:

Sub GoToNewRecord()
     DoCmd.GoToRecord , , acNewRec
End Sub

Код родительской формы:

Me.sbfrm_subform.GoToNewRecord

Ответ 2

Попробуйте разделить операции:

Me.[sbfrm_subform].SetFocus
DoCmd.GoToRecord, , acNewRec

В качестве альтернативы вы можете попробовать создать публичный Sub в подчиненной форме, и поскольку он становится методом формы, вы можете использовать это.
Используя это в последних версиях Access, вы даже можете попробовать играть напрямую с помощью набора записей формы, например Me.Recordset.Movenext.

Ответ 3

Как отметил iDevlop, вы можете использовать объект Recordset подформы для перехода на новую запись. Тем не менее, вам не нужно создавать публичную часть субформы. Вы делаете все это из основной формы:

Me.[subform control name].SetFocus
Form_[subform form name].Recordset.AddNew

Чтобы использовать синтаксис Form_ [form name], форма должна иметь код кода VBA. Если форма не имеет одного, и по какой-то причине вы против создания пустого, тогда вы можете использовать синтаксис Forms! MyForm.SubformControl.Form. Но Form_ [Имя формы] проще.

Ответ 4

В основной форме "On Current" я выполнил следующую процедуру события:

Private Sub Form_Current()
    Me.SubformName.SetFocus
    Me.SubformName.Requery
    RunCommand acCmdRecordsGoToLast
    DoCmd.GoToRecord , , acNewRec
    Scan.SetFocus
End Sub

DoCmd предназначен для основной формы для запуска новой записи. Все это до того, чтобы установить подчиненную форму в последнюю запись и запросить ее, чтобы данные были свежими.

Ответ 5

Вот как я решил свою проблему...

Основная форма: FRM_Trader_WorkSheet

Имя подформы - Frm_Trader_Worksheet_Sub

В открывшемся событии моей основной формы я закодирован следующим образом:

Private Sub Form_Open(Cancel As Integer)
  Me.Frm_Trader_Worksheet_Sub.SetFocus   
  DoCmd.GoToRecord , , acLast    
  DoCmd.GoToRecord , , acNext    
End Sub

Так как я не делаю ввода данных в своей основной форме, теперь моя основная форма открывается с акцентом на новую запись в моей дополнительной форме. Теперь я могу вернуться к предыдущим записям, если это необходимо, но я готов ввести новые данные при загрузке основной формы.

При этом вы можете добиться тех же результатов, просто установив свойство подформы на вкладке "Данные" "Ввод данных = ДА". Единственное различие заключается в том, что у вас больше не будет доступа к предыдущим записям...