Это снижает производительность для использования подчиненных форм в MS Access? - PullRequest
1 голос
/ 01 сентября 2009

Я рассматриваю возможность использования элемента управления вкладками в родительской форме, для которого я хотел бы иметь около 20 вкладок. В каждой вкладке я рассматриваю возможность использования одной или двух отдельных субформ. Каждая подформа будет иметь различную сложность в кодированной логике. Используя этот подход, я несколько уменьшу производительность моего приложения? В настоящее время я использую это в MS Access 2003. Я буду ожидать в среднем 15 пользователей в любой момент времени в различных формах.

Мысли

Ответы [ 3 ]

4 голосов
/ 01 сентября 2009

Да, производительность будет несколько ухудшаться для каждой подчиненной формы. Один или три не так уж плохо, но двадцать определенно вызовет у вас проблемы с производительностью.

После того, как подчиненная форма заработает на ваше удовлетворение, либо сохраните источник записи как запрос и присвойте ему имя, либо сохраните строку 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"
....

Теперь просто для того, чтобы я случайно не оставил заполненными некоторые источники записей подчиненной формы, замедляя приложение при запуске, я проверяю, является ли файл, в котором выполняется код, MDB (вместо MDE. Функция ниже) затем отобразите сообщение о том, что мне нужно удалить источник данных.

   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 = ""
    ....

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

Кроме того, каждое поле со списком и список также будут немного ухудшать производительность. Так что, если они есть в подчиненной форме, рассмотрите аналогичную логику.

2 голосов
/ 01 сентября 2009

Чтобы расширить ответ Рему ... вот подпункт, который я написал, который динамически загружает форму в элемент управления подчиненной формы. Вы передаете имя формы в вызове, и оно загрузит его в подчиненную форму главной формы. Аргументы сопоставляются с аргументами метода доступа Docmd.OpenForm. Если основная форма, на которой размещен элемент управления подчиненной формы, не открыта ... она просто регулярно открывает форму. В противном случае он загружает его в элемент управления подчиненной формы. Если в него передано предложение where, оно используется для фильтрации подчиненной формы.

Public Sub MyOpenForm(FormName As String, _
                            Optional View As AcFormView = acNormal, _
                            Optional FilterName As String = vbNullString, _
                            Optional WhereCondition As String = vbNullString, _
                            Optional DataMode As AcFormOpenDataMode, _
                            Optional WindowMode As AcWindowMode, _
                            Optional OpenArgs As String)

On Error GoTo PROC_ERR

Dim frm As Form
Dim strNewForm As String
Dim strCurrentForm As String
Dim strNewTable As String
Dim fDoNotFilter As Boolean
Dim strActionText As String
Dim strID As String

If Not IsLoaded("frmMain") Then
    DoCmd.OpenForm FormName:=FormName, View:=View, FilterName:=FilterName, WhereCondition:=WhereCondition, DataMode:=DataMode, WindowMode:=WindowMode, OpenArgs:=OpenArgs
Else
    strCurrentForm = Forms![frmMain]![sfrMyForm].SourceObject
    If strCurrentForm <> FormName Then
      Forms![frmMain]![sfrMyForm].SourceObject = vbNullString
      Forms![frmMain]![sfrMyForm].SourceObject = FormName
    End If
    If WhereCondition <> vbNullString Then
      Forms![frmMain]![sfrMyForm].Form.Filter = WhereCondition
      Forms![frmMain]![sfrMyForm].Form.FilterOn = True
    End If
End If


PROC_EXIT:
  Exit Sub

PROC_ERR:
  MsgBox Err.Description
  Resume PROC_EXIT

End Sub
2 голосов
/ 01 сентября 2009

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

Текст для события «При нажатии» элемента управления может быть:

=WhichPage([Form],"lblLocations")

Где WhichPage - функция со следующими строками:

Function WhichPage(frm, Optional LabelName = "")
    <..>

    Select Case LabelName

    Case "lblLocations"
        frm("sfrmAll").SourceObject = "sfrmLocations"

<...>

При необходимости дочерние и основные поля ссылок могут быть изменены во время выполнения. Во избежание ошибок в качестве основного поля ссылки лучше всего указать имя элемента управления, а не поле.

Me.sfrmAll.LinkChildFields = "LocationKey"
Me.sfrmAll.LinkMasterFields = "txtLocationKey"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...