在打印上隐藏报告字段

时间:2012-07-16 18:07:01

标签: ms-access vba printing access-vba ms-access-2003

在Access 2003数据库中,我有一个通过VBA生成的员工状态/反馈报告。我在VBA中创建报表,因为所需的报表格式是这样的,我发现它更容易这样做(组合多个记录集,显示与其他记录集对齐的记录集中的多个记录,自定义一些基于格式的元素在部门等)。可能有更好的方法来创建这些报告,但这种功能很好,所以我宁愿避免重新创建。

我的问题是:由于这是一份员工反馈表,因此主管希望能够看到详细信息,但不会向员工展示。生成报告时,主管有机会从报告本身查看数据/进行更改(通过用户表单,报告上的事件处理)。部分检查是查看一组字段(作为标签添加到报告中),但在最终打印报告时应隐藏这些字段。

在我脑海中,我以为我之前已经看过以这种方式隐藏特定控件的方法,并在DisplayWhen上搜索了this MSDN resource。但是,似乎DisplayWhen仅适用于表单。有没有办法使用报告设置此值(或类似/相关选项)?在搜索SO时,我在 DisplayWhen 的查询中只找到了一个问题,这对我没用。

在创建报告报告时使用.Visible = False将无效,因为主管需要查看这些字段。我似乎没有在打印时设置此属性,因为我没有看到任何事件处理选项。我可以创建一个捕获打印命令的自定义事件处理程序吗?

这是控件创建代码:

Private Sub AddOneOnOneField(Rpt As Report, Left As Integer, Top As Integer, Width As Integer, Height As Integer, _
    Optional Cap As String = vbNullString, Optional Align As Integer = cnFontCenter, Optional Size As Integer = 10, _
    Optional Bold As Integer = cnBoldFont, Optional DisplayWhen As Byte = 0)

    With CreateReportControl(Rpt.Name, acLabel, acDetail, vbNullString, vbNullString, _
        Left, Top, Width, Height)

        .Properties("FontSize") = Size
        .Properties("FontWeight") = Bold
        .Properties("BorderStyle") = 1
        .Properties("TextAlign") = Align
        .Properties("Caption") = Cap
        .Properties("DisplayWhen") = DisplayWhen ' This does not work!
    End With

End Sub

重申我的问题:

  • 如何将某些报告字段设置为仅在打印预览中显示,而不是在打印时显示?
  • 我可以创建一个自定义事件处理程序来捕获报表中的打印命令吗?
  • 有没有办法在报表字段中设置DisplayWhen属性(或类似/相关选项)?

2 个答案:

答案 0 :(得分:1)

如果隐藏数据非常重要,那么您选择了错误的数据库,如果它有点随意,您可以要求管理员输入代码并根据代码隐藏或显示字段。或者,您可以为管理员提供稍微不同的前端。

答案 1 :(得分:0)

这不太理想,但它确实有效。通过VBA创建报表时,我已经有了在报表模块中创建代码的代码。我添加到该功能以捕获字段的打印/强制隐藏,打印,然后取消隐藏。

Private Sub AddReportCode(mdlNew As Module)
Dim sNewCode As String

    sNewCode = "Option Compare Database" & vbCr & "Option Explicit"
    sNewCode = sNewCode & vbCr
    sNewCode = sNewCode & vbCr & "Public Sub CapturePrint()"
    sNewCode = sNewCode & vbCr & "Dim v As Variant"
    sNewCode = sNewCode & vbCr & "If Application.CurrentObjectName = ""OneOnOneReport"" And Application.CurrentObjectType = acReport Then"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewDesign"
    sNewCode = sNewCode & vbCr & "Reports(""OneOnOneReport"").Visible = False"
    sNewCode = sNewCode & vbCr & "For Each v In Reports(""OneOnOneReport"").Controls"
    sNewCode = sNewCode & vbCr & "If Left(v.Properties(""Name""), 3) = ""Occ"" Then"
    sNewCode = sNewCode & vbCr & "v.Visible = False"
    sNewCode = sNewCode & vbCr & "End If"
    sNewCode = sNewCode & vbCr & "Next v"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acNormal"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewDesign"
    sNewCode = sNewCode & vbCr & "For Each v In Reports(""OneOnOneReport"").Controls"
    sNewCode = sNewCode & vbCr & "If Left(v.Properties(""Name""), 4) = ""HIDE"" Then"
    sNewCode = sNewCode & vbCr & "v.Visible = True"
    sNewCode = sNewCode & vbCr & "End If"
    sNewCode = sNewCode & vbCr & "Next v"
    sNewCode = sNewCode & vbCr & "Reports(""OneOnOneReport"").Visible = True"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewPreview"
    sNewCode = sNewCode & vbCr & "End If"
    sNewCode = sNewCode & vbCr & "End Sub"

    mdlNew.DeleteLines 1, mdlNew.CountOfLines

    mdlNew.InsertText sNewCode

End Sub

为了便于阅读,这是运行后模块中的实际代码:

Option Compare Database
Option Explicit

Public Sub CapturePrint()
Dim v As Variant
If Application.CurrentObjectName = "OneOnOneReport" And Application.CurrentObjectType = acReport Then
    DoCmd.OpenReport "OneOnOneReport", acViewDesign
    Reports("OneOnOneReport").Visible = False
    For Each v In Reports("OneOnOneReport").Controls
        If Left(v.Properties("Name"), 3) = "Occ" Then
            v.Visible = False
        End If
    Next v
    DoCmd.OpenReport "OneOnOneReport", acNormal
    DoCmd.OpenReport "OneOnOneReport", acViewDesign
    For Each v In Reports("OneOnOneReport").Controls
        If Left(v.Properties("Name"), 4) = "HIDE" Then
            v.Visible = True
        End If
    Next v
    Reports("OneOnOneReport").Visible = True
    DoCmd.OpenReport "OneOnOneReport", acViewPreview
End If
End Sub

向报表添加新控件时(请参阅问题正文中的原始代码),我添加了为控件指定名称的功能:

.Properties("Name") = NewName

使用NewName "HIDE" & ControlTop & ControlLeft参数调用控件创建代码,以便在不重复名称的情况下命名所有需要的控件。隐藏之前,报告在设计模式下打开,以防止屏幕闪烁/减速。然后打印代码循环浏览报告中的所有控件,查找以“HIDE”开头的名称并隐藏它们。隐藏所有控件后,报告将正常重新打开以进行打印,然后重复此过程以取消隐藏这些控件并将原始报告显示给用户。

我仍然无法正确捕获print事件(这是解决方案不是我最喜欢的选项),所以我提示用户在初始创建报告时打印,调用新创建的CapturePrint Sub(隐藏这些字段时)。如果他们选择不这样做,那么他们可以正常打印而不隐藏字段,或者重新生成报告以隐藏它们/再次提示。