Да, производительность будет незначительно снижаться для каждой подформы. Один или три не так уж плохо, но двадцать наверняка вызовет у вас проблемы с производительностью.
Как только у вас есть подчиненная работа, удовлетворяющая вашим требованиям, либо сохраните источник записи в качестве запроса, либо дайте ему имя или сохраните строку запроса SQL. Затем либо вставьте имя запроса, либо строку SQL запроса в код VBA в событии изменения управления вкладкой.
Private Sub TabCtl_Change()
On Error GoTo TabCtl_Change_Error
Select Case Me.TabCtl.Value
Case Me.pagPartsConsumed.PageIndex
If Me.PartsConsumedsbf.Form.RecordSource <> "Equipment - Parts Consumed sbf" Then _
Me.PartsConsumedsbf.Form.RecordSource = "Equipment - Parts Consumed sbf"
....
Теперь просто чтобы убедиться, что я не случайно оставить некоторые субформы recordsources заполнены замедляя приложение при запуске проверить, чтобы увидеть, если файл код выполняется является MDB (вместо МРЗ. функция ниже), тогда отобразите сообщение, сообщающее мне, что мне нужно удалить источник записей.
If Not tt_IsThisAnMDE Then
If Me.PartsConsumedsbf.Form.RecordSource <> "" Then _
MsgBox "Record source of Equipment - Parts Consumed sbf not empty"
...
End If
Public Function tt_IsThisAnMDE()
On Error GoTo tagError
Dim dbs As Database
Set dbs = CurrentDb
Dim strMDE As String
On Error Resume Next
strMDE = dbs.Properties("MDE")
If Err = 0 And strMDE = "T" Then
' This is an MDE database.
tt_IsThisAnMDE = True
Else
tt_IsThisAnMDE = False
End If
Exit Function
tagError:
Call LogError(Application.CurrentObjectName, "")
Exit Function
End Function
Также в форме выгрузки я также очищаю источник Recourd.
Private Sub Form_Unload(Cancel As Integer)
On Error GoTo Form_Unload_Error
Me.PartsConsumedsbf.Form.RecordSource = ""
....
BTW Я почти всегда ставил каждую подформу на отдельную вкладку. Кроме того, многие записи вкладок выглядят ужасно громоздкими. Когда у меня был аналогичный вопрос, мои коллеги Access MVP предложили использовать список слева, чтобы контролировать, какая подформация просматривается.
Также каждое поле со списком и поле списка также слегка ухудшают производительность. Так что, если у вас есть те, на подформе, то рассмотрите аналогичную логику.
Спасибо, это очень полезно. Я попытаюсь обойти и посмотреть, что работает лучше всего.+1 –
Просто комментарий о вашем событии OnChange: если вы используете имя закладки и получаете .PageIndex, почему бы просто не сделать ваш SELECT CASE на основе Me! CtlTab.Pages (Me! CtlTab) .Name, а затем каждый случай будет «pagPartsConsumed». Очевидно, вы хотите избежать выбора индекса страницы, поскольку это может измениться при добавлении/перемещении страниц в элементе управления вкладкой. Но мне кажется, что поиск значения строки однажды будет проще, чем поиск .PageIndex для каждого CASE вашего SELECT CASE. Наверное, не имеет никакого значения для производительности, но для меня это имеет более логичный смысл. –
Дэвид, ваш синтаксис выглядит уродливее, чем просто использование Me.pagPartsConsumed.PageIndex, поэтому я, вероятно, не понимаю ваш комментарий. –