У меня есть основная форма с управлением вкладкой, содержащим несколько подчиненных форм. Я должен быть уверен, что данные в подчиненной форме сохраняются, когда пользователь переключает вкладки. Проблемой является тот DoCmd. RunCommand acCmdSaveRecord кажется, только относится к текущей форме, таким образом, это не сохраняет данные в подчиненной форме.
Я попробовал различные события на подчиненной форме те, которые деактивируются, OnLostFocus и т.д., но они не стреляют, пока другое поле где-то в другом месте не получает фокус.
Идеальное решение, казалось бы, было бы для помещения чего-то на событие OnChange управления вкладкой, чтобы быть уверенным, что все данные сохраняются. Это - мой вопрос, как сделать, я сохраняю запись в подчиненной форме?
В Access по умолчанию используется сохранение, поэтому, если вы не сделали что-то довольно сложное, чтобы предотвратить это, перемещение фокуса из подчиненной формы автоматически сохранит запись. Это можно проверить, добавив запись, перейдя от подчиненной формы, а затем проверив таблицу.
Вам вообще ничего не нужно делать, поскольку подформа сохраняется, как только теряет фокус (когда меняется элемент управления вкладкой).
Но в качестве упражнения я привел код, который вы напишете, если вам это понадобится.
Вы можете сохранить любую форму, установив для свойства .Dirty значение False. Для чего-то вроде этого, что будет часто выполняться, я думаю, я бы написал подформу, которая будет проходить по подформам, проверять, не грязные ли они, и сохранять грязные. Что-то вроде этого:
Public Sub SaveSubFormsOnTab()
Dim pge As Control
Dim ctl As Control
For Each pge In Me!ctlTab.Pages
Debug.Print pge.Name
For Each ctl In pge.Controls
If ctl.ControlType = acSubform Then
If ctl.Form.Dirty Then
ctl.Form.Dirty = False
End If
Debug.Print ctl.Name
End If
Next ctl
Next pge
Set ctl = Nothing
Set pge = Nothing
End Sub
На самом деле, это довольно неэффективно в случаях, когда у вас много элементов управления на вкладке, которые не являются субформами. Если на вкладке нет ничего, кроме подформ, это будет достаточно эффективно. В любом случае гораздо эффективнее использовать пользовательскую коллекцию, заполняемую в событии OnLoad формы, а затем пройтись по этой коллекции, которая не содержит ничего, кроме подформ вашей вкладки, и сохранить все грязные.
Любой из этих вариантов предпочтительнее, чем использование события OnChange вкладки, поскольку каждый раз, когда вы добавляете страницу вкладки с субформой или изменяете имя элемента управления субформы, вам придется изменять событие OnChange.