Ms access 在MS Access中使用子窗体是否会降低性能?

Ms access 在MS Access中使用子窗体是否会降低性能?,ms-access,forms,Ms Access,Forms,我正在考虑在父窗体上使用一个选项卡控件,我希望它有大约20个选项卡。每个选项卡我都考虑使用一个或两个单独的子窗体。每个子形式在编码逻辑中都有不同的复杂性。通过采用这种方法,我会分别降低应用程序的性能吗?我目前正在MS Access 2003中使用此功能。我预计,在任何给定时间,各种表单上的平均用户数为15人 想法?是的,每个子表单的性能都会略有下降。一个或三个不是很糟糕,但是二十个肯定会导致性能问题 一旦子窗体工作正常,请将记录源另存为查询并为其命名,或者保存查询SQL字符串。然后在选项卡控件更

我正在考虑在父窗体上使用一个选项卡控件,我希望它有大约20个选项卡。每个选项卡我都考虑使用一个或两个单独的子窗体。每个子形式在编码逻辑中都有不同的复杂性。通过采用这种方法,我会分别降低应用程序的性能吗?我目前正在MS Access 2003中使用此功能。我预计,在任何给定时间,各种表单上的平均用户数为15人


想法?

是的,每个子表单的性能都会略有下降。一个或三个不是很糟糕,但是二十个肯定会导致性能问题

一旦子窗体工作正常,请将记录源另存为查询并为其命名,或者保存查询SQL字符串。然后在选项卡控件更改事件的VBA代码中粘贴查询名称或查询SQL字符串

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"
....
顺便说一句,我几乎总是把每个子窗体放在一个单独的选项卡上。而且,许多选项卡条目变得非常笨拙。当我有一个类似的问题时,我的Access MVP同事建议使用左侧的列表框来控制哪个子表单是可查看的


此外,每个组合框和列表框也会略微降低性能。所以如果你有一个子表单,那么考虑类似的逻辑。

是的,每个子表单的性能会略有下降。一个或三个不是很糟糕,但是二十个肯定会导致性能问题

一旦子窗体工作正常,请将记录源另存为查询并为其命名,或者保存查询SQL字符串。然后在选项卡控件更改事件的VBA代码中粘贴查询名称或查询SQL字符串

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"
....
顺便说一句,我几乎总是把每个子窗体放在一个单独的选项卡上。而且,许多选项卡条目变得非常笨拙。当我有一个类似的问题时,我的Access MVP同事建议使用左侧的列表框来控制哪个子表单是可查看的


此外,每个组合框和列表框也会略微降低性能。因此,如果你有一个子窗体,那么考虑类似的逻辑。

< P>除了在运行时添加记录集之外,我通常只使用一个或两个选项卡和多个控件将各种子窗体加载到子窗体控件中。

控件的单击事件的文本可能是:

=WhichPage([Form],"lblLocations")
其中,WhichPage是包含以下行的函数:

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

    Select Case LabelName

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

<...>

除了在运行时添加记录集外,我通常只使用一个或两个选项卡和多个控件将各种子窗体加载到子窗体控件中

控件的单击事件的文本可能是:

=WhichPage([Form],"lblLocations")
其中,WhichPage是包含以下行的函数:

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

    Select Case LabelName

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

<...>

为了扩展Remou的答案,我写了一个sub,它动态地将表单加载到子表单控件中。您在调用中传入表单的名称,它会将其加载到主表单的子表单中。参数映射到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
公共子MyOpenForm(FormName作为字符串_
可选视图为AcFormView=acNormal_
可选FilterName As String=vbNullString_
可选,其中条件为String=vbNullString_
可选数据模式为AcFormOpenDataMode_
可选的WindowMode作为AcWindowMode_
可选的OpenArgs(作为字符串)
关于错误转到程序错误
作为形式的Dim frm
作为字符串的Dim strNewForm
Dim strCurrentForm作为字符串
作为字符串的Dim strNewTable
Dim fDoNotFilter作为布尔值
Dim strActionText作为字符串
像细绳一样模糊的条纹
如果未加载(“frmMain”),则
DoCmd.OpenForm FormName:=FormName,View:=View,FilterName:=FilterName,WhereCondition:=WhereCondition,DataMode:=DataMode,WindowMode:=WindowMode,OpenArgs:=OpenArgs
其他的
strCurrentForm=表单![frmMain]![sfrMyForm].SourceObject
如果strcurrentformformname,则
形式![frmMain]![sfrMyForm].SourceObject=vbNullString
形式![frmMain]![sfrMyForm].SourceObject=FormName
如果结束
如果where条件为空字符串,则
形式![frmMain]![sfrMyForm].Form.Filter=WhereCondition
形式![frmMain]![sfrMyForm].Form.FilterOn=True
如果结束
如果结束
程序退出:
出口接头
过程错误:
MsgBox错误说明
恢复程序退出
端接头

在Remou的回答上展开……下面是我编写的一个sub,它动态地将表单加载到子表单控件中。您在调用中传入表单的名称,它会将其加载到主表单的子表单中。参数映射到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
公共子MyOpenForm(FormName作为字符串_
可选视图为AcFormView=acNormal_
可选FilterName As String=vbNullString_
可选,其中条件为String=vbNullString_
可选数据模式为AcFormOpenDataMode_
可选的WindowMode作为AcWindowMode_
可选的OpenArgs(作为字符串)
关于错误转到程序错误
作为形式的Dim frm
作为字符串的Dim strNewForm
Dim strCurrentForm作为字符串
作为字符串的Dim strNewTable
Dim fDoNotFilter作为布尔值
Dim strActionText作为字符串
像细绳一样模糊的条纹
如果未加载(“frmMain”),则
DoCmd.OpenForm FormName:=FormName,View:=View,FilterName:=FilterName,其中条件:=Wher