根据子表单中的选择保存报告

Save reports according to choice from a sub form

我有一个名为 (frmcarSearch) 的主窗体,它显示名为 (tblCar) 的 table 数据。

该表单包含三个下拉菜单 (cmbCarcmbTypecmbGroup),允许用户过滤数据并在名为 (frmCarSub) 并且有三个按钮可以保存过滤后的数据 btnPrint, btnPDF, btnExcel.

问题是:如何为每个按钮编写代码,使报表根据每个下拉菜单的选择显示(或保存)子窗体中的数据?


每个组合框的代码:

Private Sub cmbCar_AfterUpdate()
    Me.cmbGroup.Value = ""
    Me.cmbType.Value = ""

    Me.frmCarSub.SetFocus
    Me.frmCarSub.Form.Filter = "[CarNum]= '" & [cmbCar] & "'"
    Me.frmCarSub.Form.FilterOn = True
End Sub
Private Sub cmbType_AfterUpdate()
    Me.cmbGroup.Value = ""
    Me.cmbCar.Value = ""

    Me.frmCarSub.SetFocus
    Me.frmCarSub.Form.Filter = "[TypeName]='" & [cmbType] & "'"
    Me.frmCarSub.Form.FilterOn = True
End Sub
Private Sub cmbGroup_AfterUpdate()
    Me.cmbCar.Value = ""
    Me.cmbType.Value = ""

    Me.frmCarSub.SetFocus
    Me.frmCarSub.Form.Filter = "[CarGroupName]= '" & [cmbGroup] & "'"
    Me.frmCarSub.Form.FilterOn = True
End Sub

我将此代码用于 btnPrint 按钮

Private Sub btnPrint_Click()
    If IsNull([cmbCar]) Then
        DoCmd.OpenReport "rptCar", acViewPreview
    Else
        DoCmd.OpenReport "rptCar", acViewPreview, , "[CarNum]='" & [cmbCar] & "'"
    End If
End Sub

但是这段代码的问题是我必须为三个菜单使用三个按钮,这是不合逻辑的。

谢谢。

您可以使用表单模块定义如下函数:

Function FilterString() As String
    If Not IsNull(cmbCar) Then FilterString = " AND [CarNum]= '" & cmbCar & "'"
    If Not IsNull(cmbType) Then FilterString = FilterString & " AND [TypeName]= '" & cmbType & "'"
    If Not IsNull(cmbGroup) Then FilterString = FilterString & " AND [CarGroupName]= '" & cmbGroup & "'"

    FilterString = Mid(FilterString, 6)
End Function

然后,定义另一个函数如:

Function SetFilter()
    Me.frmCarSub.SetFocus
    Me.frmCarSub.Form.Filter = FilterString
    Me.frmCarSub.Form.FilterOn = True
End Function

然后,每个组合框的事件处理程序变为:

Private Sub cmbCar_AfterUpdate()
    SetFilter
End Sub

Private Sub cmbType_AfterUpdate()
    SetFilter
End Sub

Private Sub cmbGroup_AfterUpdate()
    SetFilter
End Sub

最后,打印按钮事件处理程序可以变成:

Private Sub btnPrint_Click()
    If FilterString = vbNullString Then
        DoCmd.OpenReport "rptCar", acViewPreview
    Else
        DoCmd.OpenReport "rptCar", acViewPreview, , FilterString
    End If
End Sub

并且用户还可以按多个字段进行筛选。